使用XQuery和Zorba更新多个XML文件

时间:2013-08-14 16:42:24

标签: xquery saxon xquery-update zorba

是否有一种简单的方法使用Zorba XQuery Processor更新多个XML文件并将修改的输出保存在同一个文件中?

到目前为止,我已经找到了如何使用File模块和file:list扩展来处理多个文件,以查找目录中的所有XML文件。然后我循环遍历每个文档并运行XQuery Update语句(用{}替换node {}的值。问题是这实际上并没有修改文件。

我之前使用过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")
}

1 个答案:

答案 0 :(得分:2)

想出来!我不得不使用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>
    );
}