在XSLT转换场景中,命名空间是保证XML元素唯一性的重要机制,但处理不当会导致转换后的结果文档包含大量冗余的命名空间声明,影响文档的可读性和后续处理。exclude-result-prefixes属性就是用来解决这个问题的关键配置。

XSLT命名空间基础
XML命名空间通过xmlns属性定义,通常分为默认命名空间和带前缀的命名空间。在XSLT中,样式表本身可能定义多个命名空间,同时源XML也可能包含不同的命名空间,转换时需要明确匹配对应命名空间的元素。
比如源XML中定义了带前缀的命名空间:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:ns="http://www.example.org/ns">
<ns:user>
<ns:name>张三</ns:name>
<ns:age>25</ns:age>
</ns:user>
</root>
要在XSLT中匹配ns前缀的元素,就需要在XSLT样式表中声明相同的命名空间,否则无法正确匹配到对应节点。
exclude-result-prefixes属性的作用
exclude-result-prefixes是<xsl:stylesheet>或<xsl:transform>标签的可选属性,用于指定哪些命名空间前缀不会出现在转换后的结果文档中。默认情况下,XSLT会把样式表中声明的所有命名空间都复制到结果文档的根元素上,即使这些命名空间在结果文档中并没有被实际使用。
比如我们在XSLT中声明了ns命名空间只是为了匹配源XML的元素,但结果文档中并不需要这个前缀,就可以通过exclude-result-prefixes排除它。
使用示例对比
不使用exclude-result-prefixes的情况
下面的XSLT样式表没有配置exclude-result-prefixes:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://www.example.org/ns">
<xsl:template match="/">
<user_info>
<xsl:apply-templates select="root/ns:user"/>
</user_info>
</xsl:template>
<xsl:template match="ns:user">
<name><xsl:value-of select="ns:name"/></name>
<age><xsl:value-of select="ns:age"/></age>
</xsl:template>
</xsl:stylesheet>
转换后的结果文档会包含ns命名空间的声明:
<?xml version="1.0" encoding="UTF-8"?>
<user_info xmlns:ns="http://www.example.org/ns">
<name>张三</name>
<age>25</age>
</user_info>
可以看到结果中的<user_info>元素多了xmlns:ns声明,但这个声明在结果文档中完全没有用到,属于冗余内容。
使用exclude-result-prefixes的情况
修改XSLT样式表,添加exclude-result-prefixes属性:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://www.example.org/ns"
exclude-result-prefixes="ns">
<xsl:template match="/">
<user_info>
<xsl:apply-templates select="root/ns:user"/>
</user_info>
</xsl:template>
<xsl:template match="ns:user">
<name><xsl:value-of select="ns:name"/></name>
<age><xsl:value-of select="ns:age"/></age>
</xsl:template>
</xsl:stylesheet>
转换后的结果文档就不会包含ns命名空间的声明:
<?xml version="1.0" encoding="UTF-8"?>
<user_info>
<name>张三</name>
<age>25</age>
</user_info>
使用注意事项
- exclude-result-prefixes的值是一个以空格分隔的前缀列表,如果需要排除多个前缀,直接依次列出即可,比如exclude-result-prefixes="ns1 ns2"。
- 该属性只能排除在样式表中声明的命名空间前缀,无法排除源XML中自带的、且在结果中实际使用的命名空间前缀。
- 如果排除的前缀在结果文档中仍然被使用,那么XSLT处理器会忽略该排除配置,依然会在结果中生成对应的命名空间声明,避免文档出现命名空间错误。
- 对于XSLT默认的命名空间前缀xsl,通常不需要排除,因为它是XSLT语法的组成部分,结果文档中一般不会出现该前缀的声明。
常见使用场景
当我们需要从带命名空间的源XML中提取数据,生成不带命名空间的简洁结果文档时,exclude-result-prefixes就非常有用。比如从SOAP协议的XML响应中提取业务数据,生成自定义的简单XML结构,就可以通过该属性去掉SOAP相关的命名空间声明,让结果更清晰。
另外在生成HTML文档的XSLT转换中,如果样式表中声明了用于匹配源XML的命名空间前缀,也可以通过该属性避免这些前缀出现在生成的HTML标签属性中,防止出现无效的属性声明。
XSLT命名空间exclude-result_prefixesxmlns修改时间:2026-07-17 07:39:28