2009-02-16 96 views
4

我正在使用XSLT重新構建XML文件。下面的代碼將所有子節點到一個新的XML文件:XSLT中的命名空間

<!--Add all child elements of the zzz node--> 
<xsl:template match="zzz"> 
    <Trade> 
     <xsl:attribute name="ID"> 
      <xsl:value-of select="TradeId" /> 
     </xsl:attribute> 
     <xsl:copy-of select="*"></xsl:copy-of> 
    </Trade> 
</xsl:template> 

我想修改代碼,以便它把節點到一個特定的命名空間不是源文件內。我需要改變什麼?

回答

5

前兩個答案(由teun和Craig Bovis)是不正確的 - 請參閱我對每個問題的評論。

到給定的元件移動到一個新的命名空間中的corect方式涉及重新創建該元素如下所示

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

    <xsl:template match="zzz"> 
     <trade ID="{TradeId}"> 
     <xsl:apply-templates select="*[not(self::TradeId)]"/> 
     </trade> 
    </xsl:template> 

    <xsl:template match="zzz/*"> 
     <xsl:element name="{name()}" namespace="my:Trade"> 
     <xsl:copy-of select="@* | node()"/> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

當在下面的源XML文檔施加這種轉變:

<zzz> 
    <TradeId>153</TradeId> 
    <x:item xmlns:x="x:x">A</x:item> 
    <x:item xmlns:x="x:x">B</x:item> 
    <x:item xmlns:x="x:x">C</x:item> 
</zzz> 

所需的結果產生

<trade ID="153"> 
    <x:item xmlns:x="my:Trade">A</x:item> 
    <x:item xmlns:x="my:Trade">B</x:item> 
    <x:item xmlns:x="my:Trade">C</x:item> 
</trade> 
0

您可以直接在您的樣式表的命名空間,如下所示:

<!--Add all child elements of the zzz node--> 
<xsl:template match="zzz" xmlns:my="your target ns"> 
<my:Trade> 
<xsl:attribute name="my:ID" > 
<xsl:value-of select="TradeId" /> 
</xsl:attribute> 
<xsl:copy-of select ="*"></xsl:copy-of> 
</my:Trade> 
</xsl:template> 

編輯:Dimitre指出,這將地方複製的節點進入新的命名空間,只有貿易的元素。

+0

非常不正確:1. OP明確表示他希望僅在匹配元素的子節點中放入新名稱空間 - 而不是任何屬性。 2. 中複製的元素仍然不屬於這個新的名稱空間。 – 2009-02-16 17:58:27

+0

啊,對。我誤解了這個問題。謝謝,Dimitre。 – 2009-02-17 08:07:17

0

Dimitre Novatchev的解決方案是好的,但我還要指出的是,如果你需要改變嵌套元素的命名空間太大,下面將更好地工作:

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

    <xsl:template match="zzz"> 
    <trade ID="{TradeId}"> 
     <xsl:apply-templates select="*[not(self::TradeId)]" mode="change-ns"/> 
    </trade> 
    </xsl:template> 

    <xsl:template match="@*|node()" priority="-10" mode="change-ns"> 
    <xsl:copy/> 
    </xsl:template> 

    <xsl:template match="*" mode="change-ns"> 
    <xsl:element name="{name()}" namespace="my:Trade"> 
     <xsl:apply-templates select="@*|node()" mode="change-ns"/> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

例如如果你有以下輸入文檔

<trade ID="153"> 
    <x:item xmlns:x="my:Trade" someattr="1"> 
    <x:subitem anotherattr="2">A1</x:subitem> 
    <x:subitem anotherattr="3">A2</x:subitem> 
    </x:item> 
    <x:item xmlns:x="my:Trade">B</x:item> 
    <x:item xmlns:x="my:Trade">C</x:item> 
</trade> 

你會得到

<zzz> 
    <TradeId>153</TradeId> 
    <x:item xmlns:x="x:x" someattr="1"> 
    <x:subitem anotherattr="2">A1</x:subitem> 
    <x:subitem anotherattr="3">A2</x:subitem> 
    </x:item> 
    <x:item xmlns:x="x:x">B</x:item> 
    <x:item xmlns:x="x:x">C</x:item> 
</zzz> 

屬性添加,以證明他們是正確複製,並用於命名空間改變模板分離模式,讓他們不要」如果您想將它們用作較大樣式表的一部分,則不會干擾其他代碼。