XPath 3.1如何处理扩展名称冲突的属性?两类查询用例求规范结果
结论依据核心规则
XML 命名空间规范明确规定:无前缀的属性名称不继承默认命名空间,仅无前缀的元素名称会应用上下文绑定的默认命名空间。XPath 节点匹配时仅比较命名空间URI和本地名称,与原始XML中使用的前缀无关。
Q1 执行结果
返回单个属性节点,值为 2。
解析:
- XPath 中
n2绑定的命名空间URI与XML中doc元素的所属命名空间URI完全一致,因此n2:doc可以匹配到目标根元素。 @n2:a匹配命名空间URI为https://www.example.com、本地名称为a的属性,对应XML中n1:a="2"的属性节点。
Q2 执行结果
返回单个属性节点,值为 1。
解析:
- 默认命名空间仅作用于元素,因此
doc可以匹配到属于对应命名空间的根元素。 - 无前缀的属性选择器
@a仅匹配无命名空间、本地名称为a的属性,对应XML中a="1"的属性节点。
多实现结果不一致的原因
部分XPath实现存在不符合规范的bug:要么错误地将默认命名空间应用到无前缀属性匹配逻辑,要么错误地用前缀字符串而非命名空间URI做匹配,才会出现返回两个节点等异常结果,该场景并非规范灰色地带,符合标准的实现结果唯一。
内容的提问来源于stack exchange,提问作者Sean B. Durkin
相关产品推荐
相关产品推荐

