13.9 FLWOR表达式

FLWOR表达式的名字得自for、let、where、order by和return等子句的首字母缩写,它代表了XQuery中最常用,而且功能也比较强大的一种表达式。FLWOR表达式和XPath 2.0中的for表达式有点像,也用于遍历序列中的各项,不同的是FLWOR表达式的功能更强。

FLWOR表达式的完整语法格式如下:

alt

其中for子句和let子句二者可以自由出现一次或多次,这完全没有任何问题,但必须至少出现其中之一;where子句用于对结果进行过滤;stable? order by子句用于对结果进行排序;而return子句用于指定返回表达式。

13.9.1 for、let和return子句

for子句用于遍历序列里的每一项,其完整的语法格式如下:

alt

其中$varName变量用于代表序列里的每一项,type用于显式声明序列项的数据类型,而$posVar则用于代表每一项在序列里的位置索引。

下面的XQuery示范了for子句的用法:

程序清单:codes\13\13.9\for1.xq

alt

从上面的语法格式可以看出,return子句非常简单,它只是将一个指定表达式作为返回值返回。

执行上面的XQuery,将返回如下结果:

alt

由前面的语法格式可知,for子句不仅可以指定一个变量,也可以同时指定多个变量,如下所示:

程序清单:codes\13\13.9\for2.xq

alt

执行上面的查询将返回如下结果:

alt

由上述查询结果可以看出,当使用for子句来遍历两个序列时,实际上会产生一个嵌套循环。

let子句和for子句的作用不同,它将整个序列当成整体处理,而不会遍历序列里的每项,其语法格式如下:

alt

与for子句不同的是,$varName并不是等于seq序列里的每一项,而是直接等于seq序列本身。

程序清单:codes\13\13.9\let.xq

alt

执行上面的查询可看到如下结果:

alt

FLWOR表达式也允许将for子句和let子句同时使用,如下所示:

程序清单:codes\13\13.9\for-let.xq

alt

执行上面的XQuery查询,可得到如下结果:

alt

13.9.2 where子句

where子句后的where_condition必须返回一个boolean类型的值,用于对for子句和let子句正在迭代处理的项进行过滤,当where_condition条件返回true时,当前迭代的项将被保留,否则将被删除。

假设希望获得13.4节中list.xml文档中的<book…/>元素值的长度大于14的元素,那么可以使用如下XQuery进行查询:

程序清单:codes\13\13.9\where.xq

alt

执行上面的XQuery查询将返回如下结果:

alt

13.9.3 order by子句

order by子句用于指定排序规则,其语法格式如下:

alt

其中stable关键字是可选的,用于强制指定稳定排序,也就是当排序结果中包含多个相同值时,在排序时将总按原有的输入顺序进行排序;ascending和descending分别用于指定按“升序”或“降序”排列;而empty greatest和empty least只能出现其中之一,分别用于指定空值或NaN比所有正常值大,或是比所有正常值小。

在collation之后的URILiteral用于指定字符串比较的排序规则,比如按ASCII码排序时,a排在b之前,但按其他规则排序时,则有可能a排在b之后。

例如如下XQuery将会把13.4节中的list.xml文档的<book…/>元素按其值的字符串长度进行排序:

程序清单:codes\13\13.9\order.xq

alt

执行上面的查询可看到如下结果:

alt