Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XQuery:返回多个元素_Xml_Xquery - Fatal编程技术网

Xml XQuery:返回多个元素

Xml XQuery:返回多个元素,xml,xquery,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 (la

以下是描述我正在使用的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来归还所有魏库姆先生担任编辑的书籍或杂志

我在决定如何归还书籍或杂志时遇到了问题。这就是我能想到的:

for $x in document(“bib.xml”)/bib
where $x/book/editor/lastname = “Weikum” or $x/magazine/editor/lastname = “Weikum”
return <result></result>
用于文档中的$x(“bib.xml”)/bib
其中$x/book/editor/lastname=“Weikum”或$x/magazine/editor/lastname=“Weikum”
返回

但这并没有达到我想要的结果。如何返回图书或杂志元素?我应该说
return$x

与姓“Weikum”的编辑一起归还书籍和杂志的最简单方法是

//editor[lastname='Weikum']/..
或者,如果您更喜欢FLWOR表达式,是的,您可以只说
返回$x
,如果$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可以清楚地看出,只有
书籍
杂志
可以有子
编辑器

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

//*[editor[lastname eq 'Weikum']]
如果我们相信DTD,那么
书籍
杂志
必须是XML文档顶部元素的子元素

这使我们能够提供一个可能更高效的表达式:

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

这真的很有帮助。第一个表达式是xpath,对吗?不是xquery?严格来说,xquery是XPath的超集,因此第一个表达式是有效的XPath和xquery。