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

XSLT 1.0合并同GTIN的Set_Item节点并保留多ForwarderReferenceNumber

XSLT 1.0 合并相同GTIN的Set_Item节点

需求说明

当多个<Set_Item>节点的GTIN值相同时,把这些节点的<ForwarderReferenceNumber>全部合并到其中一个<Set_Item>节点下,同时删除其余重复GTIN的<Set_Item>节点。

示例输入XML

<Root>
  <Set_Item>
    <GTIN>1234567890123</GTIN>
    <ForwarderReferenceNumber>REF001</ForwarderReferenceNumber>
    <OtherData>Data1</OtherData>
  </Set_Item>
  <Set_Item>
    <GTIN>1234567890123</GTIN>
    <ForwarderReferenceNumber>REF002</ForwarderReferenceNumber>
    <OtherData>Data2</OtherData>
  </Set_Item>
  <Set_Item>
    <GTIN>9876543210987</GTIN>
    <ForwarderReferenceNumber>REF003</ForwarderReferenceNumber>
    <OtherData>Data3</OtherData>
  </Set_Item>
</Root>

期望输出XML

<Root>
  <Set_Item>
    <GTIN>1234567890123</GTIN>
    <OtherData>Data1</OtherData>
    <ForwarderReferenceNumber>REF001</ForwarderReferenceNumber>
    <ForwarderReferenceNumber>REF002</ForwarderReferenceNumber>
  </Set_Item>
  <Set_Item>
    <GTIN>9876543210987</GTIN>
    <ForwarderReferenceNumber>REF003</ForwarderReferenceNumber>
    <OtherData>Data3</OtherData>
  </Set_Item>
</Root>

实现代码(XSLT 1.0)

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

  <!-- 按GTIN值定义分组键 -->
  <xsl:key name="gtin-group" match="Set_Item" use="GTIN"/>

  <!-- 处理根节点 -->
  <xsl:template match="/Root">
    <Root>
      <!-- 只处理每个GTIN组的第一个节点 -->
      <xsl:for-each select="Set_Item[generate-id() = generate-id(key('gtin-group', GTIN)[1])]">
        <Set_Item>
          <!-- 复制当前节点除ForwarderReferenceNumber外的所有内容 -->
          <xsl:copy-of select="*[not(self::ForwarderReferenceNumber)]"/>
          <!-- 复制当前GTIN组下所有的ForwarderReferenceNumber -->
          <xsl:copy-of select="key('gtin-group', GTIN)/ForwarderReferenceNumber"/>
        </Set_Item>
      </xsl:for-each>
    </Root>
  </xsl:template>

  <!-- 默认模板:复制所有未匹配的节点和属性 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

代码说明

  • Muenchian分组:XSLT 1.0没有原生分组功能,用<xsl:key>配合generate-id()实现分组,只保留每个GTIN组的第一个<Set_Item>节点作为载体。
  • 合并引用编号:通过key('gtin-group', GTIN)获取当前GTIN对应的所有<Set_Item>节点,把它们的<ForwarderReferenceNumber>全部复制到保留的节点下。
  • 保留基础数据:先复制保留节点除<ForwarderReferenceNumber>外的所有内容,确保原有其他字段不丢失。
  • 默认模板:保证XML中其他非<Set_Item>的结构(比如根节点、其他自定义节点)能正常复制,不破坏原有文档结构。

多重复节点验证示例

如果输入有3个相同GTIN的节点:

<Root>
  <Set_Item>
    <GTIN>1112223334445</GTIN>
    <ForwarderReferenceNumber>REF004</ForwarderReferenceNumber>
    <OtherData>Data4</OtherData>
  </Set_Item>
  <Set_Item>
    <GTIN>1112223334445</GTIN>
    <ForwarderReferenceNumber>REF005</ForwarderReferenceNumber>
    <OtherData>Data5</OtherData>
  </Set_Item>
  <Set_Item>
    <GTIN>1112223334445</GTIN>
    <ForwarderReferenceNumber>REF006</ForwarderReferenceNumber>
    <OtherData>Data6</OtherData>
  </Set_Item>
</Root>

输出结果会合并所有引用编号,只保留第一个节点的基础数据:

<Root>
  <Set_Item>
    <GTIN>1112223334445</GTIN>
    <OtherData>Data4</OtherData>
    <ForwarderReferenceNumber>REF004</ForwarderReferenceNumber>
    <ForwarderReferenceNumber>REF005</ForwarderReferenceNumber>
    <ForwarderReferenceNumber>REF006</ForwarderReferenceNumber>
  </Set_Item>
</Root>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 07:03:27