2013-03-10 42 views
0

以下是描述XML結構的DTD我一起工作:的XQuery:返回一個以上的元素

<!DOCTYPE bib [ 
<!ELEMENT bib (book+,magazine*)> 
<!ELEMENT book (title,author+,publisher,editor?,price)> 
<!ELEMENT magazine (title,publisher,editor+)> 
<!ELEMENT title (#PCDATA)> 
<!ELEMENT author (last,first)> 
<!ELEMENT publisher (#PCDATA)> 
<!ELEMENT editor (last, first,affiliation)> 
<!ELEMENT price ((#PCDATA)> 
<!ELEMENT last (#PCDATA)> 
<!ELEMENT first (#PCDATA)> 
<!ELEMENT affiliation (#PCDATA)> 
<!ATTLIST book year CDATA #REQUIRED> 
]> 

我已經寫一個XQuery返回所有書籍或雜誌,其中Weikum先生其中一名編輯。

我在確定如何退還書籍或雜誌時遇到問題。這是我可以拿出:

for $x in document(「bib.xml」)/bib 
where $x/book/editor/lastname = 「Weikum」 or $x/magazine/editor/lastname = 「Weikum」 
return <result></result> 

但是,這並沒有達到我想要的結果。我該如何退還書籍或雜誌元素?我應該只說return $x

回答

1

與編輯姓氏爲「Weikum」歸還圖書和雜誌,最簡單的方法是

//editor[lastname='Weikum']/.. 

或者,如果你喜歡一個FLWOR表達式,是的,你可以說return $x,如果$ x是綁定到你想要返回的。然而,在草圖中不是這樣的:你說你想要歸還書或雜誌,但是你已經綁定了$ x到bib元素。你想要更多的東西是這樣的:

for $x in document('bib.xml')/bib/* 
where $x/editor/lastname='Weikum' 
return $x 

在這兩個配方,我利用這樣的事實,只有書籍和雜誌有一個名爲editor孩子,只有書籍和雜誌出現的bib孩子。在一個更復雜的DTD,你可以,如果你需要過濾掉小冊子,標準和博客文章,以獲得只是書籍和雜誌需要更復雜的表達式...

+0

日Thnx很多......這確實有幫助。你的第一個表達式是一個xpath對嗎?不是一個xquery? – ueg1990 2013-03-10 02:24:22

+1

嚴格來說,XQuery是XPath的超集,所以第一個表達式既是有效的XPath,也是XQuery。 – joewiz 2013-03-10 05:19:32

0

使用

//*[self::book or self::magazine][editor[lastname eq 'Weikum']] 

從DTD很明顯,只有bookmagazine可以有一個孩子editor

如果文檔針對這個DTD成功驗證,則表達式可以更簡單:

//*[editor[lastname eq 'Weikum']] 

如果我們相信的DTD,一個bookmagazine必須是頂級元素的子元素的XML文檔

這使我們能夠提供一個潛在的更有效的表達:

/*/*[editor[lastname eq 'Weikum']]