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

时间:2016-09-02 19:57:30

标签: xpath language-lawyer xpath-2.0

在Stack Overflow上研究XPath问题答案的细节时,我遇到了XPath 1.0和2.0之间的差异,我找不到理由。

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

改变的理由是什么? XPath 2.0中.self::node()之间是否存在差异?

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

2 个答案:

答案 0 :(得分:4)

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

因此XPath 2.0引入了更多通用序列,这意味着必须推广用于操作序列的工具;例如,如果$ X是一个数字序列,那么$X[. > 0]会过滤序列以仅包含正数。但这只适用于"。"可以引用一个数字以及一个节点。

答案 1 :(得分:3)

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

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

对于扫描规范的人:XPath 2.0定义了item()类型匹配构造,但它与node tests无关,因为原子不是节点,轴步骤总是只返回节点。因此,点不能定义为self::item()。它确实需要成为一种特殊的语言结构。