在Stack Overflow上研究XPath问题答案的细节时,我遇到了XPath 1.0和2.0之间的差异,我找不到理由。
我试图了解.
的真正含义。
.
是abbreviation for self::node()
。 self
和node
对我来说都很清楚。.
是主要表达“context item expression”。 Abbreviated Syntax section明确指出这是一个说明。改变的理由是什么? XPath 2.0中.
和self::node()
之间是否存在差异?
从规范本身来看,改变的意图对我来说并不清楚。我尝试使用谷歌搜索关键字,如点或句点,主要表达和基本原理。
答案 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()
。它确实需要成为一种特殊的语言结构。