基于存储在另一个元素中的键选择XML元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于存储在另一个元素中的键选择XML元素相关的知识,希望对你有一定的参考价值。
不熟悉xsl,所以我很抱歉这是一个常见问题-
我有一些看起来像这样的xml(示例已简化,但这是我用来弄乱的东西:):
<root>
<items>
<item>
<value>1</value>
<id>1</id>
</item>
<item>
<value>2</value>
<id>2</id>
</item>
<item>
<value>99</value>
<id>3</id>
</item>
</items>
<itemList>
<id>1</id>
<id>2</id>
</itemList>
</root>
我的用例是这样的:我需要从项目列表中删除ID,然后使用这些ID来识别“项目”中的项目。然后,我需要获取项目的值并通过聚合传递任意数量的值,以获得我需要的最终结果(“ sumItems”是我实现的更复杂的递归模板的替代品)。这是我到目前为止使用的xsl,我正在尝试优化顶部的with-param select属性:
<xsl:template match="*">
<xsl:call-template name="sumItems">
<xsl:with-param name="nodeSet" select="//item/id[text()=1 or text()=2]/.." />
</xsl:call-template>
</xsl:template>
<xsl:template name="sumItems">
<xsl:param name="nodeSet" />
<xsl:param name="tempSum" select="0" />
<xsl:choose>
<xsl:when test="not($nodeSet)">
<xsl:value-of select="$tempSum" />
</xsl:when>
<xsl:otherwise>
<xsl:variable name="value" select="$nodeSet[1]/value" />
<xsl:call-template name="sumItems">
<xsl:with-param name="nodeSet" select="$nodeSet[position() > 1]" />
<xsl:with-param name="tempSum" select="$tempSum + $value" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
我是否有可能通过选择中包含某种子查询来执行类似的操作?
select="//item/id[text()=(//itemList/id)]/.."
如果相关,我正在从.Net XslCompiledTransform运行它。
答案
我不知道这是否会让我变得更聪明或更笨拙,但是当我将其扔到xsl中时,我在问题底部发来的暗中猜测实际上似乎有效。甚至没有语法错误。很抱歉给您带来麻烦-这是工作代码:
另一答案
[使用用<xsl:key name="item-by-id" match="items/item" use="id"/>
声明的键,然后您可以使用key('item-by-id', //itemList/id)
选择item
元素引用的itemList/id
元素,并使用sum(key('item-by-id', //itemList/id)/value)
计算value
元素的总和。
以上是关于基于存储在另一个元素中的键选择XML元素的主要内容,如果未能解决你的问题,请参考以下文章
通过 C++ 中的外部函数更改存储在另一个对象的向量中的对象中元素的值