2016-09-16 45 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算什麼。