繁体   English   中英

XSLT中的命名空间

[英]Namespaces in XSLT

我正在使用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>

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

前两个答案(由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>

将此转换应用于以下源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>

您可以在样式表中包含命名空间,如下所示:

<!--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指出的那样,这不会将复制的节点放入新的命名空间,只会放入Trade元素。

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>

添加属性以证明它们被正确复制,并且单独的模式用于命名空间更改模板,以便它们不会干扰其他代码,以防您希望将它们用作较大样式表的一部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM