的exclude-result-prefixes
属性xsl:stylesheet
,当指定为时,要求删除(仅)字面结果元素"yes"
的任何命名空间节点,这些节点是继承的,并且不定义字面量结果元素的命名空间 uri 和前缀。
Markus Jarderot 的回答中的以下陈述是错误的:
“exclude-result-prefixes 只是删除了结果根标签上的 xmlns:foo="" 属性。”
这是一个反例:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:z="z:z" exclude-result-prefixes="z">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<z:x xmlns:z="z:z">
<z:y/>
</z:x>
</xsl:template>
</xsl:stylesheet>
当将此转换应用于任何 XML 文档(未使用)时,结果为:
<z:x xmlns:z="z:z">
<z:y/>
</z:x>
我们看到:
具有值 (namespace-uri) "z:z" 的命名空间的命名空间节点(和定义)不会从顶部元素(Markus Jarderot 称之为“根标签”)中删除。
带有前缀的命名空间"z"
根本不会从任何文字元素中删除。
这表明了一个简单的事实,即exclude-result-prefixes="yes"
如果命名空间不在 LRE(文字结果元素)上,并且即使命名空间节点在 LRE 上但正在定义元素所属的命名空间,则指定不能删除命名空间。
为了从它所属的命名空间中删除一个元素,或者从非 LRE 元素中删除命名空间,我们需要指定一些额外的处理。
一个例子是将传统的身份规则替换为以下内容:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()[not(self::*)]">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
<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 文档时:
<z:x xmlns:z="z:z">
<z:y z:attr="someValue"/>
</z:x>
转换的结果是:
<x>
<y attr="someValue"/>
</x>
最后一个警告:
如果应用于包含具有相同本地名称但属于两个不同名称空间的两个元素(或两个属性)的文档,则此转换可能是有害的 - 该转换将这些元素(或属性)替换为都属于同一名称空间的元素(或属性)(没有命名空间)。