XQuery中的let, for, where, order by, return怎么用

FLWOR是XQuery核心结构,含for(迭代驱动)、let(变量绑定)、where(条件过滤)、order by(排序)、return(结果生成)五部分,声明式组合实现XML数据的查询、计算、筛选、排序与构造。

FLWOR 是 XQuery 的核心结构,代表 forletwhereorder byreturn 五个关键词。它不是命令顺序,而是声明式逻辑组合——类似 SQL 的 SELECT-FROM-WHERE-ORDER BY,但更灵活,支持变量绑定、多层迭代和 XML 构造。

for:遍历节点或值序列

用于定义迭代变量,每次取输入序列中的一项,绑定给变量供后续使用。

  • 必须有至少一个 for 子句,它是 FLWOR 的驱动入口
  • 输入可以是 XPath 表达式(如 doc("books.xml")/books/book)、函数结果或字面量序列
  • 支持多个 for 实现笛卡尔积,例如:
    for $a in /store/item
    for $b in /store/discount

let:声明并复用中间值

不改变迭代次数,只做一次性赋值,常用于简化复杂表达式或避免重复计算。

  • 变量作用域覆盖整个 FLWOR 表达式(包括 where、return 等)
  • 可绑定任意类型:节点、字符串、数字、布尔值,甚至构造的元素
    例如:let $price := $book/price * 0.9
  • 支持类型标注(可选):let $i as xs:integer := 100

where:条件过滤

对当前迭代项进行布尔判断,只保留满足条件的项进入 return 阶段。

  • 谓词写在 $var/xxx op value 形式,支持比较(=, !=, >, )、逻辑(and, or, not())等
  • 空序列自动转为 false;单个字符串非空即 true;数值零为 false
  • 可写多个条件,用 and 连接:where $b/price > 20 and $b/stock > 0

order by:控制输出顺序

对最终参与 return 的项按指定表达式排序,默认升序,加 descending 可降序。

  • 可跟多个排序键,优先级从左到右:order by $b/year, $b/title descending
  • 支持数据类型提示避免字符串误排:order by $b/price cast as xs:decimal
  • 仅影响 return 的输出顺序,不影响 where 或迭代逻辑

return:生成最终结果

每个通过 where 的迭代项执行一次 return 表达式,结果合并为一个序列。

  • 可返回原子值(如 $b/title/text())、XML 片段(如 {$b/title})或构造元素
  • 支持内联表达式:{ $b/price * 0.9 } 会求值并插入内容
  • 若需返回多个字段,常用 element 构造:return element book { $b/title, $b/author }

基本上就这些。FLWOR 不复杂但容易忽略变量作用域和执行时机——let 是一次赋值,for 是逐项驱动,where 是逐项筛选,return 是逐项产出。组合起来,就能干净地查、算、筛、排、构 XML 数据。