当子元素等于父元素时,会混淆XML树

时间:2013-02-01 18:29:28

标签: xml xslt

我使用XSLT。

假设这个非常简单的XML:

<ROOT>
  <ELEMENT>
    <ELEMENT>content of ELEMENT</ELEMENT>
  </ELEMENT>
</ROOT>

当子节点的名称等于其父节点的名称时,如何在XSLT中混淆XML层次结构?生成的XML应如下所示:

<ROOT>
   <ELEMENT>content of ELEMENT</ELEMENT>
</ROOT>

2 个答案:

答案 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>
相关问题