Xpath:如何将这两个子节点组合起来得到父节点?

Xpath: How to combine these two child node to get parent node?

我是 XPath 的新手并且很困惑。任何人都可以快速浏览一下,看看我的语法有什么问题吗?

我正在尝试 select id="list-overview" 的所有直接子节点 div's,它们在树下某处有两个子节点,包含 data-price<=20a div containing "Orange" text

let xy = $x(`//*[@id="list-overview"]/div[./div/a/div/div/div[@data-price<=20]][./div/a/div/div[@class='fruit'][contains(.,'Orange')]])`)

将其分解。我已经分别测试了这两个并且它们有效。

`//*[@id="list-overview"]/div[./div/a/div/div/div[@data-price<=20]]`
`//*[@id="list-overview"]/div[./div/a/div/div[@class='fruit'][contains(.,'Orange')])]`

我似乎无法以某种方式将它们组合起来,也不确定我做错了什么?

编辑:

尝试了这些建议,下面的 xpath 不再抛出异常。但是它 returns 空数组,而有元素匹配 price < 20 和 fruit="Orange"

$x(`//*[@id="list-overview"]/div[./div/a/div/div/div[@data-price<=20] and ./div/div/a/div/div[@class='fruit'][contains(.,'Orange')]]`)

如果我理解你的想法,你就错过了这两个条件之间的逻辑 and。我相应地更正了 XPath 表达式。请试试这个:

let xy = $x(`//*[@id="list-overview"]/div[./div/a/div/div/div[@data-price<=20] and ./div/a/div/div[@class='fruit'][contains(.,'Orange')]])`)

UPD
请试试这个:

let xy = $x(`//*[@id="list-overview"]/div[.//div[@data-price<=20] and .//div[@class='fruit'][contains(.,'Orange')]])`)

而不是这个

$x(//*[@id="list-overview"]/div[./div/a/div/div/div[@data-price<=20]][./div/a/div/div[@class='fruit'][contains(.,'Orange')]]))

你可以这样做来将它们结合起来,

紧密耦合 child

$x(//*[@id="list-overview"]/div[./descendant::div[@data-price<=20]] and [./div/a/div/div[@class='fruit'][contains(.,'Orange')]])

或者拥有其中之一,但您仍想继续进行。

$x(//*[@id="list-overview"]/div[./descendant::div[@data-price<=20]] or [./div/a/div/div[@class='fruit'][contains(.,'Orange')]])

另外,我加入了 descendant 以使其更具可读性。