1

ソース XML から一部をコピーしようとしています<xsl:copy>。ルート要素を無視するため、手動で作成する必要があります (または、より良い方法があるかもしれません。アドバイスをお願いします)

ソース 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>

結果は正しくありません。名前空間はすべての子ノードに表示されますが、ルートノードには表示されません...ばかげているように思えるかもしれませんが、助けてください、ありがとう!

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 に答える