1

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

源代码:

<?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>

结果不正确,命名空间出现在每个子节点上,但没有出现在根节点上......这对你来说可能看起来很愚蠢,但请帮助我,谢谢!

4

1 回答 1

0

我尝试<xsl:template match="/">...用以下替换您的模板

<xsl:template match="/node()">
    <xsl:copy>
        <xsl:apply-templates select="target[1]/preceding-sibling::node()"/>
    </xsl:copy>
</xsl:template>

它似乎按您的预期工作。

于 2013-08-06T06:36:55.663 回答