XQuery中变量的范围是什么?

3

我有一个note.xml文件:

<?xml version="1.0"?>
<note>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

note.xqy

let $srcDoc:="note.xml"
for $x in doc($srcDoc)/note
return (),

for $x in doc($srcDoc)/note
return ()

由于某些原因,我需要使用两个for循环来处理note.xml。 我不想两次写入已处理文件的名称,因此我定义了一个变量。 奇怪的是,这个变量在第二个for中没有被定义:

$ zorba -i -f -q note.xqy
note.xqy>:5,15: static error [err:XPST0008]: "srcDoc": undeclared variable
1个回答

5
在XQuery中,let变量只在其定义的FLWOR表达式范围内有效。在您的情况下,这是逗号之前的所有内容。
由于FLWOR表达式可以嵌套,一个解决方案是将let拆分为一个包含表达式,并将两个循环放入return中。
let $srcDoc:="note.xml"
return (
    for $x in doc($srcDoc)/note
    return (),

    for $x in doc($srcDoc)/note
    return ()
)

由于在XQuery脚本的开头绑定了一个常量,因此您还可以使用declare variable,但仅限于该情况:

declare variable $srcDoc := "note.xml";

for $x in doc($srcDoc)/note
return (),

for $x in doc($srcDoc)/note
return ()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接