在XSLT 1.0 / XPATH 1.0中,不使用任何外部库/节点集扩展,我需要能够对特定项目类型的项目(对于个人的共享)的成本值求和。例如,在下面的示例XML中,如何将“Box”类型和“Andrew”类型的成本相加?预期的输出为'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-each循环:
`<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-each循环的变量中。我认为递归可能会被使用,但我不确定如何。
答案 0 :(得分:0)
你可以这样做XSL extensions:
<!-- 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"