XQuery 超级简明概要(2025 版)—— 看这一篇就够了
| 项目 | 内容一览(记住这些就够日常使用 95% 的场景) |
|---|
| 最新稳定版本 | XQuery 3.1(2017 年发布,所有主流处理器都已支持) |
| 核心理念 | “用 XML 的方式查询 XML”,完全基于 XPath 3.1 |
| 一句话定位 | 专为查询 XML(包括 XML 数据库)而生的“SQL 之于 XML” |
1. 基本语法结构(4 大金刚)
| 结构 | 写法示例 | 用途 |
|---|
| 路径表达式 | //book[@category="WEB"]/title | 快速定位 |
| FLWOR | for $b in //book let $p := $b/price where $p > 100 order by $p descending return $b | 真正强大的查询 |
| 元素构造 | <result>{$b/title, <discount>{ $p * 0.9 }</discount>}</result> | 输出新 XML |
| 函数 | declare function local:… 或直接用内置函数 | 复用逻辑 |
2. 日常 99% 用到的写法速查表
| 需求 | 一行搞定写法(直接复制) |
|---|
| 取所有书 | //book |
| 取类别为 WEB 的书 | //book[@category="WEB"] |
| 价格 < 50 | //book[price < 50] |
| 标题包含“XQuery”(不区分大小写) | //book[contains(lower-case(title), "xquery")] |
| 价格前 10 名最贵的书 | (//book order by xs:decimal(price) descending)[position() <= 10] |
| 分页(第 3 页,每页 20) | subsequence(//book order by @id, 41, 20) |
| 按类别分组统计 | for $c in distinct-values(//book/@category) return <cat name="{$c}" count="{count(//book[@category=$c])}"/> |
| 输出 JSON(XQuery 3.1) | array { //book ! map { "title": string(title), "price": . / price } } |
| 添加元素/属性(构造新节点) | <book isbn="{$old/@isbn}" category="NEW">{ $old/*, <stock>100</stock> }</book> |
3. 主流实现工具(2025 年现状)
| 工具 | 支持程度 | 典型用途 |
|---|
| BaseX | 完全支持 3.1 + Update + FullText | 开源最强,最易上手 |
| eXist-db | 完全支持 | 开源 XML 数据库 |
| MarkLogic | 完全支持 + 企业级扩展 | 商业最强 |
| Saxon EE/PE/HE | 完全支持 3.1(EE 支持 Update) | Java 环境下最常用 |
| Zorba (已停止) | 曾经最全 | 基本退出历史舞台 |
4. 记住这 8 个最常用函数就够了
contains(), lower-case(), matches() → 搜索
distinct-values() → 去重
count(), avg(), max(), min() → 统计
string-join() → 多节点拼字符串
current-dateTime() → 时间戳
doc() / collection() → 读取外部文件
subsequence(..., $start, $length) → 分页
trace($var, "debug:") → 调试打印
5. 一页纸口诀(背会它,XQuery 再也不怕)
找东西 → //路径[条件]
排序分页 → for $x in … order by … return $x => subsequence()
分组 → distinct-values() + count()
搜索 → contains(lower-case(…), lower-case($kw))
构造新 XML → <new>{旧内容, 新节点}</new>
输出 JSON → map { } 和 array { }
改文档 → insert node … into …(需要 Update 支持)
把上面这张表保存下来,日常写 XQuery 基本不会再查文档了!
需要我给你一个“XQuery 30分钟快速入门PPT提纲”或“常见场景模板包”吗?随时说一声就发你!