XSLT:获取for-each循环的计数总和

时间:2016-09-16 17:28:32

标签: xml xslt foreach jdeveloper

我有一个XSLT程序,我试图从for-each循环中获取计数的总和。但它只返回最后一个循环总和。请在下面找到部分XSLT

<xsl:for-each select = "/PURCHASE_ORDER_DISPATCH/MsgData/Transaction/PO_POD_HDR_EVW1/PO_ID">
    <xsl:variable name = "N1Count" select = "count(..)"/>
    <xsl:variable name = "PO1Count" select = "count(../PO_POD_LN_EVW1)"/>

    <xsl:variable name = "TotalSeg">
        <xsl:value-of select = "normalize-space((2 * $N1Count) + $PO1Count)" 
                                xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"/>
    </xsl:variable>

    <EDI_TXN_850P.VERSION_1:EDI_FLD_96>
        <xsl:value-of select="normalize-space($TotalSeg + 5.0)"/>
    </EDI_TXN_850P.VERSION_1:EDI_FLD_96>
</xsl:for-each>

在上面的for-each循环基本上,我得到了N1和PO1的计数,然后经过一些计算,试图将((2 * $ N1Count)+ $ PO1Count)分配给$ TotalSeg变量。问题是它只获得最新/最近的大多数循环。

例如,如果我有两个循环通过,让我们说$ N1Count = 2,$ PO1Count = 3在第一个循环中,$ N1Count = 2,$ PO1Count = 5秒,$ TotalSeg仅被分配( (2 * 2)+ 5)= 9(第二循环值)而不是((2 * 4)+ 8)= 16(所有值的总和)。

如何使用XSLT实现此目的。

由于

2 个答案:

答案 0 :(得分:1)

您不想在循环中使用count()。它已经计算了树片段中的所有实例,因此您可以在没有循环的情况下完成:

<xsl:variable name = "TotalSeg">
    <xsl:value-of select = 
       "normalize-space((2 * 
        count(/PURCHASE_ORDER_DISPATCH/MsgData/Transaction/PO_POD_HDR_EVW1)) + 
        count(/PURCHASE_ORDER_DISPATCH/MsgData/Transaction/PO_POD_HDR_EVW1/PO_POD_LN_EVW1))
       "
    />
</xsl:variable>

<EDI_TXN_850P.VERSION_1:EDI_FLD_96>
    <xsl:value-of select="normalize-space($TotalSeg + 5.0)"/>
</EDI_TXN_850P.VERSION_1:EDI_FLD_96>

答案 1 :(得分:0)

首先,count(..)总是返回1,因为您选择的节点总是有一个父节点。

其次,这是一种函数式语言,因此在循环时不能递增值。如果你不明白,那就做一些阅读。

你想要一个在for-each循环之外的表达式,比如

select="2*count(XXXX) + count(/PURCHASE_ORDER_DISPATCH/MsgData/Transaction/PO_POD_HDR_EVW1/PO_POD_LN_EVW1)"

但我不知道你打算用XXXX算什么。