Kap*_*pil 4 xml xslt namespaces xslt-2.0
嗨,我正在写一个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>
Run Code Online (Sandbox Code Playgroud)
而XML是:
<Child>
<GrandChild>
<PhoneNumberType>DayPhone</PhoneNumberType>
</GrandChild></Child>
Run Code Online (Sandbox Code Playgroud)
名称空间不会出现在CustomerParty中,但它们存在于Child中,但它们存在于GrandChild中.
Dim*_*hev 10
该copy-namespaces="no"属性不会剥离所有命名空间节点 - 如XSLT 2.0规范中所述:
如果取值为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>
Run Code Online (Sandbox Code Playgroud)
在此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>
Run Code Online (Sandbox Code Playgroud)
产生了想要的正确结果:
<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>
Run Code Online (Sandbox Code Playgroud)
请注意:
转换不是特定于XSLT-2.0的,也可以与XSLT 1.0一起使用.
删除所有命名空间节点通常是一个不安全的过程,因为来自不同命名空间的节点都放在"无命名空间"中.在此过程中,某些属性可能会丢失,并且该过程通常不可逆(不是1:1).
| 归档时间: |
|
| 查看次数: |
2213 次 |
| 最近记录: |