Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XQuery文件:只写一行_Xquery_Basex - Fatal编程技术网

XQuery文件:只写一行

XQuery文件:只写一行,xquery,basex,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:writ

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

基于您的代码,我希望它只写文档中的最后一个标题。您没有说您正在使用哪个XQuery处理器,但这可能是一种实现定义的行为——可能相当于“冲突更新”错误

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


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

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

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

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

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

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

仅供参考,StackSnippets仅用于可在浏览器中执行的代码(通常为JavaScript/CSS/etc)。对于XQuery,您应该使用StackOverflow编辑器中的
{}
按钮进行常规代码格式化。
let $doc := doc("http://www.w3schools.com/xsl/books.xml")
return file:write($fName, $doc/bookstore/book[price>0]/title)