Обновите несколько файлов 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>
);
}