2016-09-16 79 views
0

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

<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> 

在为N1和PO1上述for-each循环基本上,我得到计数​​,然后进行一些计算后,试图分配((2 * $ N1Count) + $ PO1Count)到$ TotalSeg变量。问题在于它只获取最新/最近的大部分循环。例如,如果我有两个循环可以通过,比如说第一个循环中的$ N1Count = 2,$ PO1Count = 3,$ N1Count = 2,$ PO1Count = 5秒,那么$ TotalSeg只会被赋值((2 * 2)+5)= 9(第二循环值)而不是((2 * 4)+8)= 16(所有值的总和)。

我如何使用XSLT做到这一点。

感谢

+0

请显示您的XML输入示例。一般来说,您可以直接从它们的父/祖先中总结/计算节点,而不需要xsl:for-each。 –

+0

为什么计数(..)会返回除1以外的任何东西? –

回答

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> 
0

首先,计数(..)总是会返回1,因为你选择的节点总是有一个父。其次,这是一种功能性语言,所以在循环时不能递增值。如果你不明白,那么做一些阅读。

你要像

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

的for-each循环的东西之外的表情,但我不知道你打算与XXXX算什么。