首页 > 解决方案 > 在 XSLT 中按总和分组

问题描述

假设我们有如下数据:

<ROW>
  <CAT_CODE>3 COE</CAT_CODE>
  <ACCT_2>4400</ACCT_2>
  <ACCT2_DESC>Employee Costs</ACCT2_DESC>
  <ACCT_3>4490</ACCT_3>
  <ACCT3_DESC>Salaries</ACCT3_DESC>
  <ACTUAL>55.30</ACTUAL>
</ROW>

我们希望按“ACCT_2”和 CAT_CODE='3 COE' 对所有内容进行分组,并创建如下表:

+-----------------+----------+--------+
| Account Level 2 | Category | Actual |
+-----------------+----------+--------+
| 4400            | 3 COE    | 4,609  |
+-----------------+----------+--------+
| 4500            | 3 COE    | 9,870  |
+-----------------+----------+--------+
| 4600            | 3 COE    | 1,343  |
+-----------------+----------+--------+
 . . . 
+-----------------+----------+--------+
| Total:          |          | 23,998 |
+-----------------+----------+--------+

这样的事情怎么可能实现?我们有以下代码:

   <table>
     <tr>
       <td>Account Level 2</td>
       <td>Category</td>
       <td>Actual</td>
     </tr>
     <xsl:for-each-group select="ROW[CAT_CODE='3 COE']" group-by="ACCT_3">
       <tr>
         <td><xsl:value-of select="ACCT_3"/></td>
         <td><xsl:value-of select="CAT_CODE"/></td>
         <td><xsl:value-of select="format-number(sum(ACTUAL), '#,###')"/></td>
       </tr>
     </xsl:for-each-group>
     <tr>
       <td>Total: </td>
       <td></td>
       <td><xsl:value-of select="format-number(sum(ROW[CAT_CODE='3 COE']/ACTUAL), '###,###')"/></td>
     </tr>
   </table>

但看起来我们遗漏了一些值。我们最终得到了一个正确的 Total 行,但是我们上面的行并不等于总数。

注意:请原谅我的无知,因为我对 XML/XSL 很陌生。我今天才开始学习它。

标签: htmlxmlxsltxslt-2.0

解决方案


您的求和表达式应该是:

<xsl:value-of select="format-number(sum(current-group()/ACTUAL), '#,###')"/>

为了对当前组的所有成员求和。您现有的代码只是对上下文节点的 ACTUAL 子元素求和 - 对于每个组来说,它是组的第一个成员。


推荐阅读