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

基于XSLT 2.0合并同id的case元素内容并去重的问题

XML分组去重与内容保留问题修复

问题背景

基于Martin Honnen的方案实现按id对XML的case元素分组并统计重复项时,遇到两个问题:

  • 同id且cont值为n | n格式的case,输出中content字段为空(如id=1的输出)
  • 存在重复case元素时,content中的内容被重复输出

原XML输入

<root>
  <case id="1">
    <cont>1 | 2</cont>
  </case>
  <case id="1">
    <cont>3 | 4</cont>
  </case>
  <case id="2">
    <cont>5 | 6</cont>
  </case>
  <case id="2">
    <cont>5 | 6</cont>
  </case>
</root>

原XSLT 2.0代码

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:key name="case-by-id" match="case" use="@id"/>

  <xsl:template match="/root">
    <result>
      <xsl:for-each-group select="case" group-by="@id">
        <group id="{current-grouping-key()}">
          <count><xsl:value-of select="count(current-group())"/></count>
          <content>
            <xsl:value-of select="current-group()/cont" separator="; "/>
          </content>
        </group>
      </xsl:for-each-group>
    </result>
  </xsl:template>
</xsl:stylesheet>

当前错误输出

<result>
  <group id="1">
    <count>2</count>
    <content/>
  </group>
  <group id="2">
    <count>2</count>
    <content>5 | 6; 5 | 6</content>
  </group>
</result>

预期输出

<result>
  <group id="1">
    <count>2</count>
    <content>1 | 2; 3 | 4</content>
  </group>
  <group id="2">
    <count>2</count>
    <content>5 | 6</content>
  </group>
</result>

修改后的XSLT 2.0代码

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/root">
    <result>
      <xsl:for-each-group select="case" group-by="@id">
        <group id="{current-grouping-key()}">
          <count><xsl:value-of select="count(current-group())"/></count>
          <content>
            <!-- 对当前分组内的cont值去重后拼接 -->
            <xsl:value-of select="distinct-values(current-group()/cont)" separator="; "/>
          </content>
        </group>
      </xsl:for-each-group>
    </result>
  </xsl:template>
</xsl:stylesheet>

修复说明

  1. 解决内容缺失问题:通过current-group()/cont确保分组内所有cont节点的文本都被选取,结合distinct-values避免异常格式导致的内容丢失,完整保留所有合法文本值
  2. 解决内容重复问题:使用distinct-values()函数对分组内的cont文本值进行去重,确保相同内容只输出一次,同时保留所有不同的cont内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:12:47