XPath 2.0和1.0的主要区别是什么

XPath 2.0 是 XPath 1.0 的超集,核心升级包括:数据模型由节点集变为有序可重复的序列;原生支持 XML Schema 19 种类型;新增 for、if-then-else、let 等表达式;向后兼容但收紧隐式转换、函数参数类型和空序列处理。

XPath 2.0 是 XPath 1.0 的超集,核心区别在于数据模型、类型系统和表达能力的全面升级,不是简单功能叠加,而是底层设计的演进。

数据模型从“节点集”变为“序列”

XPath 1.0 返回的是无序、去重的“节点集(node-set)”,不保证顺序,也不允许重复节点;XPath 2.0 统一用“序列(sequence)”作为唯一数据类型,序列有序、可含重复项,且能混合节点与原子值(如字符串、整数、日期等)。

  • 序列中索引从 1 开始(如 $seq[1] 取第一个项)
  • 空序列写作 (),不再是 1.0 中的空节点集
  • 函数可直接返回序列,也能把序列作为参数传入下个函数(链式处理更自然)

原生支持 XML Schema 数据类型

XPath 1.0 仅支持四种基础类型:节点集、布尔值、数字(双精度浮点)、字符串;XPath 2.0 直接集成 XML Schema 19 种内置简单类型,例如:

  • xs:datexs:dateTimexs:duration
  • xs:integerxs:decimalxs:anyURI
  • 类型感知比较成为可能(如 xs:date("2025-01-01") 返回 true)

新增强大表达式结构

XPath 2.0 引入了类似编程语言的控制结构和函数式特性,显著提升逻辑表达能力:

  • 支持 for 表达式(如 for $x in //item return $x/price * $x/qty
  • 支持 if-then-else 条件表达式(非仅布尔判断,可返回任意类型值)
  • 支持变量绑定(let $total := sum(...)),可在路径中复用计算结果
  • 谓词支持更复杂逻辑,可嵌套路径、调用函数、使用变量

向后兼容但有关键例外

绝大多数 XPath 1.0 表达式在 2.0 环境中行为一致,但以下情况需注意:

  • 某些隐式类型转换被收紧(如字符串与数字混用时更严格报错)
  • concat() 等函数在 2.0 中要求所有参数为字符串,1.0 会自动转
  • 空序列参与算术运算(如 () + 5)在 2.0 中返回空序列,1.0 中可能报错或返回 NaN
  • 命名空间处理更规范,未声明前缀的 QName 使用会触发静态错误