XPath可通过谓词配合父轴反向定位父节点,最简方式为//person/name[text()="Alice"]/..,推荐用//name[text()="Alice"]/parent::person确保类型安全,复杂条件可用布尔表达式,空白处理宜用normalize-space()。

XPath 可以通过 谓词(方括号 [])配合父轴(.. 或 parent::*),根据子节点的文本值反向定位其父节点。核心思路是:先匹配符合条件的子节点,再用 .. 跳转到它的父节点。
用 .. 直接获取父节点
这是最常用、最简洁的方式。例如,要选中所有子节点 name 的文本为 "Alice" 的 person 元素:
说明:
– //person/name[text()="Alice"] 先定位到值为 "Alice" 的 name 节点;
– /.. 表示向上取它的直接父节点,即 person。
⚠️ 注意:确保 name 是 person 的**直接子节点**,否则需调整路径层级。
用 parent::* 显式指定父轴(更严谨)
当结构较复杂或需要明确语义时,推荐用标准轴语法:
`//name[text()="Alice"]/parent::person`说明:
– //name[text()="Alice"] 匹配任意位置的 name 子节点;
– parent::person 表示该 name 的父节点必须是 person 元素;
– 这比 /.. 更安全,可避免误选非预期类型的父节点。
匹配含特定子节点文本的父节点(支持条件组合)
如果父节点需同时满足多个子节点条件,可在谓词中叠加判断:
- 选子节点
status为"active"且type为"user"的父节点:
`//*[status="active" and type="user"]` - 选包含
price子节点且其值大于 100 的product:
`//product[price > 100]`(注意:这里price是子元素,不是文本节点,无需text())
处理文本含空格或换行的情况
若子节点文本前后有空白(如 XML 中常见缩进),直接用 text()="xxx" 可能不匹配。建议用 normalize-space():
说明:
– normalize-space() 会自动去除首尾空白,并将中间连续空白压缩为单个空格;
– 对齐 HTML/XML 中因格式化产生的多余空白,提升鲁棒性。
基本上就这些。关键就是“先找子,再上跳”,用好 .. 或 parent::,再结合 normalize-space() 和布尔表达式,就能准确按子内容定位父节点。










