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>
屬性添加,以證明他們是正確複製,並用於命名空間改變模板分離模式,讓他們不要」如果您想將它們用作較大樣式表的一部分,則不會干擾其他代碼。
非常不正確:1. OP明確表示他希望僅在匹配元素的子節點中放入新名稱空間 - 而不是任何屬性。 2.中複製的元素仍然不屬於這個新的名稱空間。 –
2009-02-16 17:58:27
啊,對。我誤解了這個問題。謝謝,Dimitre。 – 2009-02-17 08:07:17