2016-04-07 73 views
0

我需要返回的書籍和期刊,其中「李四」是作者的頭銜,但我的xml文件被設置爲:是否可以在XQuery的where子句中使用OR?

<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) 

當我試圖在where子句中仍返回所有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

?我沒有看到你最後的查詢有什麼問題。 – 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

嗨,不知道我明白你的回覆? :)你是否說我在查詢中犯了錯誤?當圖書館/文章/作者=「John Doe」或當圖書館/書籍/作者=「John Doe」時,我想要返回標題 – user2633709

+0

對不起,我回復得太快了!它只是說「對不起,我錯過了你正在查詢的路徑。」這很好,謝謝!這個解釋也有幫助 – user2633709

+0

嗨,對不起,我還想做另一件事,那就是將作者的文章和書名歸還給作者。如果我將作者添加到回報中,它仍會返回標題。有沒有辦法解決這個問題? – user2633709

0

你可以使用w ildcard *匹配的元素,無論他們的名字:

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

這一點,你可以發佈源XML的更大的樣本等同於更復雜的FLWOR表達

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

謝謝你! :D – user2633709

+0

嗨,對不起,我還想做另外一件事,那就是將作者的文章和書名歸還給作者。如果我將作者添加到回報中,它仍會返回標題。有沒有辦法解決這個問題? – user2633709

+0

有很多方法可以做到這一點;試試這個例子:'let $ lib:= doc(「xmldata.xml」)/ library return($ lib/article [author ='John Doe']/author,$ lib/book [author ='John Doe'] /標題)'。有關更多問題,最好打開一個新的StackOverflow條目。 –

相關問題