更改模板,以便XSLT输出总和而不是值列表

时间:2014-06-05 16:16:00

标签: xslt xslt-1.0

我有一个正常运行的XSLT模板。

  <xsl:template match="Row[contains(BenefitType, 'MyBenefit')]">
    <value>
      <xsl:value-of select="BenefitList/Row/Premium* 12" />
    </value>
  </xsl:template>

输出

<value>100</value>
<value>110</value>

我更喜欢的是它是否只输出220。所以,基本上在模板中我需要使用某种变量或循环来执行此操作然后输出最终的求和值?

需要符合XSLT 1标准。

模板的使用方法如下:

<xsl:apply-templates select="Root/Row[contains(BenefitType, 'MyBenefit')]" />

出于某种原因,当我在这里使用contains时,它只对第一个匹配的结构进行求和,而不是全部匹配。如果父级的XML值不依赖于具有与特定值匹配的兄弟元素,那么总和&#39;方法会奏效。

1 个答案:

答案 0 :(得分:1)

评论中已经提到了问题的直接解决方案,但假设你真的想对某些变量做同样的事情,这对你来说可能很有意思:

XML:

<Root>
    <Row>
        <BenefitType>MyBenefit</BenefitType>
        <BenefitList>
            <Premium>100</Premium>
        </BenefitList>
    </Row>
    <Row>
        <BenefitType>MyBenefit, OtherBenefit</BenefitType>
        <BenefitList>
            <Premium>100</Premium>
        </BenefitList>
    </Row>
    <Row>
        <BenefitType>OtherBenefit</BenefitType>
        <BenefitList>
            <Premium>1000</Premium>
        </BenefitList>
    </Row>
    <Row>
        <BenefitType>OtherBenefit</BenefitType>
        <BenefitList>
            <Premium>1000</Premium>
        </BenefitList>
    </Row>
</Root>

XSLT:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:exsl="http://exslt.org/common"
                exclude-result-prefixes="exsl">

    <xsl:template match="/">
        <total>
            <xsl:variable name="valuesXml">
                <values>
                    <xsl:apply-templates select="Root/Row[contains(BenefitType, 'MyBenefit')]" />
                </values>
            </xsl:variable>
            <xsl:variable name="values" select="exsl:node-set($valuesXml)/values/value" />

            <xsl:value-of select="sum($values)" />
        </total>
    </xsl:template>

    <xsl:template match="Row[contains(BenefitType, 'MyBenefit')]">
        <value>
            <xsl:value-of select="BenefitList/Premium * 12" />
        </value>
    </xsl:template>

</xsl:stylesheet>

此处,您问题中生成的相同结果集将保存在另一个变量中,然后可以再次处理该变量。