XPath的in-scope-prefixes()函数主要用于获取当前节点上下文中所有处于作用范围内的命名空间前缀,在处理带命名空间的XML文档时非常实用,能有效解决命名空间前缀匹配的相关问题。

函数基本语法
in-scope-prefixes()函数的语法格式非常简单,它接受一个节点作为参数,也可以不传入参数默认使用当前上下文节点,函数返回的是一个包含多个命名空间前缀的字符串序列。
语法格式如下:
in-scope-prefixes(node?)
参数说明:
- node:可选参数,表示要查询作用域前缀的目标节点,如果不传入该参数,默认使用当前XPath表达式执行的上下文节点。
- 返回值:返回一个字符串序列,每个字符串对应一个当前节点作用域内可用的命名空间前缀,不包含默认的空前缀(即没有前缀的默认命名空间)。
使用场景说明
当XML文档中使用了多个命名空间,并且不同节点可能处于不同的命名空间作用域时,我们可能需要动态获取当前节点可用的命名空间前缀,避免手动硬编码前缀导致错误。比如以下场景会用到该函数:
- 编写通用的XSLT模板,需要适配不同命名空间结构的XML文档。
- 在XPath查询中需要动态拼接带命名空间的路径表达式。
- 调试XML解析逻辑,查看当前节点的命名空间作用域情况。
实际使用示例
示例1:基础XML文档中使用
首先准备一个带命名空间的的基础XML文档,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:ns1="http://example.org/ns1" xmlns:ns2="http://example.org/ns2">
<ns1:child>内容1</ns1:child>
<ns2:child>内容2</ns2:child>
</root>
如果我们对root节点执行in-scope-prefixes()函数,会返回ns1和ns2两个前缀,对应的XPath表达式如下:
in-scope-prefixes(/root)
执行该表达式的返回结果是ns1和ns2两个字符串组成的序列。
示例2:XSLT中使用该函数
在XSLT模板中,我们可以通过该函数动态获取当前节点的命名空间前缀,再结合namespace-uri-for-prefix()函数获取对应的命名空间URI,示例XSLT代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<result>
<xsl:for-each select="in-scope-prefixes(.)">
<prefix>
<name><xsl:value-of select="."/></name>
<uri><xsl:value-of select="namespace-uri-for-prefix(., ..)"/></uri>
</prefix>
</xsl:for-each>
</result>
</xsl:template>
</xsl:stylesheet>
上述XSLT会遍历根节点所有作用域内的前缀,输出每个前缀对应的名称和其绑定的命名空间URI。
注意事项
- 该函数返回的前缀不包含默认的空前缀,即使当前节点有默认命名空间(没有前缀的xmlns定义),也不会在返回结果中出现。
- 不同XPath版本对该函数的支持情况不同,XPath 2.0及以上版本原生支持该函数,XPath 1.0没有该函数,使用时需要确认解析器支持的XPath版本。
- 如果传入的节点不存在,函数会返回空序列,不会抛出异常。
- 前缀的作用域遵循XML命名空间的嵌套规则,子节点会继承父节点的命名空间前缀定义,除非子节点重新定义了同名前缀覆盖父节点的定义。
XPathin-scope-prefixes()XML命名空间XML解析XSLT修改时间:2026-07-03 20:03:24