紧接在前的兄弟必须包含属性

时间:2014-12-08 17:33:04

标签: xpath

这是我的XML文件:

<w type="fruit-hard">apple</w>
<w type="fruit-soft">orange</w>
<w type="vegetable">carrot</w>

我需要在兄弟姐妹面前找到胡萝卜,其类型是果实柔软。在Chrome(本地加载的XML文件)中,当我尝试

$x("//w[@type='vegetable']/preceding-sibling::w[1]")

我得到&#34;橙&#34;像我想要的元素节点,但我怎么要求它的类型是&#34;果实柔软&#34;?我的尝试(下面)返回&#34; false。&#34;

$x("//w[@type='vegetable']/preceding-sibling::w[1] and preceding-sibling::w[@type='fruit-soft']")

1 个答案:

答案 0 :(得分:2)

你最初的XPath ......

//w[@type='vegetable']/preceding-sibling::w[1]

......相当于

//w[@type='vegetable']/preceding-sibling::w[position()=1]

。您可以根据需要向谓词添加其他条件:

//w[@type='vegetable']/preceding-sibling::w[position()=1 and @type='fruit-soft']

或者您可以添加一个单独的谓词

//w[@type='vegetable']/preceding-sibling::w[1][@type='fruit-soft']

请注意此尝试:

//w[@type='vegetable']/preceding-sibling::w[1] and preceding-sibling::w[@type='fruit-soft']

返回false,因为and两侧的部分分别进行评估,转换为boolean类型,并合并产生最终结果。假设对其进行评估的上下文节点是文档根,则永远不会有与preceding-sibling::w[@type='fruit-soft']匹配的节点。此外,即使存在这样的节点,该表达式也不要求与第一部分匹配的节点与匹配第二部分的节点相同。