给出测试html:
<html>
<body>
abc
<b id="b_1">def</b>
ghi
<b id="b_2">jkl</b>
<b id="b_3">mno</b><b id="b_4">qrs</b>
</body>
</html>
问题:如何选择其第一个兄弟节点为非空文本节点的所有b
元素?
因此,在上面的示例中,我希望选择元素b_1
和b_2
。
元素b_3
具有文本类型的第一个前一个兄弟节点,但它是空的。
元素b_4
具有第一个前面的兄弟节点,即元素节点。
我尝试了以下方法,但他们都至少在一方面失败了:
preceding-sibling::*[1]
将选择第一个元素节点,忽略所需的文本节点。preceding-sibling::text()[1]
将选择跳过任何元素节点的第一个文本节点。答案 0 :(得分:2)
这个XPath,
//b[preceding-sibling::node()[1][self::text()][.!='']]
将选择其前一个兄弟是非空文本节点的所有b
个元素:
<b id="b_1">def</b>
<b id="b_2">jkl</b>
按要求。
答案 1 :(得分:-1)
这个应该有效:
//b[normalize-space(./preceding-sibling::text()[1])]
normalize-space
函数检查那里存在的内容,因为preceding-sibling
可能为空,甚至只有\n
。