XPATH——由查询定义的结果顺序

phi*_*ipp 3 xpath

我有一个像这样的 xpath 表达式:

\n\n

element[@attr="a"] | element[@attr="b"] | element[@attr="c"] | \xe2\x80\xa6这是一个 \xc2\xbbor\xc2\xab 语句。那么,我是否可以创建一个表达式来保证结果按照查询中的顺序出现,即使元素在文档中以不同的顺序出现?

\n\n

fe 按以下顺序创建文档片段:

\n\n
<doc>\n    <element attr="c" />\n    <element attr="b" />\n    <element attr="a" />\n    .\n    .\n    .\n</doc>\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果列表排序如下:

\n\n
[0] <element attr="a" />\n[1] <element attr="b" />\n[2] <element attr="c" />\n.\n.\n.\n
Run Code Online (Sandbox Code Playgroud)\n

Mar*_*nen 5

|运算符计算其操作数的并集,在 XPath 1.0 中,您只需得到一组节点,顺序是未定义的,尽管大多数 XPath API 然后按文档顺序返回结果,或者允许您说出您想要的顺序或顺序是否重要(例如,请参见http://www.w3.org/TR/DOM-Level-3-XPath/xpath.html#XPathResult)。

使用 XPath 2.0,您可以获得按文档顺序排序的节点序列,使用 XPath 2.0,如果您想要子表达式的顺序,则需要使用逗号运算符,而不是联合运算符 ie element[@attr="a"] , element[@attr="b"] , element[@attr="c"]

例如,/doc!(element[@attr="a"] , element[@attr="b"] , element[@attr="c"])您可以按所需的顺序获得元素节点。

XPath 3.1 在线小提琴

当然你也可以对 XPath 3.1 中的元素进行排序,例如

sort(/doc/element, (), function($el) { $el/@attr })
Run Code Online (Sandbox Code Playgroud)