您好,我正在编写一个 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>
请注意:
转换不是 XSLT-2.0 特定的,也可以与 XSLT 1.0 一起使用。
移除所有命名空间节点通常是一个不安全的过程,因为来自不同命名空间的节点都被放入“无命名空间”。在这个过程中可能会丢失一些属性,而且这个过程一般是不可逆的(不是1:1)。
关于xml - 从 XSLT 中删除 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5595139/