据我所知,$ book,$ title和$ author在FLWOR范围内,但我不明白为什么$ title和$ author在序列中起作用而$ book没有。
(:
A note on variable scope.
Variables in a FLWOR expression are scoped only to the FLWOR expression.
Local variables declared in the prolog are scoped to the main module.
:)
(: start of prolog :)
xquery version "1.0-ml";
declare namespace bks = "http://www.marklogic.com/bookstore";
declare variable $scope-example := "2005";
(: end of prolog :)
(: start of query body :)
(
"remember an XQuery module returns a sequence -- this text is the first item, and then the results of the FLWOR",
for $book in /bks:bookstore/bks:book
let $title := $book/bks:title/string()
let $author := $book/bks:author/string()
let $year := $book/bks:year/string()
let $price := xs:double($book/bks:price/string())
where $year = $scope-example (: we can do this because my local variable is scoped to the module :)
order by $price descending
return
<summary>{($title, "by", $author)}</summary>
,
"and now another item, but I cant reference a variable from the FLWOR expression outside of the FLWOR, it will fail like this",
$book
)
(: end of query body :)
答案 0 :(得分:4)
在FLWOR的FOR中绑定的变量仅在FLWOR中可见。
XQuery不是一种过程语言;它的功能。执行系统并行或无序运行表达式是完全正确的。这是功能语言的一个很酷的功能。
画出数学函数(a*b) + (c*d)
。评估系统可以并行执行a*b
和c*d
部分,而无需用户能够分辨。这与XQuery中的想法相同。很多工作可以并行进行,你不需要管理它,你甚至不知道。
在您的示例中,您在语句中提供了3个表达式,每个表达式都是独立的。你不应该认为你的程序是从上到下独自运行,而是在其后面留下副作用变量。
流行测验:这会带来什么回报?
for $i in (1 to 3)
return $i, 4
它是1 2 3 4
,因为它是一个FLWOR表达式,返回1 2 3
后跟一个返回4
的表达式。并且您无法在第二个表达式中引用$i
。
for $i in (1 to 3)
return $i
,
4