XSLT:从 for-each 循环中获取计数总和
XSLT: Get sum of count from for-each loop
我有一个 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 变量。问题是它只得到 latest/recent 最循环。
例如,如果我有两个循环要经过,假设在第一个循环中 $N1Count = 2, $PO1Count = 3,在第二个循环中 $N1Count = 2, $PO1Count = 5,$TotalSeg 将被分配只有 ((2 * 2) + 5) = 9(第二个循环值)而不是 ((2 * 4) + 8 ) = 16(所有值的总和)。
如何使用 XSLT 实现这一点。
谢谢
首先,count(..) 总是会 return 1,因为你选择的节点总是有一个父节点。
其次,这是一种函数式语言,因此您不能在循环中增加值。如果您不明白,请阅读一些内容。
你想要在 for-each 循环之外的表达式,类似于
select="2*count(XXXX) + count(/PURCHASE_ORDER_DISPATCH/MsgData/Transaction/PO_POD_HDR_EVW1/PO_POD_LN_EVW1)"
但我不知道你打算用 XXXX 算什么。
您不想在循环中使用 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>
我有一个 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 变量。问题是它只得到 latest/recent 最循环。
例如,如果我有两个循环要经过,假设在第一个循环中 $N1Count = 2, $PO1Count = 3,在第二个循环中 $N1Count = 2, $PO1Count = 5,$TotalSeg 将被分配只有 ((2 * 2) + 5) = 9(第二个循环值)而不是 ((2 * 4) + 8 ) = 16(所有值的总和)。
如何使用 XSLT 实现这一点。
谢谢
首先,count(..) 总是会 return 1,因为你选择的节点总是有一个父节点。
其次,这是一种函数式语言,因此您不能在循环中增加值。如果您不明白,请阅读一些内容。
你想要在 for-each 循环之外的表达式,类似于
select="2*count(XXXX) + count(/PURCHASE_ORDER_DISPATCH/MsgData/Transaction/PO_POD_HDR_EVW1/PO_POD_LN_EVW1)"
但我不知道你打算用 XXXX 算什么。
您不想在循环中使用 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>