我使用 XSLT。
假设这个非常简单的 XML:
<ROOT>
<ELEMENT>
<ELEMENT>content of ELEMENT</ELEMENT>
</ELEMENT>
</ROOT>
当子节点的名称等于其父节点的名称时,如何在 XSLT 中合并 XML 层次结构?生成的 XML 应如下所示:
<ROOT>
<ELEMENT>content of ELEMENT</ELEMENT>
</ROOT>
如果您首先复制 /ROOT/ELEMENT/ELEMENT 元素,然后删除 /ROOT/ELEMENT 您可以再次放回复制的 ELEMENT 元素...
这个问题没有多大意义。尤其是当 XML 稍微复杂一点时,例如在 CM Sperberg-McQueen 和 JLRishe 的示例中,或者如果属性存在于父级或子级/子级上。
但是,如果我想这样做并且 XML 结构与您的示例一样简单,我会这样做:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[name()=name(*)]">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
如果父级中有属性并且您想向下传播这些属性,您可以这样做:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[name()=name(*)]" priority="1">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="*[name()=name(../*)]">
<xsl:copy>
<xsl:copy-of select="../@*"/>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>