XPath怎么选择在文档中位置为奇数或偶数的节点

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 判断奇偶,不复杂但容易忽略括号的影响。