在eXist-db中使用fn:transform()时XSL导入路径异常求助
解决eXist-db中fn:transform()加载XSL导入文件的问题
以下是几种可行的解决方案,针对你遇到的Saxon在本地文件系统而非eXist-db库中查找导入XSL的问题:
直接加载样式表节点而非使用路径
用xmldb:document()先把主样式表加载为节点,再传给transform()的stylesheet-node参数。这种方式会保留样式表的原始xmldb URI上下文,Saxon会自动基于此解析相对路径的导入文件:let $main-stylesheet := xmldb:document('/db/sample.xsl') return transform(map { 'stylesheet-node': $main-stylesheet, 'source-node': $xml })动态获取正确的基础URI
如果坚持使用stylesheet-location参数,不要硬编码基础URI,而是通过主样式表的文档URI动态生成:let $stylesheet-uri := xmldb:document-uri('/db/sample.xsl') let $base-uri := resolve-uri('.', $stylesheet-uri) return transform(map { 'stylesheet-location': $stylesheet-uri, 'source-node': $xml, 'stylesheet-base-uri': $base-uri })这种方式能确保基础URI和主样式表的实际存储路径完全一致,避免硬编码可能带来的上下文不匹配问题。
显式指定eXist-db的URI解析器
部分eXist-db版本中,fn:transform()可能没有默认继承eXist的URI解析上下文,此时可以显式指定eXist的内置解析器:transform(map { 'stylesheet-location': 'xmldb:exist:///db/sample.xsl', 'source-node': $xml, 'uri-resolver': exist:create-uri-resolver() })
额外检查项:
- 确认
functions.xsl和sample.xsl确实存储在eXist-db的同一目录(/db/)下,若不在同一目录,需修改xsl:import的href为正确的相对路径(比如./utils/functions.xsl)。 - 验证eXist-db的Saxon版本,部分旧版Saxon HE对XSLT 3.0的
fn:transform()参数支持存在局限性,若条件允许可升级到Saxon PE/EE或更新eXist-db版本。
内容的提问来源于stack exchange,提问作者lschult2
相关产品推荐
相关产品推荐

