You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 14:45:38