0

空のxmlns属性を持つノードを出力するxslテンプレートに問題があります。

テンプレートは次のとおりです。

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

<xsl:template match="/">
    <X xmlns="a_ns">
        <Y>
            <xsl:value-of select="a/b/b2"/>
        </Y>
        <Z>
            <xsl:copy-of select="a/d/d1/d11"/>
        </Z>
    </X>
</xsl:template>   

入力は次のとおりです。

<a>
<b>
    <b1>b1_text</b1>
    <b2>b2_text</b2>
</b>
<c>
    <c1>c1_text</c1>
    <c2>c2_text</c2>
</c>
<d>
    <d1>
        <d11>
            <d111 ls="op">d111_text</d111>
            <d112>d112_text</d112>
        </d11>
        <d12>d12_text</d12>
    </d1>
    <d2>d2_text</d2>
    <d3>d3_text</d3>
</d>

出力:

<?xml version="1.0" encoding="utf-8"?>
<X xmlns="a_ns">
    <Y>b2_text</Y>
    <Z>
       <d11 xmlns="">
           <d111 ls="op">d111_text</d111>
           <d112>d112_text</d112>
       </d11>
    </Z>
</X>

xmlns = ""が表示されなくなるようにテンプレートを変更するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

4

この変換

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <X xmlns="a_ns">
            <Y>
                <xsl:value-of select="a/b/b2"/>
            </Y>
            <Z>
                <xsl:apply-templates select="a/d/d1/d11"/>
            </Z>
        </X>
    </xsl:template>

    <xsl:template match="*[ancestor-or-self::d11]">
     <xsl:element name="{name()}" namespace="a_ns">
       <xsl:copy-of select="@*"/>
       <xsl:apply-templates/>
     </xsl:element>
    </xsl:template>
</xsl:stylesheet>

提供されたXMLドキュメントに適用した場合

<a>
    <b>
        <b1>b1_text</b1>
        <b2>b2_text</b2>
    </b>
    <c>
        <c1>c1_text</c1>
        <c2>c2_text</c2>
    </c>
    <d>
        <d1>
            <d11>
                <d111 ls="op">d111_text</d111>
                <d112>d112_text</d112>
            </d11>
            <d12>d12_text</d12>
        </d1>
        <d2>d2_text</d2>
        <d3>d3_text</d3>
    </d>
</a>

必要な正しい結果を生成します

<X xmlns="a_ns">
   <Y>b2_text</Y>
   <Z>
      <d11>
         <d111 ls="op">d111_text</d111>
         <d112>d112_text</d112>
      </d11>
   </Z>
</X>

説明

xsl:copy-of属性で指定された式によって選択された各ノードの正確なコピーを生成しselectます。したがって、コピーされた要素の(デフォルトの)名前空間を変更するために使用することはできません。

この場合、コピーされる要素は「名前空間なし」に属します。コピーされた要素がまだ「名前空間なし」に属しているという事実はxmlns="" 、XSLTプロセッサによって-正しく表現されます-。

于 2012-08-30T13:20:45.540 に答える
0

注意すべき重要な点は、d11などの要素の名前を変更したいということです。入力では、名前は{} d11(つまり、名前空間なしのd11)ですが、出力では、名前を{a_ns} d11(つまり、名前空間a_nsではd11)にします。xsl:copy-of命令はノードを正確にコピーするため、名前{} d11を保持し、シリアライザーはこの名前を保持するためにxmlns=""宣言を追加する必要があります。名前(具体的には、名前の名前空間部分)を変更するには、Dimitreが提供するような手順を使用して、ノードをコピーするのではなく、変換する必要があります。

于 2012-08-30T14:38:23.537 に答える