【问题标题】:how to use Xquery and FLOWR to iterate and return each result?如何使用 Xquery 和 FLOWR 迭代并返回每个结果?
【发布时间】:2020-02-09 15:15:06
【问题描述】:

我希望迭代一个 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$ 

但是,这只是一本书。我将如何迭代返回每本书?

【问题讨论】:

  • 你能发布一个你想要的输出样本吗?从你的问题看不清楚。
  • 如果您使用return $x/bookstore/book 而不是return $x/bookstore/book[1],您显然会返回所有book 元素,而不仅仅是第一个。似乎太明显了,所以我不确定你在找什么。在声明性语言的上下文中“迭代”的整个想法可能不是使用 XQuery 时的最佳目标。
  • 我不知道如何描述所需的输出 @JackFleeting 但我想我想要的是第 1 本书,然后是第 2 本书,等等。但是,个别不是作为一个单一的结果......
  • 你期望什么样的结果类型,如果你选择几个book元素那么结果是book元素的序列例如element(book)* 在那个 XPath/XQuery 序列类型类型系统中。不管你使用db:open('db-name')/bookstore/book 还是for $doc in db:open('db-name'), $store in $doc/bookstore, $book in $store/book return $book 的类型,结果都是book 元素的序列。
  • 如果序列意味着一系列不同的项目@MartinHonnen,那么这就是我所追求的序列。我想这已经是一系列书籍。我正在考虑一个数组、列表或其他集合的模拟。

标签: xml xpath xml-parsing xquery basex


【解决方案1】:

由于不清楚您想要输出的确切方式,请尝试这样的事情(我编造了一些结构)-它可能会让您接近最终目的地...

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>

【讨论】:

  • 我将暂时保持开放状态,但这正是我想要的。可能正如 Martin 所说,我的思维方式比声明式更重要。
猜你喜欢
  • 2021-03-21
  • 2010-11-15
  • 1970-01-01
  • 2014-12-18
  • 2017-07-25
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
相关资源
最近更新 更多