XSLT中的命名空间

mac*_*ojw 4 xml xslt namespaces

我正在使用XSLT重构XML文件.以下代码将所有子节点复制到新的XML文件:

<!--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>
Run Code Online (Sandbox Code Playgroud)

我想修改代码,以便它将节点放入不在源文档中的特定命名空间.我需要改变什么?

Dim*_*hev 5

前两个答案(由teun和Craig Bovis提出)是不正确的 - 请参阅我对这些答案的评论.

将给定元素移动到新命名空间的核心方法包括重新创建此元素,如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)

将此转换应用于以下源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>
Run Code Online (Sandbox Code Playgroud)

产生了所需的结果:

<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>
Run Code Online (Sandbox Code Playgroud)