为什么点 (.) 的定义在 XPath 1.0 和 2.0 之间发生了变化?

Why did the definition of dot (.) change between XPath 1.0 and 2.0?

在 Stack Overflow 上研究 XPath 问题答案的详细信息时,我 运行 发现 XPath 1.0 和 2.0 之间的区别,我找不到任何理由。

我试图理解 . 的真正含义。

改变的理由是什么? XPath 2.0 中的 .self::node() 有区别吗?

从规范本身来看,我不清楚更改的意图。我尝试使用谷歌搜索关键字,例如点或句号、主要表达式和基本原理。

简而言之:self::node() 过滤掉原子项,而 . 则不会。 原子项(数字、字符串和许多其他 XML 模式类型)不是节点(不同于元素、属性、注释等)。

考虑规范中的示例:(1 to 100)[. mod 5 eq 0]。如果 .self::node() 替换,则表达式不是有效的 XPath,因为 mod 要求两个参数都是数字,原子化在这种情况下没有帮助。

对于那些扫描规范的人:XPath 2.0 将 item() type-matching construct, but it has nothing to do with node tests 定义为原子不是节点,轴步总是 return 只是节点。因此,点不能定义为self::item()。它确实需要一种特殊的语言结构。

XPath 1.0 有四种数据类型:字符串、数字、布尔值和节点集。除了节点之外,没有办法处理值的集合。这意味着,例如,无法对派生值求和(如果元素具有 price='.95' 形式的属性,则无法对通过剥离 $ 符号获得的数字求和,因为结果这样的剥离会是一组数字,并没有这样的数据类型。

因此 XPath 2.0 引入了更通用的序列,这意味着必须通用化处理序列的工具;例如,如果 $X 是一个数字序列,则 $X[. > 0] 会过滤该序列以仅包含正数。但这仅适用于“。”。可以引用一个数字以及一个节点。