求和for-each循环返回的xpaths的值

时间:2017-09-25 07:24:25

标签: xslt xslt-1.0

在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循环的变量中。我认为递归可能会被使用,但我不确定如何。

1 个答案:

答案 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"