有没有一种简单的方法可以使用Zorba XQuery处理器更新多个XML文件并将修改的输出保存回同一个文件?
到目前为止,我已经了解了如何使用File模块和File:list扩展名来处理多个文件,以查找目录中的所有XML文件。然后循环遍历每个文档并运行XQueryUpdate语句(用{}替换节点{}的值)。问题是,这实际上并没有修改文件。
我以前使用过Saxon,但对于这个特定的项目来说,许可证成本太高了。在Saxon EE中,如果我在打开的文档上运行"替换节点值",那么当查询完成时,该文档将在磁盘上更新。我怀疑Zorba不是这样工作的,而是只在查询过程中修改内存中的值。如果我编辑一个文件,我只会在Zorba中输出修改后的XML,并将其管道返回到输入文件,但在这种情况下,我想更新许多文件。这在一个查询中可能吗?
以下是代码的样子:
import module namespace file = "http://expath.org/ns/file";
for $file in file:list("XML", true(), "*.xml")
let $doc := doc(concat("XML/", $file))
return
{
for $key in $doc//key
return
replace value of node $key/texture
with replace($key/material/text(), ".mat", ".png")
}
想明白了!我不得不使用Zorba提供的XQuery脚本扩展将结果重写回文件:
declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";
import module namespace file = "http://expath.org/ns/file";
for $file in file:list("XML", true(), "*.xml")
return
{
variable $doc := doc(concat("XML/", $file));
for $key in $doc//key
return
replace value of node $key/texture
with replace($key/material/text(), ".mat", ".png");
file:write(concat("XML/", $file), $doc,
<output:serialization-parameters>
<output:indent value="yes"/>
<output:method value="xml"/>
<output:omit-xml-declaration value="no"/>
</output:serialization-parameters>
);
}