如何在Firefox中进行XPath(1)单行优先级排序工作?为什么|
"失败"在Firefox中但是"工作"在Chrome?
哪一项是正确的(如果规范中定义了这种行为)以及如何让它全面运作?
<a>b</a>
<a id="b"></a>
Chrome 39.0.2171.95
> $x("//a[@id='b'] | //a[text()='b']")
< [<a id="b"></a>, <a>b</a>]
Firefox 34.0.5
> $x("//a[@id='b'] | //a[text()='b']")
< Array [ <a>, <a#b> ]
修改:删除了or
选择器示例,因为问题是关于Firefox中的|
行为,而不是两者之间的区别。
答案 0 :(得分:1)
| operator不是或者,它是一个联合,因此节点集将包含左手xpath(管道左侧)和右侧xpath选择的元素子集。
选择器
"//a[@id='b' or text()='b']"
读取:按照它们在DOM中出现的顺序遍历所有“a”元素并评估谓词[..],如果谓词的计算结果为“true”,则将遍历的元素添加到结果节点集
选择器
"//a[@id='b'] | //a[text()='b']"
读取:应用// [[id ='b'](如上所述),然后应用// [text()='b']并最终将结果连接在一起,返回包含两者的节点集结果
结果中元素的顺序与traversion相同,即它保留了文档中的顺序,但是union不包含重复项(因为节点集可能不包含重复项),即// a | // a导致相同的节点集
但是,没有定义union(|)应该如何处理顺序,因此它可以实现,因此您在Chrome与FF中看到不同的结果
答案 1 :(得分:1)
我只能引用Michael Kay博士,saying:
XPath 1.0规范定义了路径表达式(或 union expression)返回一个节点集,即一组无序节点。 某些宿主语言(例如XSLT 1.0)始终指定节点集 按文件顺序处理。但你出现(据我所知) 从某些Microsoft API调用XPath,我不知道该API说的是什么 关于处理顺序:它可以通过XPath宿主语言来定义它, 或者它可以选择不定义。
并且,如果主流浏览器应该采用XPath 2.0:
XPath 2.0中的这一变化,它指定了路径表达式和联合 表达式按文档顺序返回一系列不同的节点。
在您的情况下,这只是意味着:如果结果集和重复项的顺序对您很重要,请不要使用|
或union
运算符。如果这样的表达式以相同的顺序返回Firefox和Chrome,则使用包含or
的谓词(您现在已经编辑过的路径表达式)。
但一般来说,无法保证节点集的文档顺序,因为无序是集合的属性:
第二个重点是列出元素的元素的顺序是无关紧要的(与序列或元组不同)(来自:Set(mathematics))。
然而,许多XPath 1.0的实现都会返回&#34; items&#34;在文档顺序中的节点集中 - 不是因为规范要求它们这样做,而是因为在许多情况下,按文档顺序返回结果确实有意义。
已经有几个非常相似的问题,例如this question或this one。