0

私はXSLTの初心者です。XMLをXMLに変換するために使用しています。

ソースXML:

<Response>
    <Text>Hello</Text>
</Response>

XSLT:

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

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="Response" namespace="http://myexample.org/a">
        <xsl:element name="Root">
            <xsl:element name="a:Parent">
                <xsl:element name="b:Child">
                    <xsl:value-of select="Text"/>
                </xsl:element>
            </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

出力:

<Root>
  <a:Parent xmlns:a="http://myexample.org/a">
    <b:Child xmlns:b="http://myexample.org/b">Hello</b:Child>
  </a:Parent>
</Root>

XSLTを使用してXMLを以下のXMLに変換したいと思います。

予想されるアウトパウト:

<Root xmlns:a="http://myexample.org/a">
    <a:Parent xmlns:b="http://myexample.org/b">
        <b:Child/>
    </a:Parent>
<Root>

データを変換するためのXSLTを正常に作成しましたが、ここでは名前空間と混同しています。上記のように生成することはできません。

助けてください。ありがとう。

4

1 に答える 1

1

XSLT 1.0を使用して特定の場所に名前空間宣言を作成するのは少し厄介ですが(2.0でははるかに簡単です)、スタイルシートドキュメント自体<xsl:namespace>から名前空間ノードをコピーするトリックで行うことができます。

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

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="Response">
        <xsl:element name="Root">
            <xsl:copy-of select="document('')/*/namespace::a" />
            <xsl:element name="a:Parent">
                <xsl:copy-of select="document('')/*/namespace::b" />
                <xsl:element name="b:Child">
                    <xsl:value-of select="Text"/>
                </xsl:element>
            </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

はスタイルシートドキュメントを解析し、そのdocument('')ルートノードを提供します。要素も同様document('')/*です。次に、その要素から、指定されたプレフィックスにバインドされた名前空間ノード<xsl:stylesheet>を抽出し、それを出力ドキュメントにコピーします。

または、から名前空間宣言を取り出し、<xsl:stylesheet>リテラル結果要素を使用します。

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

    <xsl:output method="xml" indent="yes" />

    <xsl:template match="Response">
        <Root xmlns:a="http://myexample.org/a">
            <a:Parent xmlns:b="http://myexample.org/b">
                <b:Child>
                    <xsl:value-of select="Text"/>
                </b:Child>
            </a:Parent>
        </Root>
    </xsl:template>
</xsl:stylesheet>

aただし、スタイルシートの他の場所でとbプレフィックスが必要な場合、これは機能しません。

于 2012-11-27T15:31:22.777 に答える