XQuery中的变量范围?

JAC*_*K M 3 xquery zorba

我有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>
Run Code Online (Sandbox Code Playgroud)

并且note.xqy:

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

for $x in doc($srcDoc)/note
return ()
Run Code Online (Sandbox Code Playgroud)

由于某些原因,我需要两个fors来处理note.xml.我不想两次写入已处理的文件名,所以我定义了一个变量.奇怪的是,变量没有在第二个中定义for:

$ zorba -i -f -q note.xqy
note.xqy>:5,15: static error [err:XPST0008]: "srcDoc": undeclared variable
Run Code Online (Sandbox Code Playgroud)

Leo*_*ler 5

letXQuery中的Abound变量仅在其定义的FLWOR表达式中的范围内.在您的情况下,这是逗号之前的所有内容.

由于FLWOR表达式可以嵌套,因此一种解决方案是将其let分成一个封闭表达式并将两个循环放入return:

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

    for $x in doc($srcDoc)/note
    return ()
)
Run Code Online (Sandbox Code Playgroud)

由于您在XQuery脚本的开头绑定一个常量,您也可以使用declare variable,只在这种情况下有效:

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

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

for $x in doc($srcDoc)/note
return ()
Run Code Online (Sandbox Code Playgroud)