XQuery 完整语法速查表(2025 最新版,XQuery 3.1)
直接背这张表 + 记住 10 个最常用模板 = 99% 的实际开发都够用。
| 类别 | 语法(必背) | 说明 / 示例 |
|---|---|---|
| 版本声明 | xquery version "3.1"; | 必须写在最前面,推荐永远写 3.1 |
| 编码声明 | xquery encoding "utf-8"; | 可选,但建议写 |
| 模块导入 | import module namespace m = "http://example.com/m" at "m.xqm"; | 导入自定义函数库 |
| 命名空间声明 | declare namespace ex = "http://example.com"; | 常用在 FLWOR 或函数里 |
| 变量 | declare variable $x := 1 to 10;let $y := <a>hello</a> | declare 是全局,let 是局部 |
| FLWOR(核心) | for $i in 1 to 10 <br> let $s := "hello" <br> where $i > 5 <br> order by $i descending <br> return <item>{$i}</item> | 至少有一个 for 或 let + return |
| for 子句 | for $book in doc("books.xml")//bookfor $x at $pos in 1 to 10 | at $pos 可取序号(分页必备) |
| let 子句 | let $books := doc("books.xml")//book | 不迭代,常用于分组、统计 |
| where 子句 | where $book/price > 30 and contains($book/title, "XML") | 支持 and、or、=、!=、>、<、<=、>= |
| order by | order by $book/price descending, $book/year ascending | 支持多个字段 |
| return | return <li>{ $book/title }</li> | 可以返回任意 XQuery 表达式 |
| 条件表达式 | if ($price > 100) then "expensive" else "cheap" | 必须有括号,必须有 else |
| 路径表达式 | /bookstore/book[price>30]/title//book[@category="web"] | 完全复用 XPath 3.1 语法 |
| 谓词(过滤) | //book[1] //book[last()] //book[position() <= 3] | 位置从 1 开始 |
| 轴(Axis) | child::, descendant::, descendant-or-self::, parent::, ancestor::, attribute::, @, self:: | 常用:@、..、//、/ |
| 函数调用 | count($books) avg($books/price) string-join($authors, ", ") | 超过 200 个内置函数 |
| 箭头操作符(3.1) | $books ! title ! upper-case(.)doc("data.json") => parse-json() => ?users?*?name | 链式调用,比逗号更清晰 |
| 动态函数调用 | let $f := upper-case#1 return $f("hello") | 高阶函数常用 |
| Map(3.1) | map { "name": "John", "age": 31 }$map?name $map?("age") | 相当于 JSON 对象 |
| Array(3.1) | array { 1, 2, 3 }$array?1 $array?* | 相当于 JSON 数组 |
| JSON 支持 | parse-json('{"a":1}')json-doc("data.json") | json-doc 直接返回 map/array |
| 构造元素/属性 | <book id="{$id}">{ $title }</book> | 大括号里是 XQuery 表达式 |
| 文本节点构造 | text { "hello world" } { "price: ", $p } | 推荐用大括号拼接 |
| 注释 | (: 这是一行注释 :)(: 多行注释<br>也可以这样写 :) | 和 ML 系列语言完全一样 |
| 序列化声明(输出) | declare option output:method "html";declare option output:html-version "5.0"; | 让 XQuery 直接输出完美 HTML |
| 完整 HTML5 输出 | declare option output:method "html";declare option output:html-version "5.0";declare option output:include-content-type "yes"; | 三行必写,生成可直接打开的 HTML 文件 |
| 更新语句(XQUF) | copy $tmp := doc("books.xml")modify (replace value of node $tmp//price with 99.99)return $tmp | 仅 BaseX、eXist-db、MarkLogic 支持 |
10 个最常用“万能模板”(背下来就能打遍天下)
1. 简单查询
doc("books.xml")//book[price > 30]/title
2. 标准 FLWOR
for $b in doc("books.xml")//book
where $b/price > 30
order by xs:decimal($b/price) descending
return $b/title
3. 分组统计(SQL GROUP BY)
for $cat in distinct-values(//book/@category)
let $books := //book[@category = $cat]
return <cat name="{$cat}" count="{count($books)}" avg="{avg($books/price)}"/>
4. 生成完整 HTML 页面(三行声明必写)
xquery version "3.1";
declare option output:method "html";
declare option output:html-version "5.0";
declare option output:include-content-type "yes";
<html> … 你的 FLWOR … </html>
5. JSON → XML
parse-json(file:read-text("data.json"))
6. XML → JSON
serialize($node, map { "method": "json", "indent": true() })
7. 条件高亮
if ($b/price > 50) then <span class="red">{ $b/price }</span>
else <span>{ $b/price }</span>
8. 带序号分页
for $b at $i in //book
where $i >= 11 and $i <= 20
return <tr><td>{$i}</td><td>{$b/title}</td></tr>
9. 多文档 join
for $book in doc("books.xml")//book
$review in doc("reviews.xml")//review[id = $book/@id]
return <item title="{$book/title}" rating="{$review/rating}"/>
10. 更新(支持的引擎)
copy $db := doc("books.xml")
modify replace value of node $db//book[@id="b1"]/price with 99.99
return $db
把上面语法表 + 10 个模板记熟,任何 XQuery 需求 1 分钟内都能写出来!
需要我出 50 道经典语法练习题(带答案)立刻发你练手吗?随时说一声~