将XSLT求和连接或求和

时间:2014-06-04 21:17:34

标签: xslt xslt-1.0

以下是一些XSLT代码的片段。

输出连接的结果而不是summed。例如,它会找到以下匹配项:100200,并输出12002400。其中100 * 12200 * 12连接在一起。我需要XMLField1中的输出为3600

有人能指出我正确的方向并帮助解释我们做错了什么吗?我不是XSLT专家。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="Root">
    <XMLField1>
      <xsl:apply-templates
        select="Row[contains(BenefitType, 'MyBenefit')]" />
    </XMLField1>


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

我正在寻找符合 XSLT 1.0 标准的解决方案。

1 个答案:

答案 0 :(得分:2)

您的第二个模板是单独执行计算,但您没有使用它进行任何操作。如果您只想要包含Premium的行中所有MyBenefit个节点的总和,则不需要第二个模板

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

这会产生:

<XMLField1>3600</XMLField1>

更新:

您没有发布源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>
    <Row>
        <BenefitType>MyBenefitSpecial</BenefitType>
        <BenefitList>
            <Premium>100</Premium>
        </BenefitList>
    </Row>
</Root>

由于您使用的是contains(),因此请务必注意它将匹配包含 MyBenefit的字符串(包括MyBenefit, OtherBenefitMyBenefitSpecial

以下是在线工作示例:http://xsltransform.net/bFukv8t/1


如果您创建了第二个模板,因为您希望每行有单独的结果,那么您只需在模板中添加一些内容即可。标签可能是:

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

这将产生我上面提供的样本输入:

<XMLField1>
    <subtotal>1200</subtotal>
    <subtotal>1200</subtotal>
    <subtotal>1200</subtotal>
</XMLField1>

如果您更改其他模板,则可以同时获得总和和此结果:

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

现在你会得到:

<XMLField1>
   <total>3600</total>
   <subtotal>1200</subtotal>
   <subtotal>1200</subtotal>
   <subtotal>1200</subtotal>
</XMLField1>

希望您可以将这些示例应用于您的实际案例场景并获得您期望的结果。