我使用XSLT。
假设这个非常简单的XML:
<ROOT>
<ELEMENT>
<ELEMENT>content of ELEMENT</ELEMENT>
</ELEMENT>
</ROOT>
当子节点的名称等于其父节点的名称时,如何在XSLT中混淆XML层次结构?生成的XML应如下所示:
<ROOT>
<ELEMENT>content of ELEMENT</ELEMENT>
</ROOT>
答案 0 :(得分:0)
如果您先复制/ ROOT / ELEMENT / ELEMENT元素然后删除/ ROOT / ELEMENT,您可以再次放回复制的ELEMENT元素......
答案 1 :(得分:0)
这个问题并没有多大意义;特别是当XML甚至稍微复杂一些时,例如来自C. M. 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>