3

我正在寻找一个示例,它表明 XQuery 表达式评估不是连续的。在将 XQuery 的功能特性与过程语言进行比较时,总是会提到它。

例如在XQuery, 2nd edition中,在下面的部分:

带有 for 子句的 FLWOR 表达式类似于过程语言(例如 C)中的循环。但是,一个关键的区别是在 XQuery 中,因为它是一种函数式语言,所以认为迭代没有特定的顺序。它们不一定顺序发生,一个接一个。

4

2 回答 2

6

通常,该语言的设计使您无法分辨评估顺序是什么,这使得很难证明它不是您所期望的。要观察评估的实际顺序,您需要做一些有副作用的事情,这通常意味着偏离语言规范并使用供应商扩展。例如,您可以使用 EXPath 文件模块并发出对 的调用file:append-text(),然后检查添加到外部文本文件的条目的顺序。

当然,如果文件中的条目完全按照您期望的顺序,它不会证明任何事情。查询处理器不会仅仅为了好玩而使用不明显的执行顺序。他们只会在通过更改顺序获得一些东西时才会这样做。例如,Saxon 将延迟评估变量,直到它们被使用,并且如果可以的话,会将表达式从循环中取出。但是您会遇到问题,如果您使用具有副作用的函数file:append-text()来观察这种行为,Saxon 可能会检测到您的代码具有副作用并抑制优化。

于 2019-10-18T13:52:00.127 回答
2

在某些实现中,您可以体验到更复杂的 FLOWR 表达式中结果的顺序是任意的,例如,以 Priscilla Walmsley 的书http://www.datypic.com/books/xquery/中的一个示例为例,一组item元素('order .xml' 在http://www.datypic.com/books/xquery/chapter01.html

<order num="00299432" date="2015-09-15" cust="0221A">
  <item dept="WMN" num="557" quantity="1" color="navy"/>
  <item dept="ACC" num="563" quantity="1"/>
  <item dept="ACC" num="443" quantity="2"/>
  <item dept="MEN" num="784" quantity="1" color="white"/>
  <item dept="MEN" num="784" quantity="1" color="gray"/>
  <item dept="WMN" num="557" quantity="1" color="black"/>
</order>

在撒克逊 9.8 HE 中使用代码(http://www.datypic.com/books/xquery/chapter07.html中的 7.11 )

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method 'xml';
declare option output:indent 'yes';

for $item in //item
group by $d:= $item/@dept, $n:= $item/@num
return <group dept="{$d}" num="{$n}" count="{count($item)}"/>

给出输出

<?xml version="1.0" encoding="UTF-8"?>
<group dept="ACC" num="563" count="1"/>
<group dept="MEN" num="784" count="2"/>
<group dept="WMN" num="557" count="2"/>
<group dept="ACC" num="443" count="1"/>

而例如使用BaseX,您可能会得到元素的不同输出顺序(如果我没记错的话,我认为是基于项目的输入顺序)group,例如在BaseX 9中我得到

<group dept="WMN" num="557" count="2"/>
<group dept="ACC" num="563" count="1"/>
<group dept="ACC" num="443" count="1"/>
<group dept="MEN" num="784" count="2"/>
于 2019-10-18T10:08:33.857 回答