跳转到内容

XQuery/搜索多个集合

来自维基教科书,开放的书籍,开放的世界

您想在多个集合中查找记录。

有几种方法可以做到这一点。最简单的方法是将这两个集合放在一个父集合中,然后从父集合开始搜索。

假设您有三个集合

  /db/test
  /db/test/a
  /db/test/b

要获取集合 a 和 b 中的所有书籍,只需指定父集合,即 /db/test

  for $book in collection('/db/test')//book

请注意,双斜杠 **//** 将在基本集合或任何子集合中的任何位置查找书籍。

如果您有两个位于文件系统中不同位置的集合,您可以简单地指定每个集合,并使用序列连接操作将它们连接在一起。这是将两个序列括在括号中的默认操作。例如,如果您有两个序列 **a** 和 **b**,这两个序列的连接就是 **(a,b)**。

假设您有两个集合,在以下集合中包含书籍

File='/db/test/a/books.xml'

<books>
    <book id="47">
        <title>Moby Dick</title>
        <author>Herman Melville</author>
        <published-date>1851-01-01</published-date>
        <price>$19.95</price>
        <review>The adventures of the wandering sailor in pursuit of a 
            ferocious wale.</review>
    </book>
    <book id="48">
        <title>The Great Gatsby</title>
        <author>F. Scott Fitzgerald</author>
        <published-date>1925-05-10</published-date>
        <price>$29.95</price>
        <review>Chronicles of an era during the roaring 1920s
                when the US economy soared.</review>
    </book>
</books>

File='/db/test/b/books.xml'

<books>
    <book id="49">
        <title>Catch-22</title>
        <author>Joseph Heller</author>
        <published-date>1961-01-01</published-date>
        <price>$19.95</price>
        <review>A satirical, historical novel set during the later stages of World War II from 1943 onwards.</review>
    </book>
    <book id="48">
        <title>Lolita</title>
        <author>Vladimir Nabokov</author>
        <published-date>1955-01-01</published-date>
        <price>$19.95</price>
        <review>A man becomes obsessed with a 12-year-old girl.</review>
    </book>
</books>

以下查询将对这两个集合进行操作。

xquery version "1.0";

let $col-a := '/db/test/a'
let $col-b := '/db/test/b'
return
<books>{
for $book in (collection($col-a)//book, collection($col-b)//book)
return
  $book
}</books>

如果您只想返回标题,可以使用以下内容

xquery version "1.0";

let $col-a := '/db/test/a'
let $col-b := '/db/test/b'
return
<books>{
for $book in (collection($col-a)//book, collection($col-b)//book)
return
  $book/title
}</books>

这将返回以下结果

<books>
<title>Moby Dick</title>
<title>The Great Gatsby</title>
<title>Catch-22</title>
<title>Lolita</title>
</books>
华夏公益教科书