XQuery 中的变量范围?
Scope of variables in XQuery?
我有 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
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 ()
我有 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
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 ()