ancestor轴选取当前节点所有祖先节点(不含自身),ancestor-or-self包含自身;常与谓词、位置索引、属性匹配联用,结果按文档顺序排列。

XPath 中用 ancestor 轴可以选中当前节点的所有祖先节点(即父节点、祖父节点、曾祖父节点……直到根节点),不包括自己。
ancestor轴的基本语法
格式为:axis::node-test,其中 ancestor 是轴名,node-test 用来筛选祖先节点的类型或名称。
-
//div/ancestor::*:选取所有div元素的所有祖先节点(任意元素) -
//input/ancestor::form:只选取input的form类型祖先(最近的form及其更上层的form,如果嵌套多层) -
//span/ancestor::*[1]:选取span的直接父节点(第一个祖先)
ancestor和ancestor-or-self的区别
ancestor 不包含当前节点;而 ancestor-or-self 包含当前节点本身。
-
//p/ancestor::div→ 只找p上面的div祖先 -
//p/ancestor-or-self::div→ 如果p自己就是div,也会被选中;否则等同于ancestor::div
常用配合用法
经常和谓词 []、位置索引、属性匹配一起使用:
-
//button[@id='submit']/ancestor::div[@class='modal']:找 ID 为 submit 的 button 所在的、class 为 modal 的 div 祖先 //a/ancestor::*[position() :取a的前三个祖先(父、祖父、曾祖父)-
//img/ancestor::article:快速定位图片所在的 article 容器(常用于内容提取)
注意点
ancestor 轴返回的是从**直接父节点开始,向上到根节点的路径上的所有匹配节点**,顺序是自近到远(即父节点在前,根节点在后)。但 XPath 1.0 中结果顺序是文档顺序(从上到下),实际使用中建议用 [1] 或 last() 明确取值,避免依赖默认顺序。
不复杂但容易忽略。










