Обновите несколько файлов XML, используя XQuery и Zorba

Существует ли простой способ использования процессора Zorba XQuery для обновления нескольких файлов XML и сохранения результатов модификации обратно в одном файле?

До сих пор я выяснил, как обрабатывать несколько файлов, используя модуль File и расширение file:list, чтобы найти все файлы XML в каталоге. Затем я перебираю каждый документ и запускаю инструкцию XQuery Update (замените значение узла {} на {}). Проблема в том, что это на самом деле не изменяет файл.

Я использовал Saxon раньше, но стоимость лицензии слишком высока для этого конкретного проекта. В Saxon EE, если я запускаю "заменить значение узла" в открытом документе, документ будет обновляться на диске после завершения запроса. Я подозреваю, что Zorba не работает таким образом, а только изменяет значение в памяти во время запроса. Если бы я редактировал один файл, я бы просто вывел измененный XML в Zorba и передал его обратно во входной файл, но в этом случае я хочу обновить много файлов. Это возможно в одном запросе?

Вот как выглядит код:

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 ответ

Догадаться! Мне пришлось использовать расширение сценариев XQuery, которое предоставляет Zorba, чтобы переписать результат обратно в файл:

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>
    );
}
Другие вопросы по тегам