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)
我想修改代码,以便它将节点放入不在源文档中的特定命名空间.我需要改变什么?
前两个答案(由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)