Есть ли в XQuery оператор выхода для выражений FLWOR?

Я хотел бы знать, есть ли в выражении xquery FLWOR оператор выхода, например continue и break?

Например, я хочу выйти из цикла for, когда будет достигнуто определенное условие.


person Technocrat    schedule 26.06.2010    source источник
comment
Выражения FLWOR на самом деле не являются циклами — нет никакой гарантии, что элементы for будут оцениваться в заданном порядке или даже в одном потоке; все они могут быть выполнены параллельно и объединены вместе одновременно, и до тех пор, пока сохраняется семантика, это будет действительным.   -  person Charles Duffy    schedule 11.05.2012


Ответы (3)


Я хотел бы знать, есть ли в выражении xquery FLWOR оператор выхода, например continue и break?

Например, я хочу выйти из цикла for, когда будет достигнуто определенное условие.

XQuery — это функциональный язык, что, среди прочего, означает отсутствие строгой концепции порядка выполнения. Поэтому любые попытки сделать что-то конкретное, когда что-то происходит, не имеют смысла.

Правильный подход — делать что-то, если выполняется определенное условие.

Невозможно выйти из выражения FLWOR, кроме как с помощью error() , но это прерывает обработку.

Об оптимизации особо беспокоиться не стоит — многие процессоры имеют хорошие оптимизаторы.

Таким образом, многие процессоры будут выполнять вычисления лениво и остановят вычисление приведенного ниже выражения FLOWR, как только он впервые выдаст результат, удовлетворяющий specific-condition():

  (someFlowerExpression )[specific-condition(.)][1]
person Dimitre Novatchev    schedule 27.06.2010

XQuery Scripting содержит оператор выхода:

variable $i := 0;
while(true())
{
  $i := $i + 1;
  if($i = 3) then
      exit returning $i 
  else();
} 

Or

for $i in (1 to 1000)
return
  if($i = 3) then
    exit returning $i;
  else();

Вы можете попробовать этот пример вживую по адресу http://www.zorba-xquery.com/html/demo#JvSLsVh3ZjhvTHecVd9jyE1vEBc=

person wcandillon    schedule 12.05.2012
comment
В XQuery нет выходных или возвращаемых ключевых слов. - person Gary Russo; 24.10.2014
comment
Обе ссылки мертвые :( - person ᴠɪɴᴄᴇɴᴛ; 27.01.2015

Хотя вопрос довольно старый, я отвечаю на него, поскольку некоторые новые люди могут столкнуться с такой ситуацией и получат лучшее решение.

Это решение будет легко работать на BaseX 7.6.

for $i in (1 to 10)
return
   if ($i = 3) then
       $i
   else 
       exit

Выход будет - 3

ИЛИ это будет генерировать вывод - 3,

for $i in (1 to 10)
return
   if ($i = 3) then
       $i
   else 
       ()
person John    schedule 20.11.2013
comment
У меня не было времени попробовать это в BaseX, но теоретически это ничего не выведет, так как в первый раз через цикл из-за $i = 1 он уже выйдет. - person ᴠɪɴᴄᴇɴᴛ; 27.01.2015
comment
@ Винсент - я обновил ответ. Второй работает с BaseX, я проверял. А также, на выходе будет ТОЛЬКО 3. - person John; 30.01.2015
comment
Нет, но когда я тестировал это, вывод был равен 3, но даже после 3 он продолжал зацикливаться. Вопрос ищет что-то вроде того, как только я достигну 3, выйду на 4 - person kAmol; 27.12.2019