在xslt 1.0/xpath 1.0中,不使用任何外部库/节点设置扩展名,我需要能够将特定项目的项目的成本值(对于个人份额)总和类型。例如,在下面的示例XML中,我如何将"框"类型的成本和"安德鲁"类型总结?此的预期输出为" 1500"(0.5*1000 1*1000)。
`<items>
<item>
<type>Box</type>
<cost>1000.00</cost>
<share>
<person>
<name>Jim</name>
<percent>50</percent>
</person>
<person>
<name>Andrew</name>
<percent>50</percent>
</person>
</share>
</item>
<item>
<type>Box</type>
<cost>1000.00</cost>
<share>
<person>
<name>Andrew</name>
<percent>100</percent>
</person>
</share>
</item>
<item>
<type>Car</type>
<cost>2000.00</cost>
<share>
<person>
<name>Andrew</name>
<percent>100</percent>
</person>
</share>
</item>
<item>
<type>Box</type>
<cost>2000.00</cost>
<share>
<person>
<name>Jim</name>
<percent>100</percent>
</person>
</share>
</item>
</items>`
在XSLT中,我可以有一个for-EAK循环:
`<xsl:for-each select="/items/item[type='Box' and share/person/name='Andrew']">
<xsl:value-of select="share/person[name='Andrew']/percent div 100) * cost"/>
</xsl:for-each>`
,但这不会总结总数。我认为不能使用sum(),因为它需要按每个特定项目的金额多倍份额。由于XSLT限制,我不知道如何将其存储在带有for-EAPH内部的变量中。我认为递归可能可以使用,但我不确定如何使用。
哪个XSL扩展,您可以这样做:
<!-- first, store all the computed values to be summed up in a variable -->
<xsl:variable name="vals">
<xsl:for-each select="/items/item[type/text() ='Box' and share/person/name/text() = 'Andrew']">
<val><xsl:value-of select="(cost * share/person[name/text() = 'Andrew']/percent) div 100"/></val>
</xsl:for-each>
</xsl:variable>
<!-- Get the sum of all the values -->
<xsl:value-of select="sum(exsl:node-set($vals)/*)" />
您还需要在样式表的根元素上添加以下声明:xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"