如何在Xslt中创建具有命名空间的相同根元素?

时间:2013-08-06 03:51:53

标签: xml xslt

我正在尝试从源XML复制一些部分,因为<xsl:copy>忽略了根元素,我必须手动创建(或者可能有更好的方法,请提供任何建议)

source xml:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:header="http://www.test.com/header" >
    <file_header >
        <header:Header>
            <aaa>123</aaa>
        </header:Header>
    </file_header>
    <someNode>
        <bbb>234</bbb>
    </someNode>
    <target>
        <ccc>ccc</ccc>
        <ddd>ddd</ddd>
    </target>
    <target>
        <ccc>eee</ccc>
        <ddd>fff</ddd>
    </target>
</root>

预期结果:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:header="http://www.test.com/header" >
    <file_header >
        <header:Header>
            <aaa>123</aaa>
        </header:Header>
    </file_header>
    <someNode>
        <bbb>234</bbb>
    </someNode>
</root>

我使用的Xslt是这样的:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:header="http://www.test.com/header">

    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="/">
        <xsl:element name="{node-name(node())}" namespace="{namespace-uri(node())}">
            <xsl:copy>
                <xsl:apply-templates select="//target[1]/preceding-sibling::node()"/>
            </xsl:copy>
        </xsl:element>
    </xsl:template>

</xsl:stylesheet>

结果不对,命名空间出现在每个子节点上,但不出现在根节点上... 这对你来说似乎很愚蠢,但请帮助我,谢谢!

1 个答案:

答案 0 :(得分:0)

我尝试使用以下

替换您的<xsl:template match="/">...模板
<xsl:template match="/node()">
    <xsl:copy>
        <xsl:apply-templates select="target[1]/preceding-sibling::node()"/>
    </xsl:copy>
</xsl:template>

它看起来像你期望的那样工作。