微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

xml – 从XSLT中删除NamesSpace

嗨,我正在编写一个XSLT,并且我正在使用< xsl:copy-of>功能.现在当它被执行时,来自xml的namesapce也会被复制.为了删除我使用的函数,例如< xsl:copy-of select =“$RootNode / Child”copy-namespaces =“no”/>.但是,如果Child有更多的子元素,那么名称空间就会出现在那里.
所以任何人都可以告诉我如何删除它.
下面是我正在使用的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>

请注意:

>转换不是特定于XSLT-2.0的,也可以与XSLT 1.0一起使用.>删除所有命名空间节点通常是一个不安全的过程,因为来自不同命名空间的节点都放在“无命名空间”中.在此过程中,某些属性可能会丢失,并且该过程通常不可逆(不是1:1).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。