2016-04-07 22 views
0

Ben "John Doe" yazar kitap ve dergilerin başlığını dönmek gerekiyor, ama benim xml dosyası olarak ayarlandı:XQuery'de bir where cümlede OR kullanmak mümkün mü?

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

toplam 6 kitap ve dergiler bulunmaktadır.

Bu SQL olsaydı ben böyle bir şey yapabileceğini biliyorum:

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

(veritabanı normalize olmaz ama ben yapmam gerekeni biliyorum göstermeye çalışıyorum o XQuery) ile

aşağıdaki çalıştı ve bana 6 başlıkları döndürdüğünü sadece emin:

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

Ama emin olduğum şey nerede yan tümce ile yapmak. Benzer şekilde aşağıdaki ve aynı noktada saplanıp çalıştı:

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

ben sadece 1 kitap ve 1 makale dönmelidir rağmen fıkra hala 6 girişler verdiği yerde bir de ekleme girişiminde:

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) 

Herhangi biri bana yardım edebilir mi lütfen? Belki beni doğru yöne işaret ederek veya yanlış gittiğime işaret ederek.

Tam XML dosyası:

<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

eşdeğerdir? Son sorgunuzda yanlış bir şey göremiyorum. – wst

+0

Kaynak XML'i şimdi gönderinin altına ekledim, teşekkürler! – user2633709

cevap

0

Üzgünüm, sorgulama edildi yolları kaçırdı. Yalnızca bir kitaplık öğesi vardır, bu nedenle for döngüsünüz yalnızca bir kez yinelenir ve en az bir<author> sizin where yan tümcesiyle eşleştiğinde, tüm değerleri <library>'dan döndürdü.

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

Yoksa çok net olmasını istiyorsanız hangi unsurlar içinde seçtiğiniz:

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

için değerlerin çıkışını kontrol için

çözüm hiyerarşisinde bir düzey aşağı yineleme etmektir Farklı öğeler için dönüşünüzde farklı XPath kullanabilirsiniz:

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

Merhaba cevabınızı anlayamadım? :) Benim sorgumda bir hata yaptığımı mı söylüyorsun?Ben kitaplık/makale/yazar = "John Doe" VEYA kütüphane/kitap/yazar = "John Doe" – user2633709

+0

özür dilerim zaman başlık dönmek istiyorum çok yakında! Sadece "Üzgünüm, sorguladığın yolları özledim" dedi. Bu harika çalışıyor, teşekkürler! açıklama çok yararlıdır – user2633709

+0

Merhaba, yapmak istediğim başka bir şey var, bu da makalenin yazarlara ve kitapların başlığına geri dönmektir. Eğer yazar yazara iade ederse hala başlığı döndürür. etrafında herhangi bir yolu var mı? – user2633709

0

w ildcard * bakılmaksızın adının unsurlarını maç için:

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

bu kaynak XML daha büyük bir örnek gönderebilir miyim daha ayrıntılı FLWOR ifadesi

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

Bunun için teşekkürler! : D – user2633709

+0

Merhaba, yapmak istediğim bir şey daha var, bu da makalenin makalelerine ve kitapların başlığına dönmek. Eğer yazar yazara iade ederse hala başlığı döndürür. etrafında herhangi bir yolu var mı? – user2633709

+0

Bunu yapmanın birçok yolu vardır; örneğin şunu deneyin: 'let $ lib: = doc (" xmldata.xml ")/kitaplık dönüşü ($ lib/article [yazar = 'John Doe']/yazar, $ lib/kitap [author = 'John Doe']/başlık) '. Daha fazla soru için, yeni bir StackOverflow girdisini daha iyi açın. –

İlgili konular