-1

我使用 XSLT。

假设这个非常简单的 XML:

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

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

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

2 回答 2

0

如果您首先复制 /ROOT/ELEMENT/ELEMENT 元素,然后删除 /ROOT/ELEMENT 您可以再次放回复制的 ELEMENT 元素...

于 2013-02-01T18:42:40.813 回答
0

这个问题没有多大意义。尤其是当 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>
于 2013-02-02T04:46:28.530 回答