使用sum()对嵌套的foreach()求和

时间:2019-06-11 16:38:02

标签: xslt xslt-2.0

我需要帮助来正确指定sum()的输入参数。我遇到了sum()的输出来连接值而不是求和。

我的目标是:当 Column2 为“ 发票”时,汇总 Column6 的值 在下面的示例中,我对列为“发票”的列6具有 2000 1000 。 我希望它为<TotalAmount>

显示3000
<Root>
<DataArea>
    <Row>... </Row>
    <Row>... </Row>
    <!-- and so on -->
    <Row>
        <Column1>29/03/19</Column1>
        <Column2>cr note</Column2>
        <Column3>092-213280101</Column3>
        <Column4>1,474.98 </Column4>
        <Column5>103.25 </Column5>
        <Column6>2000 </Column6>
    </Row>
    <Row>
        <Column1>29/03/19</Column1>
        <Column2>invoice</Column2>
        <Column3>092-213280101</Column3>
        <Column4>1,474.98 </Column4>
        <Column5>103.25 </Column5>
        <Column6>2000 </Column6>
    </Row>
    <Row>
        <Column1>11/06/19</Column1>
        <Column2>invoice</Column2>
        <Column3>123-123456789</Column3>
        <Column4>100.50 </Column4>
        <Column5>100.50 </Column5>
        <Column6>1000</Column6>
    </Row>
</DataArea>
</Root>

<xsl:for-each
    select="Root/DataArea/Row">
    <xsl:if ... >
        <TransactionSummary>
            <DebitSummary>
                <TotalAmount>
                <xsl:attribute name="currencyID"></xsl:attribute>
                <xsl:for-each select="../Row">
                    <xsl:if test="(Column2 = 'invoice') and (position() > 9) ">    
                        <xsl:value-of select="sum(../Column6)" />
                    </xsl:if>
                </xsl:for-each>
                </TotalAmount>
            </DebitSummary>
        </TransactionSummary>
    </xsl:if>
</xsl:for-each>

我尝试了sum(Column6),但是没有用。 Output: 20001000

我尝试了sum(../Column6),但是没有用。 Output: 00

我尝试了sum(../Row/Column6),但是没有用。 Output: Cannot convert string "" to a double

我尝试了sum(Root/DataArea/Row/Column6),但是没有用。 Output: 00

我将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:1)

这里不需要内部xsl:for-each,您可以使用单个xsl:value-of并根据选择条件进行操作

<xsl:value-of select="sum(../Row[Column2 = 'invoice' and position() > 9]/Column6)" />

或者,在您的摘录中。...

<xsl:for-each select="Root/DataArea/Row">
  <TransactionSummary>
    <DebitSummary>
      <TotalAmount currencyID="">
        <xsl:value-of select="sum(../Row[Column2 = 'invoice' and position() > 9]/Column6)" />
      </TotalAmount>
    </DebitSummary>
  </TransactionSummary>
</xsl:for-each>

答案 1 :(得分:0)

似乎您想要这样的东西

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
        <TransactionSummary>
            <DebitSummary>
                <TotalAmount currencyID="someId">
                   <xsl:value-of select="sum(/*/*/Row[Column2 = 'invoice']/Column6)"/>
                </TotalAmount>
            </DebitSummary>
         </TransactionSummary>
   </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档

<Root>
<DataArea>
    <Row>... </Row>
    <Row>... </Row>
    <!-- and so on -->
    <Row>
        <Column1>29/03/19</Column1>
        <Column2>cr note</Column2>
        <Column3>092-213280101</Column3>
        <Column4>1,474.98 </Column4>
        <Column5>103.25 </Column5>
        <Column6>2000 </Column6>
    </Row>
    <Row>
        <Column1>29/03/19</Column1>
        <Column2>invoice</Column2>
        <Column3>092-213280101</Column3>
        <Column4>1,474.98 </Column4>
        <Column5>103.25 </Column5>
        <Column6>2000 </Column6>
    </Row>
    <Row>
        <Column1>11/06/19</Column1>
        <Column2>invoice</Column2>
        <Column3>123-123456789</Column3>
        <Column4>100.50 </Column4>
        <Column5>100.50 </Column5>
        <Column6>1000</Column6>
    </Row>
</DataArea>
</Root>

产生了想要的结果

<TransactionSummary>
   <DebitSummary>
      <TotalAmount currencyID="someId">3000</TotalAmount>
   </DebitSummary>
</TransactionSummary>