XSLT - 寻找计算结果数量的方法在xsl:for-each-group循环内匹配If语句

时间:2017-04-21 15:50:19

标签: xml xslt

我有一个处理大型数据集的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'">

1 个答案:

答案 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 &gt; 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 &gt; 5])"/>