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

XSLT 1.0 按唯一customerID聚合并求和的实现问题求助

解决XSLT按customerID聚合并求和的重复输出问题

我看了你的代码和问题,核心问题出在你用<xsl:for-each>遍历同一个customerID下的所有节点,导致每个节点都输出一遍customerID和totalAmount,所以出现了重复内容。咱们一步步修正:

问题分析

你的分组逻辑(用generate-id()筛选每个customerID的第一个节点)思路是对的,但后续在customer模板里的<xsl:for-each select="key('kCustomer', customerID)">完全没必要——因为你已经定位到了每个分组的唯一代表节点,直接基于这个节点去计算整个分组的总和就好,不需要再循环遍历同组的所有节点。另外你的原代码里还有个小语法错误:generate-id(key('kCustomer',customerID[1])这里少了闭合的括号,得先补上。

修正后的XSLT代码

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:key name="kCustomer" match="customer" use="customerID" />
  
  <xsl:template match="customers">
    <customers>
      <!-- 修正语法错误,筛选每个customerID的第一个节点 -->
      <xsl:apply-templates select="customer[generate-id() = generate-id(key('kCustomer', customerID)[1])]"/>
    </customers>
  </xsl:template>
  
  <xsl:template match="customer">
    <customer>
      <!-- 直接输出当前分组的customerID -->
      <customerID><xsl:value-of select="customerID"/></customerID>
      <!-- 对当前customerID对应的所有节点的amount求和 -->
      <totalAmount><xsl:value-of select="sum(key('kCustomer', customerID)/amount)" /></totalAmount>
    </customer>
  </xsl:template>
</xsl:stylesheet>

代码解释

  1. 分组逻辑修正:原代码里的generate-id(key('kCustomer',customerID[1])少了闭合括号,修正后generate-id(key('kCustomer', customerID)[1])能正确获取每个customerID分组的第一个节点的唯一ID,确保每个分组只处理一次。
  2. 去掉多余循环:在customer模板里,不需要用<xsl:for-each>遍历同组节点,因为当前节点已经是分组的代表节点,直接用key('kCustomer', customerID)就能拿到同组所有节点,再对它们的amount求和即可。
  3. 简化输出:直接输出当前节点的customerID,避免重复获取同组的ID。

测试输出

用修正后的代码处理你的XML,会得到你期望的结果:

<?xml version="1.0"?>
<customers>
  <customer>
    <customerID>1234</customerID>
    <totalAmount>1800</totalAmount>
  </customer>
  <customer>
    <customerID>7755</customerID>
    <totalAmount>1500</totalAmount>
  </customer>
</customers>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:57:38