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