在 XSLT 中按 ID 和总金额分组
Group by ID and Sum Amount in XSLT
我对 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
如果能帮助我入门,那就太棒了!
这里是使用 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="'
'"/>
</xsl:for-each>
</xsl:template>
我对 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
如果能帮助我入门,那就太棒了!
这里是使用 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="'
'"/>
</xsl:for-each>
</xsl:template>