繁体   English   中英

XQuery:返回多个元素

[英]XQuery: Returning more than one element

以下是描述我正在使用的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吗?

使用姓氏为“ Weikum”的编辑者退还书籍和杂志的最简单方法是

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

或者,如果您更喜欢FLWOR表达式,可以,只要$ x绑定到您要返回的内容,就可以说return $x 但是,这在您的草图中是不正确的:您说要退还书或杂志,但已将$ x绑定到bib元素。 您想要更多类似这样的东西:

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

在这两种表述中,我利用了这样一个事实,即只有书和杂志才有被称为editor者的孩子,而只有书和杂志才是bib孩子。 在一个更复杂的DTD,你可以,如果你需要过滤掉小册子,标准和博客文章,以获得公正的书籍和杂志需要更复杂的表达式...

用途

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

从DTD可以明显看出,只有一book或一magazine可以拥有一个子editor

如果针对此DTD成功验证了文档,则表达式可以更简单:

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

如果我们相信DTD,那么一book或一magazine必须是XML文档顶部元素的子元素

这使我们可以提供一种可能更有效的表达方式:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM