2013-04-22 3 views
1

Я очень новичок в xQuery, и я должен написать запрос, чтобы сделать следующее;If или Where Clauses in xQuery

Найти все авторы, которые, по крайней мере, автором книги и статьи в том же году

я написал следующее, используя IF-Then-Else положение;

for $a in doc("myDB.xml")/myDB 
return if ($a/book//last_name/text() = $a/article//last_name/text() 
and $a/book/year = $a/article/year) 
then $a//author 
else() 

и с Where Статья.

for $a in doc("myDB.xml")/myDB 
where $a/book//last_name/text() = $a/article//last_name/text() 
and $a/book/year = $a/article/year 
return $a//author 

Оба подхода возвращают всех авторов.

XML is;

<myDB> 
    <book> 
     <title>ebXML : Concepts and Application</title> 
     <author> 
      <last_name>Gibb</last_name> 
      <first_name>Brian</first_name> 
     </author> 
     <year>2003</year> 
     <publisher>Wiley</publisher> 
    </book> 

    <article> 
     <title>test title</title> 
     <author> 
      <last_name>Gibb</last_name> 
      <first_name>Brian</first_name> 
     </author> 
     <year>2003</year> 
     <publisher>test Wiley</publisher> 
    </article> 

    <book> 
     <title>XML: Visual QuickStart Guide</title> 
     <author> 
      <last_name>Goldberg</last_name> 
      <first_name>Kevin</first_name> 
     </author> 
     <author> 
      <last_name>Doe</last_name> 
      <first_name>John</first_name> 
     </author> 

     <year>2008</year> 
     <publisher>Peachpit Press</publisher> 
    </book> 
    <book> 
     <title>Beginning XML</title> 
     <author> 
      <last_name>Hunter</last_name> 
      <first_name>David</first_name> 
     </author> 
     <year>2007</year> 
     <publisher>Wrox</publisher> 
    </book> 
    <book> 
     <title>Learning XML </title> 
     <author> 
      <last_name>Ray</last_name> 
      <first_name>Erik</first_name> 
     </author> 
     <author> 
      <last_name>Smith</last_name> 
      <first_name>David</first_name> 
     </author> 
     <year>2003</year> 
     <publisher>O'Reilly</publisher> 
    </book> 
    <book> 
     <title>Professional XML</title> 
     <author> 
      <last_name>Evjen</last_name> 
      <first_name>Bill</first_name> 
     </author> 
     <year>2007</year> 
     <publisher>Wrox</publisher> 
    </book> 
    <article> 
     <title>FileNet Integrates a New XML Editor for Non-Techies</title> 
     <author> 
      <last_name>Roe</last_name> 
      <first_name>David</first_name> 
     </author> 
     <journal>CMS Wire</journal> 
     <year>2009</year> 
    </article> 
    <article> 
     <title>The Groundbreaking Potential of Codeless Ajax</title> 
     <author> 
      <last_name>Dusoe</last_name> 
      <first_name>Jim</first_name> 
     </author> 
     <journal>Tech News World</journal> 
     <year>2009</year> 
     <pages>4</pages> 
    </article> 
    <article> 
     <title>Windows and .NET Watch: Recognizing DSL opportunities</title> 
     <author> 
      <last_name>O'Brien</last_name> 
      <first_name>Larry</first_name> 
     </author> 
     <journal>Software Development Times</journal> 
     <year>2009</year> 
    </article> 
    <article> 
     <title>An embedded XML Database: Oracle Berkeley DB XML</title> 
     <author> 
      <last_name>Gibb</last_name> 
      <first_name>Brian</first_name> 
     </author> 
     <journal>The Register</journal> 
     <year>2003</year> 
     <pages>8</pages> 
    </article> 
    <article> 
     <title>Open Source PostgreSQL 8.3 Better Suited For Web Applications </title> 
     <author> 
      <last_name>Babcock</last_name> 
      <first_name>Charles</first_name> 
     </author> 
     <journal>Information Week</journal> 
     <year>2008</year> 
     <pages>1</pages> 
    </article> 
</myDB> 

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

ответ

1

Проблема заключается в том, что утверждения XPath не ведут себя так, как вы ожидаете от них в своем запросе. Они просто выбирают последовательности XML - поэтому, когда вы их сравниваете, он будет возвращать true, если любое значение слева соответствует любому значению справа. Поскольку каждое сравнение возвращает true, оно всегда возвращает $a//author, каждый author в документе.

Я думаю, что вы хотите:

for $b in doc("myDB.xml")/myDB/book 
let $articles:= doc("myDB.xml")/myDB/article[year=$b/year] 
where ($b/author = $articles/author) 
return $b/author 
+0

Я не думаю, что это даст правильный результат. Предположим, что существует книга, автором которой являются А и В, и статья, автором которой является только А в том же году. В вашем запросе будут отображаться как A, так и B, что неверно. – dirkk

+0

Отлично, это сработало. Я понял. Спасибо. – nommyravian

+0

@dirkk Правильно, что это не вернет отдельный XML. Его можно заставить работать с помощью ключа, но я не думал, что он был элементарным для вопроса OP и усложнил бы запрос. Также обратите внимание, что ваш пример возвращает строку, а не XML. – wst

0

for должен использоваться на итерационном элементе, но myDB появляется только один раз.

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

let $doc := doc("myDB.xml")/myDB 
for $author in distinct-values($doc/*/author) 
where $doc/article[author = $author][year = $doc/book[author = $author]/year] 
return $author 
+0

Это работает, но я должен был принять один ответ, поэтому я принял тот, кто разместил первый. +1 для вашего ответа тоже. спасибо – nommyravian