如何用XPath匹配包含指定文本元素的ancestor-or-self节点?
匹配包含特定文本元素的ancestor-or-self节点:正确XPath语法
正确写法核心
要找到包含目标文本的元素的所有祖先节点(包括它自己),正确的XPath格式是:
//*[contains(text(), "目标文本")]/ancestor-or-self::*
如果只想匹配某一类节点(比如你的场景里的<p>),就把*换成对应的节点名:
//*[contains(text(), "Vertreten durch")]/ancestor-or-self::p
针对你场景的具体用法
你的示例代码是:
<p><strong>Vertreten durch:</strong><br>Max Mustermann</p>
要通过Vertreten durch这个文本匹配到父元素<p>,有两种实用写法:
- 写法一:先找到包含目标文本的
<strong>,再取它的祖先及自身(这里会返回<strong>和<p>):
//*[contains(text(), "Vertreten durch")]/ancestor-or-self::*
- 写法二:直接精准定位到
<p>节点:
//*[contains(text(), "Vertreten durch")]/ancestor-or-self::p
另外还有一种更直接的写法,直接找包含目标文本子元素的<p>:
//p[.//*[contains(text(), "Vertreten durch")]]
你之前写法出错的原因
//*ancestor-or-self::[contains(text(),"ABC")]:语法不对,ancestor-or-self::后面必须指定节点类型(比如*代表任意节点),不能直接跟条件判断。//*[contains(text(),"ABC")]/ancestor-or-self:少了节点测试,ancestor-or-self是轴,必须搭配::*或者具体节点名才能用。
内容的提问来源于stack exchange,提问作者Evgeniy
相关产品推荐
相关产品推荐

