Рекурсивная функция, возвращающая логическое значение, с циклом for внутри - PullRequest
1 голос
/ 20 сентября 2011

Мои данные являются бинарным деревом и будут проверять каждый дочерний элемент, возвращая true, если он найдет данные, которые мне нужны, если нет, то продолжит их искать.Каким-то образом я хочу вернуть переменную @exists или что-то еще. Ну, у кого-нибудь может быть решение моей проблемы.Я думал что-то вроде этого, но я не мог заставить его работать!(фрагмент кода)

declare function local:test($id as xs:integer, $topic as xs:integer) as xs:boolean {
    let $exists := fn:false()
    for $x in ...
    return
        if .. then
            set exists to fn:true()
        else
            set exists to exists OR local:test($x,$topic)

    return @exists in some way  
};

Ответы [ 3 ]

2 голосов
/ 21 сентября 2011

Это случай для выраженного в XQuery выражения . Используя это, ваша функция преобразуется в

declare function local:test($id as xs:integer, $topic as xs:integer) as xs:boolean
{
  some $x in ...
  satisfies
    if (..) then
      fn:true()
    else
      local:test($x,$topic)
};
1 голос
/ 21 сентября 2011

Как уже упоминалось, XQuery - это функциональный язык. Вы не можете просто установить переменную и вернуть ее. Ваш запрос может быть переписан как:

declare function local:test($id as xs:integer, $topic as xs:integer) as xs:boolean {
    exists(for $x in ...
           where (: here is condition expression on $x :)
           return $x)
};

Функция exists(Expr) возвращает true, если значение Expr не является пустой последовательностью; в противном случае функция возвращает false.

В этом случае exists возвращает true, если существует $x, которое удовлетворяет указанному условию.

0 голосов
/ 20 сентября 2011

Вы не можете изменить значения переменных в xquery.

Вся ваша функция не только в этом:

declare function local:test($topic as xs:integer) as xs:boolean {
     ... OR local:test($topic/...)
};
...