You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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() &gt; 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>

关键说明

  1. <xsl:key>:定义分组规则,以每行第三列的值作为分组键。
  2. row[generate-id() = generate-id(key('group-by-col3', column[3])[1])]:筛选出每个分组中的第一个节点(即代表唯一第三列值的行)。
  3. sum(...):对这些唯一分组行的第四列数值求和。
  4. count(row):直接获取总行数,保持需求中的Count值。

测试输出

运行修改后的XSLT,将得到预期结果:

Final
Count: 6, Sum: 40

内容的提问来源于stack exchange,提问作者Ram Rao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:58:11