1

Zorba XQuery Processor を使用して複数の XML ファイルを更新し、変更の出力を同じファイルに保存する簡単な方法はありますか?

ここまでで、File モジュールと file:list 拡張子を使用して複数のファイルを処理し、ディレクトリ内のすべての XML ファイルを検索する方法を理解しました。次に、各ドキュメントをループし、XQuery Update ステートメントを実行します (ノード {} の値を {} に置き換えます)。問題は、これが実際にファイルを変更しないことです。

以前は Saxon を使用していましたが、この特定のプロジェクトにはライセンス コストが高すぎます。Saxon EE では、開いているドキュメントで「ノードの値を置換」を実行すると、クエリが終了したときにドキュメントがディスク上で更新されます。Zorba はこのようには機能せず、代わりにクエリ中にメモリ内の値を変更するだけだと思います。1 つのファイルを編集している場合は、変更した XML を Zorba で出力し、それをパイプで入力ファイルに戻しますが、この場合は多くのファイルを更新する必要があります。それは1つのクエリで可能ですか?

コードは次のようになります。

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")
}
4

1 に答える 1

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>
    );
}
于 2013-08-14T18:19:32.660 に答える