XQuery file:write 只写一行

XQuery file:write only writes one line

我希望以下查询将结果写入 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)

根据您的代码,我希望它只在文档中写入 last 标题。您没有说明您使用的是哪个 XQuery 处理器,但这可能是 implementation-defined 行为 - 可能等同于 "conflicting updates" 错误。

将整个查询包裹在一个 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
  })

对于 BaseX,调用 file:write() 将覆盖任何现有文件内容。您正在为每个项目调用它,因此最后一个将 "win".

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

Writes a serialized sequence of items to the specified file. If the file already exists, it will be overwritten.

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

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

假设它是对 EXPath file:write() function, then the effect of file:write() should be to write the entire file contents, not to append to the file. If you want to append to the file, use file:append() 的调用。然而,在这种情况下,我的直觉是在一次操作中将所有项目写入文件,即:

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