XPath 3.1有哪些重要的新功能

XPath 3.1 在3.0基础上新增动态函数调用、原生map/array类型、增强正则与字符串处理、更自然的条件及流式序列操作,提升Web抓取与数据处理能力。

XPath 3.1 在 XPath 3.0 基础上进一步拓展了表达能力与实用性,尤其面向现代 Web 抓取、动态内容解析和复杂数据处理场景。它不是简单语法微调,而是引入了几个关键性增强,让路径选择更灵活、逻辑更紧凑、处理更贴近编程习惯。

支持动态函数调用(fn:apply()
你可以把函数当作值来传递和执行。比如先用 function-lookup() 获取某个函数引用,再用 apply() 带参数调用——这在需要根据条件切换处理逻辑时特别有用。

  • 不再需要写一堆 if/else 分支去选不同函数
  • 可配合高阶函数(如 map:for-each, array:for-each)构建可复用的数据管道

原生映射(map)与数组(array)类型
XPath 3.1 首次将 map{}array{} 作为一级数据类型纳入标准:

  • map{"name": "Alice", "age": 30} 支持键值查找、合并、过滤
  • array{1, 2, 3} 支持索引访问($arr[1])、切片($arr[2 to 4])、遍历
  • 可直接用 ?key 语法取 map 值,?* 展开所有条目

增强的正则与字符串处理能力

  • matches(), replace(), analyze-string() 全面支持 PCRE 风格正则(含命名捕获组、Unicode 类 \p{L}
  • 新增 collation 参数,支持按语言规则排序或比较(如中文拼音序、德语变音处理)
  • string-join() 支持指定分隔符 + null 过滤选项

条件表达式与流式序列操作更自然

  • if … then … else 成为真·表达式(可嵌套在任意位置,返回任意类型)
  • for $x in … return … 支持多变量绑定(类似 Python 的 for x, y in zip(a, b)
  • some $x in … satisfies …every $x in … satisfies … 可直接用于断言判断

基本上就这些。不复杂但容易忽略:这些功能在 Scrapy 2025、lxml 4.9+、Saxon HE 12 等主流工具中已默认启用,只要文档声明 xpath-version="3.1" 就能用。