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

