Область применения переменных в 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 ()
Другие вопросы по тегам