XSLT将元素移动到另一个节点,并在移动之前删除一些子元素

时间:2013-11-27 19:43:18

标签: xml xslt

我有一个要求,我需要将子节点从一个元素移动到另一个元素,并在复制之后/之前删除一些元素。尝试使用XSLT的多个选项,但没有得到。

我的源XML位于

之下
    <root>
        <header>
            <a1>Value1</a>
            <a2>Value2</a2>
        </header>
        <body>
            <b>
                <c>
                    <d1>value3</d1>
                    <d2>value4</d2>
                </c>
                <!-- to be removed -->
                <remove1>value4</remove1>
                <remove2>value5</remove2>
            </b>
        </body>
    </root>

预期输出为:

    <root>
        <header>
            <a1>Value1</a1>
            <a2>Value2</a2>
            <body>
                <b>
                    <d1>value3</d1>
                    <d2>value4</d2>
                </b>
            </body>
        </header>
    </root>

我的xslt是打击

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" version="1.0" encoding="UTF-8"
        indent="yes" />

    <xsl:template match="/root">
       <xsl:copy>
            <xsl:apply-templates select="node() | @*" />
        </xsl:copy>
     </xsl:template>

    <xsl:template match="/root/header/body/b/remove1" />
    <xsl:template match="/root/header/body/b/remove2" />
    <xsl:template match="header">
        <xsl:copy>
            <xsl:copy-of select="node()" />
            <xsl:copy-of select="//body" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="/root/body" />

</xsl:stylesheet>

你能帮帮我吗?

1 个答案:

答案 0 :(得分:4)

使用身份转换模板

启动样式表代码
<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

然后添加模板

<xsl:template match="c">
  <xsl:apply-templates/>
</xsl:template>

确保不复制c,但其子项是并添加模板

<xsl:template match="remove1 | remove2"/>

删除元素(以禁止复制它们)。

我将添加一个完整的示例:

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="@* | node()">
  <xsl:copy>
    <xsl:apply-templates select="@* | node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="c">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="remove1 | remove2"/>

</xsl:stylesheet>

改变

<root>
    <header>
        <a1>Value1</a1>
        <a2>Value2</a2>
    </header>
    <body>
        <b>
            <c>
                <d1>value3</d1>
                <d2>value4</d2>
            </c>
            <!-- to be removed -->
            <remove1>value4</remove1>
            <remove2>value5</remove2>
        </b>
    </body>
</root>

<root>
    <header>
        <a1>Value1</a1>
        <a2>Value2</a2>
    </header>
    <body>
        <b>

                <d1>value3</d1>
                <d2>value4</d2>

            <!-- to be removed -->


        </b>
    </body>
</root>