如何使用XSLT 1.0基于另一列唯一值对指定列求和
问题:基于第三列唯一值对第四列求和(XSLT 1.0)
原始XML数据
<RawData> <row> <column>CENTERS 1</column> <column>41</column> <column>1</column> <column>10</column> </row> <row> <column>CENTERS 2</column> <column>42</column> <column>2</column> <column>10</column> </row> <row> <column>CENTERS 3</column> <column>43</column> <column>1</column> <column>10</column> </row> <row> <column>CENTERS 4</column> <column>44</column> <column>3</column> <column>10</column> </row> <row> <column>CENTERS 5</column> <column>45</column> <column>1</column> <column>10</column> </row> <row> <column>CENTERS 6</column> <column>46</column> <column>4</column> <column>10</column> </row> </RawData>
需求说明
需要基于每行的第三列(<column>节点的第三个值)的唯一值,对第四列的数值求和——即同一个第三列值只对应累加一次第四列的数值。当前使用的XSLT会累加所有行的第四列值,得到输出:
Final Count: 6, Sum: 60
但预期输出应为:
Final Count: 6, Sum: 40
(第三列唯一值为1、2、3、4,对应4个10,总和40;Count保留总行数6)
当前使用的XSLT代码
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" /> <xsl:template match="/RawData"> <xsl:call-template name="processRows"> <xsl:with-param name="count" select="0" /> <xsl:with-param name="sum" select="0" /> <xsl:with-param name="rows" select="row" /> </xsl:call-template> </xsl:template> <xsl:template name="processRows"> <xsl:param name="count" /> <xsl:param name="sum" /> <xsl:param name="rows" /> <xsl:if test="$rows"> <xsl:variable name="currentVal" select="$val + 1" /> <xsl:variable name="currentCount" select="$count + 1" /> <xsl:variable name="currentSum" select="$sum + number($rows[1]/column[4])" /> <xsl:call-template name="processRows"> <xsl:with-param name="count" select="$currentCount" /> <xsl:with-param name="sum" select="$currentSum" /> <xsl:with-param name="rows" select="$rows[position() > 1]" /> </xsl:call-template> </xsl:if> <xsl:if test="not($rows)"> Final <xsl:text>Count: </xsl:text> <xsl:value-of select="$count" /> <xsl:text>, Sum: </xsl:text> <xsl:value-of select="$sum" /> </xsl:if> </xsl:template> </xsl:stylesheet>
解决方案(XSLT 1.0)
XSLT 1.0中需要使用Muenchian分组来提取第三列的唯一值,再对每个唯一值对应的第四列求和。修改后的样式表如下:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" /> <!-- 定义键:按第三列的值分组 --> <xsl:key name="group-by-col3" match="row" use="column[3]" /> <xsl:template match="/RawData"> <!-- 统计总行数 --> <xsl:variable name="total-count" select="count(row)" /> <!-- 对每个唯一的第三列分组,求和对应的第四列 --> <xsl:variable name="unique-sum" select="sum(row[generate-id() = generate-id(key('group-by-col3', column[3])[1])]/column[4])" /> <!-- 输出结果 --> Final <xsl:text>Count: </xsl:text> <xsl:value-of select="$total-count" /> <xsl:text>, Sum: </xsl:text> <xsl:value-of select="$unique-sum" /> </xsl:template> </xsl:stylesheet>
关键说明
<xsl:key>:定义分组规则,以每行第三列的值作为分组键。row[generate-id() = generate-id(key('group-by-col3', column[3])[1])]:筛选出每个分组中的第一个节点(即代表唯一第三列值的行)。sum(...):对这些唯一分组行的第四列数值求和。count(row):直接获取总行数,保持需求中的Count值。
测试输出
运行修改后的XSLT,将得到预期结果:
Final Count: 6, Sum: 40
内容的提问来源于stack exchange,提问作者Ram Rao
相关产品推荐
相关产品推荐

