如何编写相对XPath仅选中顶级classname元素 不匹配嵌套同类元素
符合要求的相对XPath表达式
核心写法(适用于class属性仅为classname的场景):
.//el[@class='classname' and not(ancestor::el[@class='classname'])]
如果class属性存在其他附加类,为避免部分匹配错误可以用兼容写法:
.//el[contains(concat(' ', @class, ' '), ' classname ') and not(ancestor::el[contains(concat(' ', @class, ' '), ' classname ')])]
逻辑说明
- 筛选规则:
not(ancestor::el[匹配class规则])条件会过滤掉所有上层存在同类el元素的嵌套节点,最终只保留没有同类祖先的顶层el元素,刚好匹配你要的2个顶级节点需求 - 相对路径适配:路径开头的
.代表当前上下文节点,满足两种使用场景:- 上下文为两个顶级el的共同父节点时:执行该XPath会返回全部2个顶层el元素
- 上下文已经预先匹配到某一个顶层el时:因为该节点本身没有同类el祖先,执行该XPath会匹配到节点自身,不会返回嵌套的子节点,符合追加后仍生效的要求
内容的提问来源于stack exchange,提问作者tisen
相关产品推荐
相关产品推荐

