xml - 从 XSLT 中删除 namespace

标签 xml xslt namespaces xslt-2.0

您好,我正在编写一个 XSLT,我正在其中使用 <xsl:copy-of>功能。现在,当它被执行时,来自 xml 的命名空间也会被复制。为了删除它,我使用了类似 <xsl:copy-of select="$RootNode/Child" copy-namespaces="no"/> 的函数.但是如果 Child 有更多的子元素,那么 namespace 就会出现在其中。 所以任何人都可以告诉我如何删除它。 下面是我正在使用的 xslt 和 XML 的片段。

<xsl:template match="/">
    <xsl:element name="Parent">
    <xsl:copy-of select="Child" copy-namespaces="no"/>
    </xsl:element>

XML 是:

<Child>
<GrandChild>
 <PhoneNumberType>DayPhone</PhoneNumberType>
</GrandChild></Child>

命名空间没有出现在 CustomerParty 中,但它们出现在 Child 中,但它们出现在 GrandChild 中。

最佳答案

copy-namespaces="no" 属性不会剥离所有命名空间节点——如 XSLT 2.0 spec 中所述:

如果它的值为 no,则不会复制任何命名空间节点:但是,命名空间节点仍将按照命名空间修复过程的要求在结果树中创建:请参阅 5.7.3 命名空间修复。此属性影响此指令复制的所有元素:由 select 表达式直接选择的元素,以及由 select 表达式选择的节点的后代元素

这里是一个如何摆脱所有(非强制)命名空间节点的例子:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="*">
     <xsl:element name="{local-name()}">
       <xsl:apply-templates select="node()|@*"/>
     </xsl:element>
 </xsl:template>

 <xsl:template match="@*">
  <xsl:attribute name="{local-name()}">
   <xsl:value-of select="."/>
  </xsl:attribute>
 </xsl:template>
</xsl:stylesheet>

当此一般转换应用于此 XML 文档时:

<x:nums xmlns:x="my:x">
  <x:num>01</x:num>
  <x:num>02</x:num>
  <x:num>03</x:num>
  <x:num>04</x:num>
  <x:num>05</x:num>
  <x:num>06</x:num>
  <x:num>07</x:num>
  <x:num>08</x:num>
  <x:num>09</x:num>
  <x:num>10</x:num>
</x:nums>

产生了想要的、正确的结果:

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

请注意:

  1. 转换不是 XSLT-2.0 特定的,也可以与 XSLT 1.0 一起使用。

  2. 移除所有命名空间节点通常是一个不安全的过程,因为来自不同命名空间的节点都被放入“无命名空间”。在这个过程中可能会丢失一些属性,而且这个过程一般是不可逆的(不是1:1)。

关于xml - 从 XSLT 中删除 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5595139/

相关文章:

php - 有什么方法可以使用 PHP 或 Xslt 提取单个 XML 标记的各个部分?

xml - XSLT - 使用 XSLT 1 的 XML 到 CSV 动态模板

c++ - 多重定义和命名空间

php - Laravel4/PHP : extending a class within different namespaced levels

javascript - 跨源请求仅支持协议(protocol)方案 : http, data、chrome、chrome-extension、https

Python XML-获取两个节点之间的内容

java - JAXB 解码返回 null

xml - XSL 和 CDATA 中的实体

xslt - 选择没有 XSLT/XPath key 的节点

Angular-不能使用命名空间 'moment' 作为类型