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
相关产品推荐
相关产品推荐

