【问题标题】:How does XPath deal with attributes which have conflicting expanded names?XPath 如何处理扩展名称冲突的属性?
【发布时间】:2021-08-14 07:15:50
【问题描述】:

鉴于以下文件...

<?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 规范中的一个灰色区域。我什至经历了两个节点序列的返回,乍一看,这是一个意想不到的结果。

参考资料:

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

【问题讨论】:

    标签: xml xpath-3.1


    【解决方案1】:

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

    如果属性实际上是冲突的,例如如果你有一个元素,该怎么办

        <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:数据模型支持符合 [Namespaces in XML] 或 [Namespaces in XML 1.1] 的格式良好的 XML 文档。

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

    所以答案是,如果您的系统允许您在非命名空间格式良好的文档上执行 XPath 表达式(很可能就是这种情况,例如/默认情况下某些 DOM 实现不支持命名空间),然后 XPath 规范明确表示所有赌注都没有。

    【讨论】:

      猜你喜欢
      • 2019-09-27
      • 1970-01-01
      • 2015-02-16
      • 2020-08-16
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      相关资源
      最近更新 更多