XQuery:返回多个元素

时间:2013-03-10 01:50:33

标签: xml xquery

以下是描述我正在使用的XML结构的DTD:

<!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吗?

2 个答案:

答案 0 :(得分: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中,如果您需要过滤小册子,标准和博客帖子以获取 书籍和杂志,则可能需要更复杂的表达式...

答案 1 :(得分: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']]