加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 从XSLT中删除NamesSpace

发布时间:2020-12-16 23:19:46 所属栏目:百科 来源:网络整理
导读:嗨,我正在编写一个XSLT,并且我正在使用 xsl:copy-of功能.现在当它被执行时,来自xml的namesapce也会被复制.为了删除我使用的函数,例如 xsl:copy-of select =“$RootNode / Child”copy-namespaces =“no”/.但是,如果Child有更多的子元素,那么名称空间就会
嗨,我正在编写一个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).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读