按XSLT中的ID和总金额分组

时间:2017-03-07 14:27:37

标签: sum xslt-1.0 grouping xslt-grouping

我对XSLT很新,并且遇到了当前的问题。我已经在Stackflow中完成了一些搜索(看起来像Muenchian方法是常见的组方法),但我似乎无法模仿一些已发布的想法。

所以我使用了一个行项目读取系统,我试图在XSLT中编写代码来读取每一行以检查供应商ID是否相同,如果是真的,它会将其汇总到一行,然后加上金额。如果不是这样,它应该开始一个带有ID的新行,并将金额加起来等等。我使用的是xml version =' 1.0'

以下是我目前的XML数据文件:

<data>
<row>
    <column1>06-11111</column1>
    <column2>CP</column2>
    <column3>744.04</column3>
    <column4>CAD</column4>
</row>
<row>
    <column1>06-11111</column1>
    <column2>CP</column2>
    <column3>105.09</column3>
    <column4>CAD</column4>
</row>
<row>
    <column1>06-11111</column1>
    <column2>CP</column2>
    <column3>1366.24</column3>
    <column4>CAD</column4>
</row>
<row>
    <column1>06-11111</column1>
    <column2>CP</column2>
    <column3>485.71</column3>
    <column4>CAD</column4>
</row>
<row>
    <column1>06-11112</column1>
    <column2>Ever</column2>
    <column3>459.60</column3>
    <column4>CAD</column4>
</row>
<row>
    <column1>06-11112</column1>
    <column2>Ever</column2>
    <column3>409.14</column3>
    <column4>CAD</column4>
</row>
<row>
    <column1>06-11112</column1>
    <column2>Ever</column2>
    <column3>397.12</column3>
    <column4>CAD</column4>
</row>
<row>
    <column1>06-11113</column1>
    <column2>GE</column2>
    <column3>1425</column3>
    <column4>CAD</column4>
</row>
<row>
    <column1>06-11114</column1>
    <column2>Husky</column2>
    <column3>-215.14</column3>
    <column4>USD</column4>
</row>
<row>
    <column1>06-11114</column1>
    <column2>Husky</column2>
    <column3>2015</column3>
    <column4>USD</column4>
</row>
<row>
    <column1>06-11114</column1>
    <column2>Husky</column2>
    <column3>11195.34</column3>
    <column4>USD</column4>
</row>
</data>

运行XSLT后我希望实现的输出是

06-11111 | CP | 2701.08

06-11112 |永远| 1265.86

06-11113 | GE | 1425

06-11114 |赫斯基| 12995.20

让我入门的任何帮助都会非常棒!

1 个答案:

答案 0 :(得分:0)

这是使用Muenchian方法的分组。我将让您根据小数点数正确设置数字格式。 我通常不会使用它,因为它有限,棘手且无法推动编程。但是,它今天对你有用。

<xsl:template match="@* | node()">
  <xsl:apply-templates select="@* | node()"/>
</xsl:template>

<xsl:key name="rows" match="row" use="concat(column1, '||', column2)" />

<xsl:template match="data">
  <xsl:for-each select="row[generate-id(.) = generate-id(key('rows', concat(column1, '||', column2))[1])]">
    <xsl:sort select="column1" data-type="text" order="ascending"/>
    <xsl:sort select="column2" data-type="text" order="ascending"/>

    <xsl:value-of select="concat(column1,'|',column2,'|')"/>

    <xsl:variable name="mySum">
      <xsl:value-of select="sum(key('rows', concat(column1, '||', column2))/column3)"/>
    </xsl:variable>

    <xsl:value-of select="format-number($mySum,'#,##0.00')"/>

    <xsl:value-of select="'&#xD;&#xA;'"/>
  </xsl:for-each>
</xsl:template>