Xml 从XSLT中删除名称空间
您好,我正在编写XSLT,并在其中使用函数。现在,当它被执行时,来自xml的namesapce也会被复制。为了消除这种情况,我使用了类似的函数。但如果Child有更多的子元素,那么名称空间就会出现在其中。 有人能告诉我怎么才能去掉它吗。 下面是我正在使用的xslt和XML的片段Xml 从XSLT中删除名称空间,xml,xslt,namespaces,xslt-2.0,Xml,Xslt,Namespaces,Xslt 2.0,您好,我正在编写XSLT,并在其中使用函数。现在,当它被执行时,来自xml的namesapce也会被复制。为了消除这种情况,我使用了类似的函数。但如果Child有更多的子元素,那么名称空间就会出现在其中。 有人能告诉我怎么才能去掉它吗。 下面是我正在使用的xslt和XML的片段 <xsl:template match="/"> <xsl:element name="Parent"> <xsl:copy-of select="Child" copy-n
<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中,但存在于孙子中。copy namespaces=no属性不会剥离所有名称空间节点-如中所述:
如果值为“否”,则不会复制任何名称空间节点:但是,名称空间节点仍将按照名称空间修复过程的要求在结果树中创建:请参阅5.7.3名称空间修复。此属性影响此指令复制的所有元素:由选择表达式直接选择的元素和由选择表达式选择的节点的后代元素
下面是一个如何摆脱所有非强制命名空间节点的示例:
将此常规转换应用于此XML文档时:
产生所需的正确结果:
请注意:
转换不是特定于XSLT-2.0的,也可以与XSLT 1.0一起使用
删除所有名称空间节点通常是一个不安全的过程,因为来自不同名称空间的节点都放在无名称空间中。在此过程中,某些属性可能会丢失,并且该过程通常是不可逆的,不是1:1
使用此模板,您应该能够删除名称空间:
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>
另请参阅:
这对你的问题有帮助吗
致以最良好的祝愿,
彼得问得好,+1。请参阅我的答案以了解解释和完整、简短、简单的解决方案:此代码段不处理命名空间中的属性。@Dimitre:你说得对,Dimitre。谢谢你的回答+我只是看着它,意识到了这一点。到目前为止,我只需要使用它几次,而且它总是只从元素中删除名称空间。我把它添加到我的收藏夹中,这样我就记得了-+1正确答案。但我想你的意思不是强制性的
<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>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* | node()"/>
</xsl:element>
</xsl:template>