在XPath中,上下文节点是指当前正在处理的节点,通常在使用模板匹配或循环遍历时出现。如果只想在上下文节点内部查找,可以使用相对路径;但若要选取上下文节点之外的节点,最直观的方法就是使用绝对路径。绝对路径以单斜杠 / 开头,表示从文档根节点开始向下搜索,完全忽略当前的上下文节点位置。

什么是XPath绝对路径
绝对路径是指从文档根节点(即 / 表示的节点)出发,一层层写清楚元素层级的路径表达式。例如 /html/body/div 表示无论当前上下文在哪里,都从根节点找 html,再找 body,再找 div。由于它不依赖上下文,因此能够轻松选择上下文节点之外的任意节点。
相对路径与绝对路径对比
| 类型 | 起始位置 | 是否受上下文影响 | 示例 |
|---|---|---|---|
| 相对路径 | 当前上下文节点 | 是 | ./p 或 p |
| 绝对路径 | 文档根节点 | 否 | /html/body/ul/li |
如何使用绝对路径选择外部节点
假设我们在处理一个 <li> 节点,上下文是该 li,但我们需要获取页面顶部的标题文字,就可以直接用绝对路径:
<!-- 示例XML文档 -->
<root>
<header>
<title>示例站点</title>
</header>
<list>
<li>项目一</li>
<li>项目二</li>
</list>
</root>
<!-- 在匹配到 li 的上下文中,使用绝对路径选取 title -->
/root/header/title/text()
上述表达式从根节点开始,不受当前 li 上下文限制,成功拿到了 header 中的 title 文本。
在代码中调用绝对路径
以Python的lxml库为例,演示如何用绝对路径忽略上下文提取节点:
from lxml import etree
xml_data = """
<root>
<header><title>示例站点</title></header>
<list>
<li>项目一</li>
<li>项目二</li>
</list>
</root>
"""
tree = etree.fromstring(xml_data.encode())
# 假设我们先用相对路径拿到一个li作为上下文
li_nodes = tree.xpath("//li")
for li in li_nodes:
# 在li上下文中,用绝对路径获取title
title = li.xpath("/root/header/title/text()")
print(li.text, title)
注意事项
- 绝对路径以 / 开头,若写成 // 则是从任意节点匹配,不属于严格绝对路径。
- 当文档结构变动时,绝对路径可能因层级改变而失效,需要维护完整路径。
- 在XSLT或循环中,使用绝对路径可避免不小心选中上下文子节点,提高表达式可读性。
总之,想要选择上下文节点之外的节点,只需在XPath表达式开头使用 / 并从根描述目标位置,即可稳定跨越上下文边界完成提取。