【问题标题】:Why did the definition of dot (.) change between XPath 1.0 and 2.0?为什么点 (.) 的定义在 XPath 1.0 和 2.0 之间发生了变化?
【发布时间】:2016-09-02 19:57:30
【问题描述】:
在 Stack Overflow 上研究 XPath 问题答案的详细信息时,我遇到了 XPath 1.0 和 2.0 之间的差异,我找不到任何理由。
我试图理解. 的真正含义。
改变的理由是什么? 在 XPath 2.0 中 . 和 self::node() 有区别吗?
从规范本身来看,我并不清楚更改的意图。我尝试用谷歌搜索关键字,如点或句点、主要表达方式和基本原理。
【问题讨论】:
标签:
xpath
language-lawyer
xpath-2.0
【解决方案1】:
XPath 1.0 有四种数据类型:字符串、数字、布尔值和节点集。除了节点之外,没有办法处理值的集合。这意味着,例如,无法对派生值求和(如果元素具有price='$23.95' 形式的属性,则无法对通过剥离 $ 符号获得的数字求和,因为这种剥离的结果将是一组数字,并且没有这样的数据类型)。
所以 XPath 2.0 引入了更通用的序列,这意味着操作序列的工具必须通用化;例如,如果 $X 是一个数字序列,则 $X[. > 0] 过滤该序列以仅包含正数。但这仅适用于“。”既可以指数字,也可以指节点。
【解决方案2】:
简而言之:self::node() 会过滤掉原子项目,而 . 不会。 原子项目(数字、字符串和许多其他 XML Schema 类型)不是节点(与元素、属性不同) 、cmets 等)。
考虑规范中的示例:(1 to 100)[. mod 5 eq 0]。如果. 被self::node() 替换,则表达式不是有效的XPath,因为mod 要求两个参数都是数字,而原子化在这种情况下没有帮助。
对于那些扫描规范的人:XPath 2.0 定义了item() 类型匹配结构,但它与node tests 无关,因为原子不是节点,轴步骤总是只返回节点。因此,点不能定义为self::item()。它确实需要一种特殊的语言结构。