XQuery文件:只写一行
我希望下面的查询将结果写入xml文件。目前,它只将结果的第一个元素写入xml文件,而不管有多少个元素 为什么会发生这种情况?我如何修复它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
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处理器。您甚至还没有显示名称空间声明,因此我们无法判断这是否应该是对EXPathfile: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)