XQuery связывает XSLT-преобразования

Я пытаюсь преобразовать XML-документ с помощью серии преобразований таблиц стилей XSL в eXist. Я хочу преобразовать его с pubs2 в pubs9. (Мне нужно связать результирующий документ одного преобразования со следующим преобразованием). Я пробовал несколько разных способов и думал, что это будет что-то вроде:

let $trans1 := for $a in $stylesheet/version[@pub = '3'] return transform:transform(doc("/db/myXML.xml"), $a, ())

let $trans2 := for $b in $stylesheet/version[@pub = '4'] return transform:transform(doc($trans1), $b, ())

так далее

let $trans9 := for $z in $stylesheet/version[@pub = '9'] return transform:transform(doc($trans8), $z, ())
return $trans9

Но я продолжаю получать ошибку кардинальности. Есть ли другой способ сделать это?

Кстати: я использую XQuery 1.0. Я надеюсь перейти на 3.0 очень скоро. :)


person user3793808    schedule 01.07.2014    source источник
comment
$trans1 — это последовательность узлов, поэтому вы не можете использовать чем в fn:doc, это одна из ошибок кардинальности, которую вы увидите.   -  person adamretter    schedule 01.07.2014


Ответы (1)


Вы можете использовать рекурсию, чтобы применить последовательность XSLT к исходному документу, связывая вывод первого с вводом второго и так далее. Я написал функцию local:transform-pipeline ниже, которая является функцией общего назначения, которая показывает, как это работает.

xquery version "1.0";

import module namespace transform = "http://exist-db.org/xquery/transform";

declare function local:transform-pipeline($src as document-node()+, $transforms as xs:anyURI*, $params as node()?) as document-node()+ {
    if(empty($transforms))then
        $src
    else
        let $results := 
            for $s in $src
            return
                for $result in transform:transform($s, doc($transforms[1]), $params)
                return
                    document { $result }
        return            
            local:transform-pipeline($results, subsequence($transforms, 2), $params)
};


let $xslts := (xs:anyURI("/db/1.xslt"), xs:anyURI("/db/2.xslt"), xs:anyURI("/db/n.xslt"))
return
    local:transform-pipeline(doc("/db/my-document.xml"), $xslts, ())
person adamretter    schedule 01.07.2014
comment
Должен ли этот код работать с eXist 4.4.0? Я адаптировал его, но продолжаю получать сообщение Невозможно настроить преобразователь [...] Контент не разрешен в прологе Ошибка для преобразования, которое отлично работает, когда я вызываю его через transform:transform - person karkraeg; 18.10.2018
comment
Получил работу, изменив первую строку объявления функции: declare function local:transform-pipeline($src, $transforms) as document-node()+ { - person karkraeg; 18.10.2018