本节摘要:版本不是学完 1.0 就该自动升级。lxml、浏览器、默认 Java 停在 1.0,这是生产现实。2.0 给你类型、变量、序列。3.0 加函数项、箭头运算符、try-catch,并开始认真对待 JSON 数据模型;3.1 补 map/array 细节与流式。趋势是 JSON 工作负载变多,但 XML 管道不会消失。合并原文 5.3 与 5.4:选引擎先于选语法糖。
阅读完本节,你应当能够:
原文集把 3.0 的动机写得很具体:数据模型扩展到 JSON;新函数与运算符;函数项、箭头 =>、try-catch。3.1 在 3.0 上加流式和边角。学习 3.0 的人可以认为 3.1 是增强版,核心同一套。
在 lxml 里写:
//book/price => number() => . > 35
不会跑。箭头是 3.0。1.0 老老实实 book[number(price)>35]。
我给的默认:对外交付、开源示例、不确定调用方引擎时,写 1.0。团队统一 Saxon 或 XQuery 数据库时,2.0 起步,3.1 按需。不要为了箭头把整个栈换掉——箭头只是少一层嵌套括号。
| 版本 | 你得到的 | 典型引擎 | 值得换吗 |
|---|---|---|---|
| 1.0 | 路径、轴、谓词、核心函数 | lxml、浏览器、默认 Java | 默认就在这 |
| 2.0 | 类型、let、日期、正则、序列 | Saxon、XQuery 1.0 | 要日期/正则再换 |
| 3.0 | 箭头、try-catch、函数项、JSON 开始 | Saxon 较新 | 有 JSON 树或想少括号 |
| 3.1 | map/array 完善、流式 | Saxon 3.1 | 大文档流式变换 |
原文 5.3 点名的实用特性:
=>:title => normalize-space() => string-length() 从左往右读,比从里往外嵌可读流式(3.1):不能随意 // 回看整棵树,表达式要能向前消费。这是编译器约束,不是风格问题。大文件变换才值得碰。
⚠️ 常见坑:把 3.0 JSON 查询想象成「XPath 直接打开点 json 文件」。要引擎把 JSON 建成 map/array 数据模型。文本文件不是树,除非你先 parse。
💡 关键直觉:版本是引擎能力的标签。语法糖不驱动升级;日期、正则、JSON 模型、流式这些能力缺口才驱动。

