我正在尝试通过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
但我一直收到基数错误。有没有不同的方法呢?
BTW:我正在使用XQuery 1.0。我希望很快转换为3.0。 :)
答案 0 :(得分:3)
您可以使用递归将一系列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, ())