如何在 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>
如何在 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>