如何在 XSLT 中连接一个不同子节点的文本时将 XML 节点与公共子节点合并

How to merge XML nodes with common subnodes while concatenating text of one differing subnode in XSLT

如何在 XSLT 中连接一个不同子节点的文本时将 XML 节点与公共子节点合并?我可以使用 XSLT 1 或 2。我有基本的 XSLT 知识,但不知道从哪里开始。

这是给定的 XML:

<fields>
    <field>
        <dc-schema>dc</dc-schema>
        <dc-element>description</dc-element>
        <dc-qualifier>abstract</dc-qualifier>
        <type-bind>Audio</type-bind>
    </field>
    
    <field>
        <dc-schema>dc</dc-schema>
        <dc-element>description</dc-element>
        <dc-qualifier>abstract</dc-qualifier>
        <type-bind>Video</type-bind>
    </field>
    
    <field>
        <dc-schema>dc</dc-schema>
        <dc-element>description</dc-element>
        <dc-qualifier>sponsorship</dc-qualifier>
        <type-bind>Audio</type-bind>
    </field>
</fields>

这是期望的结果:

<fields>
    <field>
        <dc-schema>dc</dc-schema>
        <dc-element>description</dc-element>
        <dc-qualifier>abstract</dc-qualifier>
        <type-bind>Audio, Video</type-bind>
    </field>
    
    <field>
        <dc-schema>dc</dc-schema>
        <dc-element>description</dc-element>
        <dc-qualifier>sponsorship</dc-qualifier>
        <type-bind>Audio</type-bind>
    </field>
</fields>

您可以像这样进行分组:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <xsl:for-each-group select="fields/field" group-by="concat(dc-schema,dc-element,dc-qualifier)">
      <xsl:copy>
        <xsl:copy-of select="*[not(self::type-bind)]"/>
        <type-bind><xsl:value-of select="current-group()/type-bind" separator=", "/></type-bind>
      </xsl:copy>
    </xsl:for-each-group>
  </xsl:template>
  
</xsl:stylesheet>

看到它在这里工作:https://xsltfiddle.liberty-development.net/93F8dUv