как использовать Xquery и FLOWR для итерации и возврата каждого результата? - PullRequest
1 голос
/ 12 октября 2019

Я пытаюсь перебрать книжный магазин sample , возвращающий каждую книгу в результате. Как это достигается с помощью XQuery и FLOWR?

Моя лучшая попытка на данный момент:

thufir@dur:~/basex/w3schools$ 
thufir@dur:~/basex/w3schools$ basex each.xq 
<book category="cooking">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>
<book category="children">
  <title lang="en">Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>
<book category="web">
  <title lang="en">XQuery Kick Start</title>
  <author>James McGovern</author>
  <author>Per Bothner</author>
  <author>Kurt Cagle</author>
  <author>James Linn</author>
  <author>Vaidyanathan Nagarajan</author>
  <year>2003</year>
  <price>49.99</price>
</book>
<book category="web" cover="paperback">
  <title lang="en">Learning XML</title>
  <author>Erik T. Ray</author>
  <year>2003</year>
  <price>39.95</price>
</book>thufir@dur:~/basex/w3schools$ 
thufir@dur:~/basex/w3schools$ 
thufir@dur:~/basex/w3schools$ cat each.xq 
let $db := db:open("com.w3schools.books")
for $item in $db
return $item/bookstore/book
thufir@dur:~/basex/w3schools$ 

Только я бы "вроде" хотел, чтобы каждый результат отличался немного больше. Можно ли связать или передать результаты из одного Xquery в другой? Я хотел бы получить вывод, похожий на сериализацию каждой книги в XML-файл.

данные:

thufir@dur:~/basex/w3schools$ 
thufir@dur:~/basex/w3schools$ basex all.xq 
<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book category="children">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="web">
    <title lang="en">XQuery Kick Start</title>
    <author>James McGovern</author>
    <author>Per Bothner</author>
    <author>Kurt Cagle</author>
    <author>James Linn</author>
    <author>Vaidyanathan Nagarajan</author>
    <year>2003</year>
    <price>49.99</price>
  </book>
  <book category="web" cover="paperback">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>thufir@dur:~/basex/w3schools$ 
thufir@dur:~/basex/w3schools$ 
thufir@dur:~/basex/w3schools$ cat all.xq 
let $db := db:open("com.w3schools.books")
return $db
thufir@dur:~/basex/w3schools$ 

Конечно, можно вернуть один результат:

thufir@dur:~/basex/w3schools$ 
thufir@dur:~/basex/w3schools$ basex singleBook.xq 
<book category="cooking">
  <title lang="en">Everyday Italian</title>
  <author>Giada De Laurentiis</author>
  <year>2005</year>
  <price>30.00</price>
</book>thufir@dur:~/basex/w3schools$ 
thufir@dur:~/basex/w3schools$ cat singleBook.xq 
let $db := db:open("com.w3schools.books")
for $x in $db
return $x/bookstore/book[1]
thufir@dur:~/basex/w3schools$ 

Однако это всего лишь одна книга. Как бы я повторил возвращение каждой книги?

1 Ответ

2 голосов
/ 12 октября 2019

Поскольку не совсем ясно, как именно вы хотите получить вывод, попробуйте что-то вроде этого (я составил некоторую структуру) - он может приблизить вас к конечному пункту назначения ...

for $x in $db/book
return 
(<book-info>
{$x/title/text()}, {$x/author[1]/text()}
</book-info>,'&#10;')

Вывод:

<book-info>
Everyday Italian, Giada De Laurentiis
</book-info>


<book-info>
Harry Potter, J K. Rowling
</book-info>


<book-info>
XQuery Kick Start, James McGovern
</book-info>


<book-info>
Learning XML, Erik T. Ray
</book-info>
...