XQuery链接XSLT转换

XQuery链接XSLT转换,xslt,xquery,exist-db,Xslt,Xquery,Exist Db,我试图通过eXist中的一系列XSL样式表转换来转换XML文档。我想将其从pubs2向上转换为pubs9。(我需要将一个转换的结果文档链接到下一个转换中)我尝试了几种不同的方法,我认为它应该是这样的: let $trans1 := for $a in $stylesheet/version[@pub = '3'] return transform:transform(doc("/db/myXML.xml"), $a, ()) let $trans2 := for $b in $styleshe

我试图通过eXist中的一系列XSL样式表转换来转换XML文档。我想将其从
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, ())

但我一直在犯基数错误。有不同的方法吗


顺便说一句:我使用的是XQuery 1.0。我希望很快转换成3.0。:)

您可以使用递归将一系列XSLT应用于源文档,将第一个XSLT的输出链接到第二个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, ())

可以使用递归将XSLT序列应用于源文档,将第一个XSLT的输出链接到第二个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, ())

$trans1是一个节点序列,因此您不能在
fn:doc
中使用than,这是您将看到的基数错误之一。$trans1是一个节点序列,因此您不能在
fn:doc
中使用than,这是您将看到的基数错误之一。此代码是否适用于eXist 4.4.0?我对它进行了修改,但我不断收到一个“无法设置transformer[…]prolog中不允许内容”错误,当我通过
transform:transform
调用它时,它工作正常,通过更改函数声明的第一行:
declare function local:transform pipeline($src,$transforms)作为document-node()+{
这段代码应该与eXist 4.4.0一起使用吗?我对它进行了调整,但我不断得到一个“无法设置transformer[…]prolog中不允许内容”当我通过
transform:transform
调用一个转换时,该转换出现错误,通过更改函数声明的第一行使其正常工作:
declare function local:transform pipeline($src,$transforms)as document-node()+{