XQuery 语法

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")//book
for $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 byorder by $book/price descending, $book/year ascending支持多个字段
returnreturn <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 道经典语法练习题(带答案)立刻发你练手吗?随时说一声~

文章已创建 2783

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部