我有一个处理大型数据集的xslt,并根据数据集中包含的ID对结果进行分组。在xsl:for-each-group循环中,我有一个if语句,它打印出与if语句中的条件匹配的每个组的数据行。我被要求在文件中添加一个计数器,以显示写入输出文件的数据线的数量,我一直在磨齿,还没有找到答案。我觉得它正好坐在我面前,我想我会试着在这里问。在此先感谢任何帮助。
以下是我的小组和if语句
<xsl:variable name="ACCOUNTED_DEBIT_AMT">
<xsl:sequence select="format-number(sum(current-group()/../wd:ACCOUNTED_DEBIT_AMT), '#.00')"/>
</xsl:variable>
<xsl:if test="$ACCOUNTED_DEBIT_AMT != '.00'">
答案 0 :(得分:0)
由于您未能包含源XML,我的解决方案基于以下示例:
<?xml version="1.0" encoding="UTF-8"?>
<items>
<item ID="1">
<ACCOUNTED_DEBIT_AMT>5.10</ACCOUNTED_DEBIT_AMT>
</item>
<item ID="1">
<ACCOUNTED_DEBIT_AMT>5.20</ACCOUNTED_DEBIT_AMT>
</item>
<item ID="1">
<ACCOUNTED_DEBIT_AMT>5.30</ACCOUNTED_DEBIT_AMT>
</item>
<item ID="2">
<ACCOUNTED_DEBIT_AMT>5.20</ACCOUNTED_DEBIT_AMT>
</item>
<item ID="2">
<ACCOUNTED_DEBIT_AMT>5.30</ACCOUNTED_DEBIT_AMT>
</item>
</items>
对当前节点(例如ACCOUNTED_DEBIT_AMT
)的值求和
小组,你应该写:
<xsl:variable name="amount"
select="sum(current-group()/ACCOUNTED_DEBIT_AMT)"/>
您的解决方案在..
之后包含current-group()
,这可能是错误的。
使用..
你是&#34;跳出&#34;当前组到父节点的
您想要总结ACCOUNTED_DEBIT_AMT
个节点 - 指导孩子
这个父母?
另请注意,到目前为止我没有使用format-number
,因为它(IMHO)更清晰
用于比较总和而不是其格式化表示。
format-number
函数来格式化输出值。
下面是上述源XML的工作解决方案。
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="items">
<xsl:copy>
<xsl:for-each-group select="item" group-by="@ID">
<group>
<xsl:attribute name="ID" select="current-grouping-key()"/>
<xsl:variable name="amount"
select="sum(current-group()/ACCOUNTED_DEBIT_AMT)"/>
<amount>
<xsl:if test="$amount > 0">
<xsl:value-of select="format-number($amount, '0.00')"/>
</xsl:if>
<xsl:if test="$amount = 0">
<xsl:text>None</xsl:text>
</xsl:if>
</amount>
</group>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:transform>
还有一句话:实际上,目前尚不清楚是否要总结 某事(当前组中的节点的值,正如您在中写的那样) 您的示例)或当前组中包含的计数项 (正如你在标题中写的那样)。
在后一种情况下使用<xsl:value-of select="count(current-group())"/>
在for-each-group
循环中。
或者您可能想要计算当前组中符合某些条件的项目, 例如金额&gt; 5 ?在这种情况下写:
<xsl:value-of select="count(current-group()/.[ACCOUNTED_DEBIT_AMT > 5])"/>