XPath 1.0和2.0中为什么“.”的定义发生了改变?

7
当我在Stack Overflow上研究XPath问题的细节时,我遇到了XPath 1.0和2.0之间的差异,但我找不到任何理由。我试图理解点符号“.”的真正含义。
在XPath 1.0中,.self::node()的缩写。对我来说,selfnode都非常清晰易懂。
在XPath 2.0中,.是主表达式“上下文项表达式”。缩写语法章节明确指出了这一点。

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

从规范本身来看,我不清楚这个改变的意图。我尝试搜索关键词如点或句号,主表达式和理由。

2个回答

5
XPath 1.0有四种数据类型:字符串、数字、布尔和节点集。除了节点以外,无法处理其他值的集合。这意味着,例如,没有办法对导出的值求和(如果元素具有形式为price='$23.95'的属性,则没有办法对通过去掉$符号获得的数字求和,因为这样剥离的结果将是一组数字,而没有这样的数据类型)。
因此,XPath 2.0引入了更通用的序列,这意味着必须对操作序列的工具进行泛化;例如,如果$X是一系列数字,则$X[. > 0]过滤序列以仅包括正数。但是,只有当“.”既可以指代节点又可以指代数字时,才能起作用。

4
简而言之,self::node()会过滤掉原子项,而.则不会。原子项(数字、字符串和许多其他XML Schema类型)不是节点(与元素、属性、注释等不同)。考虑规范中的示例:(1 to 100)[. mod 5 eq 0]。如果将.替换为self::node(),则表达式不是有效的XPath,因为mod要求两个参数都是数字,原子化在这种情况下无法帮助。对于那些扫描规范的人:XPath 2.0定义了item()类型匹配构造,但它与节点测试无关,因为原子不是节点,轴步骤始终只返回节点。因此,点不能被定义为self::item()。它确实需要一个特殊的语言构造。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接