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