2014-08-31 2 views
0

Я пытаюсь вернуть некоторый результат, и у меня возникают некоторые трудности, вполне возможно, что у меня нет правильного понимания Xquery for-if-then- -все заявления.Xquery for-if-then-else неожиданный вывод

for $S in doc("prac5a.xml")/enrolment 
return 
    <enrolment>{ 
    for $s in//student, $e in//enrol 
    return 
     if($s/id = $e/stud) then 
     <student>{$s/id, $s/name, $e/crs}</student> 
     else <student>{$s/id, $s/name}</student> 
    }</enrolment> 

От этого я ожидал выхода чего-то подобного;

<enrolment> 
    <student> 
     <id>s1</id> 
     <name>John</name> 
     <crs>c1</crs> 
     <crs>c2</crs> 
    </student> 
    <student> 
     <id>s2</id> 
     <name>Peter</name> 
     <crs>c2</crs> 
     <crs>c3</crs> 
    </student> 
    <student> 
     <id>s3</id> 
     <name>Rob</name> 
    </student> 

Вместо этого я получаю это;

<?xml version="1.0" encoding="UTF-8"?> 
<enrolment> 
    <student> 
     <id>s1</id> 
     <name>John</name> 
     <crs>c1</crs> 
     <crs>c2</crs> 
    </student> 
    <student> 
     <id>s1</id> 
     <name>John</name> 
    </student> 
    <student> 
     <id>s2</id> 
     <name>Peter</name> 
    </student> 
    <student> 
     <id>s2</id> 
     <name>Peter</name> 
     <crs>c2</crs> 
     <crs>c3</crs> 
    </student> 
    <student> 
     <id>s3</id> 
     <name>Rob</name> 
    </student> 
    <student> 
     <id>s3</id> 
     <name>Rob</name> 
    </student> 
</enrolment> 

Почему? или, что более важно, я полагаю, как я мог получить желаемый результат.

+2

Как выглядят исходные данные? – FatalError

+0

В вашем вопросе не хватает как ввода, так и описания того, что вы на самом деле хотите достичь. Пожалуйста, прочитайте [ask] и [как опубликовать SSCCE] (http://www.sscce.org). –

ответ

1

Я не могу предложить полное решение без исходных данных, но ваша итерационная проблема вызвана использованием вами статьи for ... in в вашем заявлении FLWOR. Несколько переменная привязка в пункте for ... in является сокращением для вложенных циклов, так как этот пример должен продемонстрировать:

for $x in (1, 2), $y in (3, 4) 
return $x || "-" || $y 

возвращает

1-3 
1-4 
2-3 
2-4 

Там также некоторые опечатки в коде; for $s in//student, $e in//enrol недействителен XQuery (или может быть, но будет означать каждый student и enrol элемент в fn:collection()). Предполагая, что вы хотели что-то вроде for $st in $s//student, $e in $st//enrol (и в зависимости от структуры вашего входного документа), следующие изменения могут решить вашу проблему:

for $st in $s//student 
let $e := $st//enrol 
... 
0

Как ваш вопрос оба отсутствуют примеры данных и описание того, что вы пытаетесь Достигните, этот ответ включает некоторые догадки.

Ваш текущий запрос выполняет перекрестный продукт для всех учащихся и курсов и возвращает новый элемент студента вместе с курсом, если он посещает его, или новый элемент только с учеником. I думаю, что вы хотите, это список студентов, вместе с курсами, в которые они записаны. Такой запрос может быть:

<enrolment>{ (: Wrapper element for all students :) 
    let $doc := doc("prac5a.xml")/enrolment (: Access the document, see note below :) 
    for $student in $doc//student (: Loop over all students :) 
    return <student>{ 
    $student/id, 
    $student/name, 
    $doc/enrol[$student/id = stud] (: Find all enrolments of this particular students, implicit loop :) 
    }</student> 
}</enrolment> 

Я добавил некоторые комментарии о различиях (кроме Внушительные имен переменных: никогда не использовать имена переменных одной буквой, используя описательные свободно и уменьшает массу сложности для больших фрагментов кода) , Следует отметить, что вы открываете документ/базу данных: вы связываете содержимое оберточного элемента (<enrolment/>) с номером $S, но никогда не используйте его; вместо этого вы получаете доступ к началу в текущем контексте. Я явно загрузил и использовал этот документ.

Смежные вопросы