2017-12-18 12 views
-1

私のxsltコードでは、copy-ofを使用して要素とその子孫ノードをコピーできますが、同じ構造を持つ結果のスキーマは異なる名前空間。まだコピーを使用してこれを達成できる方法はありますか?私はXSLT 2.0を使用していますxslt結果のドキュメント内の別の名前空間へのコピー

以下はソースとターゲットのXMLの例ですが、cd要素はXSLのcopy-ofを使用してコピーできますが、名前空間は異なります。

ソースXML

<catalog xmlns="namespace1"> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</catalog> 

ターゲットXML

<books xmlns="namespace2"> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</books> 

マーティンHonnenのアイデアを使用し、作成したこの

<xsl:template name="changeNamespace"> 
<xsl:param name="nodes"/> 
<xsl:for-each select="$nodes"> 
    <xsl:choose> 
    <xsl:when test="count(child::*)>0"> 
     <xsl:element name="newnamespace:{local-name()}"> 
     <xsl:call-template name="changeNamespace"> 
      <xsl:with-param name="nodes" select="./child::*"/> 
     </xsl:call-template> 
     </xsl:element> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:element name="newnamespace:{local-name()}"> 
     <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each> 

+0

コードで問題を正しく説明できますか? – Shuvra

答えて

1

使用することはできませんxsl:copyまたはxsl:copy-ofノードの名前空間を変更するには、ノードの名前空間を変更する必要があります。

スコープ内<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns1="source-namespace" xmlns:ns2="target-namespace" version="1.0">か、もちろんxsl:elementにターゲット名前空間を置くことができます。

<xsl:template match="ns1:*"> 
    <xsl:element name="ns2:{local-name()}" namespace="target-namespace"> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 

、あなたが属性ノードのための同様のテンプレートを設定する必要があり、名前空間を変更する必要がある属性を持っている場合。

XSLT 2.0を使用すると、スタイルシート構造を簡単にすることができます。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="namespace1" xmlns="namespace2" version="2.0"> 

    <xsl:template match="*"> 
     <xsl:element name="{local-name()}"> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:element> 
    </xsl:template> 
+0

Martinに感謝します。 xsl:copy-ofが実行された後、このテンプレートを実行して(名前空間を変更する)方法はありますか?私はxsl:copy-ofを持つ最初のXSLを実行し、その結果を使って名前空間を変更するテンプレートを持つ別のXSLを実行しますが、これを1つのXSLに組み合わせる方法はありますか? – jay26

+0

2番目のステップで最初に変換するものを最初にコピーしたい理由はわかりませんが、もちろん、XSLT 2ではクリーンな解決策としてモードを使用して処理ステップを分離することを提案します。つまり、 'そして' ' –

関連する問題