Область применения переменных в 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
1 ответ
Решение
let
переменная в XQuery находится только в области видимости внутри выражения 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 ()