XPath 如何处理具有冲突扩展名称的属性?

How does XPath deal with attributes which have conflicting expanded names?

鉴于以下文档...

<?xml version="1.1"?>
<doc xmlns="https://www.example.com" xmlns:n1="https://www.example.com"
     a="1"
     n1:a="2"/>

... (Q1) 这个 xpath 3.1 表达式的规范结果是什么..

n2:doc/@n2:a

...如果上下文节点是文档,并且名称空间绑定 xmlns:n2="https://www.example.com" 附加到 xpath 处理器?

(Q2) 表达式呢...

doc/@a

...在 xpath 处理器上具有 xmlns="https://www.example.com" 的命名空间绑定?

我试过的

我在各种不同的 xpath 实现中得到了不一致的结果,这表明这是 XPath 规范中的一个灰色区域。我什至经历过 return 两个节点的序列,乍一看,这是一个意想不到的结果。

参考文献:

  1. https://www.w3.org/TR/2006/REC-xml-names11-20060816
  2. https://www.w3.org/TR/2017/REC-xpath-31-20170321/

您的示例中的属性没有冲突,因为没有前缀的属性不在命名空间中,不在包含元素的默认命名空间中。如果前缀 n2 绑定到命名空间 https://www.example.com@n2:a 将 select 命名空间属性; @a 将始终 select 无命名空间属性。 (如果您从一个实现中看到不同的行为,那就是错误的。)

如果属性实际上存在冲突怎么办,例如,如果您有一个元素

    <doc xmlns:n0="https://www.example.com" 
         xmlns:n1="https://www.example.com" 
         n0:a="1" 
         n1:a="2"/>

并通过非名称空间感知的 XML 解析器进行处理?

答案是输入违反了 XDM 规范中的约束,该规范定义了 XPath 的数据模型。 XDM 3.1 的一些引述:

§2.7:与本数据模型中描述的其他一致性约束一样,满足这些约束是前提条件;规范不会推测如果不是这样会发生什么。

§3:数据模型支持格式良好的 XML 文档,符合 [XML 中的命名空间] 或 [XML 1.1 中的命名空间]。

§6.2.1:元素节点必须满足以下约束。 (2) 元素的属性节点必须有不同的xs:QNames.

所以答案是,如果您的系统允许您在命名空间格式不正确的文档上执行 XPath 表达式(很可能是这种情况,例如/一些 DOM 实现不是命名空间-默认情况下知道),然后 XPath 规范明确表示所有赌注都已关闭。