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