2016-04-07 4 views
0

мне нужно вернуть название книг и журналов, где «Джон Доу» является автором, но мой файл XML настроен как:Можно ли использовать OR в предложении where в XQuery?

<library> 
<book>...</book> 
<article>...</article> 
</library> 

Есть 6 книг и журналов в общей сложности.

Я знаю, что если это SQL я мог бы сделать что-то вроде:

SELECT title 
FROM library 
WHERE bookauthor = "John Doe" OR articleauthor = "John Doe" 

(, что база данных не будет нормализуется, но я пытаюсь показать, что я думаю, я знаю, что мне нужно сделать , просто не знаю, как с XQuery)

Я попытался следующие, и он вернул все 6 титулов мне:

for $x in doc("xmldata.xml")/library 
let $a := $x/article 
let $b := $x/book 
return ($a/title, $b/title) 

Но я не уверен, что делать с предложением where. Точно так же я попробовал следующее и застрял в той же точке:

for $x in doc("xmldata.xml")/library 
return ($x/article/title, $x/book/title) 

При попытке добавить в где положение все еще возвращает все 6 записей, даже если она должна возвращать только 1 книгу и 1 статью:

for $x in doc("xmldata.xml")/library 
where $x/article/author = 'John Doe' 
where $x/book/author = 'John Doe' 
return ($x/article/title, $x/book/title) 

Может ли кто-нибудь помочь мне? Может быть, указав мне в правильном направлении или указывая, где я ошибаюсь.

Полный XML-файл:

<library> 
<book> 
    <author>John Doe</author> 
    <title>Turnitin</title> 
</book> 
<article> 
    <author>John Doe</author> 
    <title>Evaluating</title> 
</article> 
<article> 
    <author>Shannon, L.</author> 
    <title>Reconceptualising</title> 
</article> 
<book> 
    <author>Burden, David</author> 
    <title>An evaluation</title> 
</book> 
<article> 
    <author>Moscrop, C.</author> 
    <title>Evaluating a systematic method</title> 
</article> 
<book> 
    <author>Beaumont, C.</author> 
    <title>Beyond e-learning</title> 
</book> 
</library> 
+0

Вы можете разместить больший образец исходного XML? Я не вижу ничего плохого в вашем последнем запросе. – wst

+0

Я добавил исходный XML в начало сообщения, спасибо! – user2633709

ответ

0

К сожалению, я пропустил пути вы запрашивая. Существует только один элемент библиотеки, поэтому цикл for повторяется только один раз, а затем с по крайней мере один<author> соответствует вашему where, он возвращает все значения от <library>.

Решение итерировать на один уровень вниз в иерархии:

for $x in doc("xmldata.xml")/library/* 
where $x/author = 'John Doe' 
return $x/title 

Или, если вы хотите быть очень ясно, какие элементы вы выбираете:

for $x in doc("xmldata.xml")/library/(article|book) 
... 

Для управления выводом значений для различные элементы, вы можете использовать разные XPath в своем возврате:

... 
return ($x/self::book/title, $x/self::article/author) 
+0

Не уверен, что я понимаю ваш ответ? :) Вы говорите, что я допустил ошибку в моем запросе?Я хочу вернуть название, когда библиотека/статья/автор = «Джон Доу» ИЛИ когда библиотека/книга/автор = «Джон Доу» – user2633709

+0

жаль, что я ответил слишком рано! он только сказал: «Извините, я пропустил пути, которые вы запрашивали». Это отлично работает, спасибо! объяснение полезно тоже – user2633709

+0

Здравствуйте, извините, есть еще одна вещь, которую я хочу сделать, чтобы вернуть автора для статей и названия книг. если я добавлю автора в return, он все равно вернет заголовок. есть ли какой-либо путь вокруг этого? – user2633709

0

Вы можете использовать w ildcard *, чтобы соответствовать элементы независимо от их названия:

doc("xmldata.xml")/library/*[author = 'John Doe']/title 

это эквивалентно более развернутого выражения FLWOR

for $entry in doc("xmldata.xml")/library/* 
where $entry/author = 'John Doe' 
return $entry/title 
+0

спасибо за это! : D – user2633709

+0

Здравствуйте, извините, есть еще одна вещь, которую я хочу сделать, чтобы вернуть автора для статей и названия книг. если я добавлю автора в return, он все равно вернет заголовок. есть ли какой-либо путь вокруг этого? – user2633709

+0

Есть много способов сделать это; попробуйте это, например: 'let $ lib: = doc (" xmldata.xml ")/library return ($ lib/article [author = 'John Doe']/author, $ lib/book [author = 'John Doe']/название) '. Для получения дополнительных вопросов лучше откройте новую запись StackOverflow. –