XSLT函数sum()不计算节点

时间:2013-06-04 20:14:19

标签: xslt xslt-2.0 xslt-grouping

感谢大家花时间查看我的问题。

当节点值不同时,我无法对节点求和,但如果它是相同的则可以工作。

这是我的XML -

<statement>
    <agency>
        <employerShareAmt>75.00</employerShareAmt>
    </agency>
    <agency>
        <employerShareAmt>76.00</employerShareAmt>        
    </agency>
</statement>

这是我的XSLT -

<xsl:template match="/">
    <root>
        <xsl:call-template name="shopData"/>
    </root>
</xsl:template>

<xsl:template name="shopData">
    <RESULT>
        <xsl:call-template name="sum"/>
    </RESULT>
</xsl:template>

<xsl:template match="node()|@*" name="sum">
    <xsl:apply-templates select="node()|@*"/>
</xsl:template>

<xsl:template match="statement">
  <agency>
    <xsl:for-each-group select="agency" 
                        group-by="employerShareAmt">
      <employerShareAmt>
        <xsl:value-of 
          select="sum(current-group()/employerShareAmt)"/>
      </employerShareAmt>
    </xsl:for-each-group>
  </agency>
</xsl:template>

结果是75 76.但如果两者都是75,结果将是150。

我似乎是按值分组然后添加它们。如何让它按节点分组,以便上面的XML结果为151?

1 个答案:

答案 0 :(得分:0)

您感觉样式表处理器按价值对代理商进行分组,然后将其employeesShareAmt元素汇总。你是对的。它是这样做的,因为你要求它这样做:这就是group-by="employerShareAmt"所做的。

你要找的是什么?当前语句元素中所有employerShareAmt元素的总和?

<xsl:template match="statement">
  <agency>
    <employerShareAmt>
      <xsl:value-of select="sum(agency/employerShareAmt)"/>
    </employerShareAmt>
  </agency>
</xsl:template>

特定代理商内所有employeesShareAmt元素的总和?对于您显示的输入,身份转换将做得非常好;否则

<xsl:template match="agency">
  <agency>
    <employerShareAmt>
      <xsl:value-of select="sum(EmployerShareAmt)"/>
    <employerShareAmt>
  </agency>
</xsl:template>

具有相同代理商ID或名称的某些代理商组织的所有employeesShareAmt元素的总和或您未显示的其他某些属性的相等性?保留类似于您当前结构的东西,但是在代理商的正确财产上进行分组,而不是使用employerShareAmt的值。