following-sibling和preceding-sibling是XPath中用于定位同一父元素下前后同级兄弟节点的轴,前者匹配当前节点之后、后者匹配之前按文档顺序出现的兄弟节点,均不跨父级且支持索引过滤,关键在于限定同父级和文档先后顺序。

XPath 中的节点关系描述的是 XML 或 HTML 文档中元素之间的位置和层级联系,比如父子、兄弟、祖先、后代等。其中 following-sibling 和 preceding-sibling 是专门用来定位“同级元素”的轴(axis),它们不看层级深浅,只看在源文档中出现的先后顺序。
following-sibling:找后面同辈的兄弟节点
这个轴选取的是当前节点之后、在同一父元素下的所有后续兄弟节点(不包括自身,也不跨父级)。
- 匹配范围仅限于**同一个父元素内**,且必须在当前节点的**闭合标签之后、父元素结束之前**出现的同级元素
- 支持带索引,比如
following-sibling::div[1]表示紧挨着的下一个div兄弟;following-sibling::*[2]表示第二个任意类型的兄弟节点 - 注意:文本节点、注释、处理指令也算节点,但通常用
*或具体标签名来过滤
preceding-sibling:找前面同辈的兄弟节点
与 following-sibling 相反,它选取当前节点之前、同一父元素内的所有前面的兄弟节点(从后往前查,但结果按文档顺序返回)。
- 同样要求在同一父元素下,且位于当前节点起始标签之前
-
preceding-sibling::p[last()]可以选到该节点之前最后一个p标签(即离它最近的那个前面的p) - 不能跳过父容器——比如某个
span的 preceding-sibling 永远不会包含它爷爷辈下的其他元素
别和 parent/child 轴搞混
兄弟轴(sibling)只管“平级”,不管上下级。例如:
-
parent::*往上找爸爸,child::div往下找儿子 -
following-sibling::div是找“堂兄弟”(更准确说是“亲兄弟”),不是找叔叔或侄子 - 如果想跨层级找类似结构的元素,得组合使用,比如
../following-sibling::div(先上到父级,再找父级的后续兄弟中的 div)
基本上就这些。用对 sibling 轴的关键是盯住“同一个父元素”和“文档中前后位置”,不复杂但容易忽略上下文约束。











