xslt - XQuery 链接 XSLT 转换

标签 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 $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。 :)

最佳答案

您可以使用递归将一系列 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 - XQuery 链接 XSLT 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24510063/

相关文章:

javascript - 如何将 XSL 变量传递给 Javascript 函数?

xml - 在 XSLT 中获取父元素

xml - 如何使用 XPath 选择最后 N 个元素?

xpath - XQuery 中是否有任何方法可以获取自某个 Epoch 以来以毫秒为单位的当前时间?

HTML 表格输出

xml - 如何使用 XPath 显示所有节点子节点、子节点以及更深层的节点

java - 在与之交互之前如何等待另一个应用程序(eXist-db)启动(使用java)?

java - 如何在 Java 中使用 .sef 文件运行 XSLT 转换

xquery-获取单个父元素中不为空的元素的计数

exist-db - 在 Linux 中的文件系统上查找存储在 exist-db 中的 XML 文件