2016-01-27 3 views
1

Я хотел бы создать список элементов, используя для этого, как и в примере:Создать список, используя для в XQuery 1.0

for $ingr in distinct-values(//Ingredient/Name) 
let $res := (
    for $res2 in //Restaurant 
    return if(some $ingr2 in $res2/Dish/Ingredient/Name satisfies $ingr2 eq $ingr) 
    then($res2) 
    else() 
) 
return $ingr, $res 

То, что я хочу, чтобы получить это: For each ingredient return the list of restaurants that use it. Я действительно не понимаю, где проблема?

Здесь вы можете увидеть пример: http://www.xpathtester.com/xquery/0c8f9699df404020afd07ff9f9517a46

Он твердит: ERROR - Variable $res has not been declared

ответ

4

Ваше выражение было прочитано как (for ... let ... return $ingr), ($res). Это означает, что $res в конце считается другим выражением, отличным от предыдущего выражения FLWOR, поэтому необъявленная ошибка переменной.

Вы можете просто использовать круглые скобки, чтобы изменить эту нежелательную группировку:

for $ingr in distinct-values(//Ingredient/Name) 
let $res := (
    for $res2 in //Restaurant 
    return if(some $ingr2 in $res2/Dish/Ingredient/Name satisfies $ingr2 eq $ingr) 
    then($res2) 
    else() 
) 
return ($ingr, $res) 

xpathtester demo

0

Проблема заключается в определении $ res2 в коде
вы должны изменить цикл, чтобы позволить дочерний узел внутри parent parent

for $res2 in //Restaurant 

    let $Ingredient := distinct-values(//Ingredient/Name/data()) 
        (:This is a list of ingredients :) 
    let $ingr := if (some $ingr2 in $Ingredient 
satisfies (contains(lower-case($res2//Ingredient/Name), $ingr2))) 
     then($res2) 
     else() 
    ) 
    return $ingr, $res2 
+0

Этот код дает мне эту ошибку: 'ERROR - функция системы данных # 0 не доступен с этим хозяином языка/version' – Timmy

+0

вы должны удалить {данные()} из вторая строка кода –

2

Как har07 правильно указывает, круглые скобки необходимы, чтобы получить окончательное обращение $res в сферу выражения FLWOR. Однако я думаю, что запрос, как вы его написали, чрезмерно сложный, в частности, квантованное выражение может быть заменено просто выражением пути. Вот более простой вариант:

for $ingr in distinct-values(//Ingredient/Name) 
return ($ingr, //Restaurant[Dish/Ingredient/Name = $ingr]) 
Смежные вопросы