Firefox中的XPath排序

时间:2015-01-07 14:56:05

标签: xml google-chrome firefox xpath

如何在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中的|行为,而不是两者之间的区别。

2 个答案:

答案 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 questionthis one