XQuery文件:只写一行

时间:2016-01-19 23:08:40

标签: xquery basex

我希望以下查询将结果写入xml文件。目前,它只将结果的第一个元素写入xml文件,而不管有多少元素。

为什么会发生这种情况,我该如何解决?

let $fName := "C:\Users\user\Documents\Sitemaps\Updated Pages\Books.xml"

for $x in doc("http://www.w3schools.com/xsl/books.xml")/bookstore/book
where $x/price>0
return file:write($fName,$x/title)

3 个答案:

答案 0 :(得分:1)

根据您的代码,我希望它只能在文档中编写 last 标题。你不会说你正在使用哪个XQuery处理器,但这可能是一个实现定义的行为 - 可能相当于一个"冲突的更新"错误。

将整个查询包装在XML元素中(创建具有多个根节点的XML无效),并将整个文档写入磁盘(仅调用file:write一次):

file:write($fName,
  element titles {
    for $x in doc("http://www.w3schools.com/xsl/books.xml")/bookstore/book
    where $x/price>0
    return $x/title
  })

答案 1 :(得分:1)

对于BaseX,调用file:write()将覆盖任何现有文件内容。你正在为每个项目调用它,所以最后一个将“赢”。

http://docs.basex.org/wiki/File_Module#file:write

  

将序列化的项目序列写入指定的文件。如果   文件已存在,将被覆盖。

您应该更改XQuery以编写@wst建议的项目序列,或者确保每个项目都使用唯一的文件URI编写

答案 2 :(得分:1)

file:write()不是标准语言的一个特性,它依赖于副作用,因此效果很可能取决于您使用的是哪个XQuery处理器。您甚至没有显示名称空间声明,因此我们无法判断这是否应该是对EXPath file:write()函数的调用。

假设它是对EXPath file:write()函数的调用,那么file:write()的效果应该是写入整个文件内容,而不是追加到文件中。如果要附加到文件,请使用file:append()。然而,在这种情况下,我的直觉是在一次操作中将所有项目写入文件,即:

let $doc := doc("http://www.w3schools.com/xsl/books.xml")
return file:write($fName, $doc/bookstore/book[price>0]/title)