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