选 1.0:页面抓取、lxml 清洗、浏览器书签脚本、给未知消费者的库。本教程前四章够用。
选 2.0:字段是真日期、要正则、要 let、有 Schema-aware 需求、已在 XQuery/XSLT 2 栈。
选 3.1:同一套查询要打 XML 和 JSON,或大文档必须流式。这是专项,不是「学完 XPath 的自然结局」。
未来趋势(原文 5.4 的有用部分):JSON 会占更多 API;XPath 3.1 想当跨模型查询;但 CSS 选择器在 HTML 上更流行,XPath 在 HTML 自动化里会继续和 CSS 分工。XML 不会因为趋势文章而从配置和文档交换里消失。把时间花在把 1.0 路径写准、把命名空间绑上,比追箭头运算符回报高。
学完本教程,若要加深:拿真实一份带默认命名空间的 SOAP 响应,绑前缀抠字段;再拿一份 HTML 列表,用相对卡片路径取标题。这两份练习比阅读 3.1 规范更能暴露空结果。
社区有草案讨论,未成为你现在该写的生产语法。忽略,直到你的引擎发布支持说明。
可以两个引擎并存,但表达式文件要标注版本。混在一个字符串池里,运行时才爆未知函数,排查成本高于分开。
箭头运算符让嵌套函数从左往右读,好看。它不解决选不中、命名空间和 // 扫树。为箭头换栈,是用工程成本买可读性,多数团队不划算。try-catch 对脏 number 有用,2.0 部分场景已有动态错误,3.0 写起来更像程序。函数项让路径能传回调,真正需要时你多半已经在 XQuery 模块里写函数,不一定要 3.0 的内联函数项。
JSON 支持的正确理解是:引擎把 JSON 建成 map 与 array 数据模型,再用查找而不是轴。不是把 1.0 路径对着点 json 文本文件扫。API 以 JSON 为主、偶尔 XML 时,统一用 3.1 有吸引力;纯抓 HTML 的脚本没有理由上。流式约束路径不能随意回看整棵树,这是编译器说了算。大文件变换才值得碰流式,小配置文件上开启流式只会给自己加限制。
默认策略写成团队一句话:对外交付 1.0;内部 Saxon 管道 2.0 起步;JSON 与流式按需 3.1。表达式文件标注版本,禁止混在一个无标注字符串池里运行时才爆未知函数。XPath 4 有草案就忽略,直到引擎发布支持说明。
趋势文章会说 JSON 取代 XML。配置、文档交换、行业报文、XSLT 出版管道里 XML 仍在。CSS 在 HTML 自动化里更流行,XPath 与它分工而不是被消灭。把时间花在把 1.0 路径写准、把命名空间绑上、把双斜杠收掉,比追 3.1 特性表回报高。学完本教程的验收不是能背版本表,而是能对一份带默认空间的 SOAP 响应绑前缀抠出字段,再对一份 HTML 列表用相对卡片路径取标题。
混用两个引擎可以,但文件要分开。1.0 夹具用书店三本;2.0 夹具再加日期字段。不要用同一份无类型样本去证明 3.1 的 map 查询——那证明不了。
需求仍是贵书书名。1.0:/bookstore/book[number(price)>35]/title。lxml、浏览器、默认 Java 都能跑。2.0 可写成 let 绑定阈值,日期字段可换 gt。3.0 可把 number 和比较用箭头从左往右读。功能相同,引擎成本不同。为箭头换 Saxon,多数抓取项目不划算。为日期类型换,若字段真是 ISO 日期,划算。为 JSON 换,若工作负载已是 map/array,划算。先列能力缺口,再列语法糖。缺口为空就停在 1.0。
故意把箭头抄进 lxml,记下报错。把这记成版本问题。JSON 文件当文本扫 1.0 路径不会得到对象查找。流式模式下双斜杠回看可能被禁,小配置文件不要开流式给自己加锁。对外交付标注 1.0。混池无标注会在运行时才爆。XPath 4 草案忽略。验收仍是 SOAP 绑前缀和 HTML 相对卡片,不是背 3.1 函数表。
练习:把贵书路径标成「1.0 可交付」。列出团队若要 matches 忽略大小写,是换 2.0 还是回 Python。写出选择理由。趋势上 JSON 会多,XML 配置不会消失。时间分配:1.0 写准大于追版本。两条轨都看见,才不会被趋势文章带着跑。
同一句贵书查询,低版本用转换再比较,高版本可以就地绑定阈值或把嵌套函数改成从左往右读。功能相同,引擎成本不同。为了读起来顺去换栈,多数清洗和抓取项目不划算。字段真是日历、真要正则、真要同一套查询打标记语言和对象记法,缺口才成立。对象记法要先建成映射和数组,不是对文本文件扫低版本路径。流式会禁止随便回看整棵树,小配置不要给自己加锁。对外交付默认低版本并标注。混在无标注池子里运行时才爆未知函数,排查最贵。草案忽略直到引擎声明支持。验收仍是带默认空间的报文绑贴纸能抠出字段,以及页面列表用相对卡片取标题,不是背新版本函数表。时间花在写准和绑护照上,比追特性表回报高。
把同一句贵书查询标成可交付的低版本写法。列出若要忽略大小写匹配,是换中版本正则还是回宿主,写出选择理由。故意把从左往右读的箭头抄进轻量库,记下未知函数,把这记成版本问题。对象记法要先建成映射和数组,不是对文本文件扫低版本路径。流式会禁止随便回看整棵树,小配置不要给自己加锁。对外交付默认低版本并标注。混在无标注池子里运行时才爆,排查最贵。草案忽略直到引擎声明支持。验收仍是带默认空间的报文绑贴纸能抠出字段,以及页面列表用相对卡片取标题。时间花在写准和绑护照上,比追特性表回报高。语法糖不驱动升级,能力缺口才驱动。
原文集把高版本动机写得很具体:数据模型扩展到对象记法,新函数与运算符,函数项、箭头、捕获错误。再上一版补流式和边角,学习时可以认为是增强版,核心同一套。在轻量库里写箭头不会跑。我给的默认:对外交付、开源示例、不确定调用方引擎时写低版本。团队统一高版本引擎时中版本起步,最高版本按需。不要为了箭头把整个栈换掉,箭头只是少一层嵌套括号。函数项让函数当值传递。捕获错误对脏转换有用。映射与数组是对象记法对象和数组的亲戚,用查找而不是方向。流式约束路径形态,大文件变换才值得碰。社区更高草案未成为你现在该写的生产语法。
把贵书路径标成可交付的低版本。列出团队若要忽略大小写匹配,是换中版本还是回宿主,写出选择理由。故意把箭头抄进轻量库,记下报错。对象记法要先建成映射和数组。流式约束路径形态,小配置不要开流式给自己加锁。对外交付标注低版本。混池无标注会在运行时才爆。草案忽略直到引擎声明支持。验收仍是报文绑贴纸和页面相对卡片,不是背函数表。时间分配:写准大于追版本。两条轨都看见,才不会被趋势文章带着跑。语法糖不驱动升级,日期、正则、对象记法模型、流式这些能力缺口才驱动。函数项、箭头、捕获错误、映射数组是高版本实用特性,轻量库没有。社区更高草案不是现在的生产语法。同一进程可以两个引擎并存,表达式文件要标注版本。
可交付默认低版本。忽略大小写匹配写选择理由。箭头抄进轻量库应未知。对象记法先建模。流式给大文件。文件标注版本。草案忽略。验收是报文和相对卡片。写准大于追版本。缺口驱动升级:日期正则对象记法流式。箭头只是少括号。函数项像回调。捕获错误对脏转换有用。映射数组用查找不用方向。两引擎并存要分开文件。趋势不否定标记语言管道。
教程到此收束。回到第 1 章那三条路径,在你自己的树上跑通,比把 3.1 特性表再抄一遍重要。