XPath中用position() mod 2判断节点奇偶:加括号(//Xxx)[...]实现全文统一编号,不加则按父节点内独立计数;position()从1开始,奇数为mod 2 = 1,XPath 1.0必须用mod而非%。

XPath 中可以通过 position() 函数配合取模运算(mod)来选择位置为奇数或偶数的节点,但要注意:**position() 是相对当前上下文节点列表的位置,不是全局文档序号**,且只在谓词(方括号 [])中有效。
选择奇数位置的节点(第 1、3、5… 个)
使用 position() mod 2 = 1:
-
//div/p[position() mod 2 = 1]→ 选中每个下的第 1、3、5… 个(//li)[position() mod 2 = 1]→ 注意括号!先取全部节点为一个序列,再取其中奇数位(整个文档中第 1、3、5… 个)选择偶数位置的节点(第 2、4、6… 个)
用
position() mod 2 = 0:-
//tr/td[position() mod 2 = 0]→ 每行中第 2、4、6… 个单元格 -
(//item)[position() mod 2 = 0]→ 整个文档中所有的第 2、4、6… 个
关键细节和常见误区
⚠️ 注意以下几点,避免结果不符合预期:
- 没加括号时,
//div/p[position() mod 2 = 1]是「每个内部独立计数」,不是全文统一编号- 想按全文顺序筛选,必须先用括号生成完整节点集:
(//Xxx)[...]- position() 从 1 开始计数(不是 0),所以奇数是
mod 2 = 1,不是= 0- 在 XPath 1.0(主流浏览器和多数库默认)中,不支持
%符号,必须用mod实用小技巧:隔行变色或抽样提取
例如给表格奇数行加样式(CSS 不适用,但可用于 XSLT 或爬虫逻辑):
- XPath 提取奇数行内容:
(//table//tr)[position() mod 2 = 1]/td[1]/text() - 跳过第一行(表头),取后续奇数行(即第 3、5、7… 行):
(//tr)[position() > 1 and position() mod 2 = 0]
基本上就这些。核心就是括号控制作用域 +
position() mod 2判断奇偶,不复杂但容易忽略括号的影响。 - 想按全文顺序筛选,必须先用括号生成完整节点集:










