2017-05-31 6 views
1

インターネットには、私と同じ問題がある参照がたくさんあります。名前空間の追加です。私はこれと同じものを見ました:Adding namespace in inner parent group in xslt v2.0。しかし私の場合は、親タグに名前空間がなく、内部レベルグループに名前空間を挿入しています。私は解決策をコピーしようとしましたが、期待される出力を得ることができません。例えば、私はこのサンプル・ファイルを持って、xslt2.0を使った名前空間の追加

INPUT:EXPECTED

<Record> 
<Data> 
    <Section> 
    <ID>111222</ID> 
    </Section> 
</Data> 
</Record> 

<Record> 
<Data> 
    <Section xmlns="www.hdgd.co"> 
    <ID>111222</ID> 
    </Section> 
</Data> 
</Record> 

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:template match="*"> 
    <xsl:element name="{local-name()}"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 
<xsl:template match="Section"> 
    <Section xmlns="www.hdgd.co"> 
     <xsl:copy-of select="*"/> 
    </Section> 
</xsl:template> 

生成された出力には、ID要素に空の名前空間が設定されています。そして、空のxmlnsを削除する必要があります。次のようになります。

<Record> 
<Data> 
    <Section xmlns="www.hdgd.co"> 
    <ID xmlns="">111222</ID> 
    </Section> 
</Data> 
</Record> 
+0

「名前空間を追加する」とは思わないでください。それを要素の名前を変更するものと考えてください。要素の名前を正しく取得すると、名前空間宣言は自分自身で見直されます。要素の名前は、(名前空間URI、ローカル名)のペアです。 –

答えて

1

あなたが使用することはできません。

<xsl:copy-of select="*"/> 

を元の名前空間のコピーが子ノードそのため - 何の名前空間ではありません。あなたが望む結果を得るには、新しい名前空間にするだけでなくSectionを移動するだけでなく、そのすべての子孫(と彼らがそうであるように、他のすべてのノードを残す)しなければならない - 例えば:

XSLT 1.0

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

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

<xsl:template match="*[ancestor-or-self::Section]"> 
    <xsl:element name="{name()}" namespace="www.hdgd.co"> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

</xsl:stylesheet> 
+0

フィードバックのために@ michael.hor257kいただきありがとうございます。 –

関連する問題