在eXist 4.4 / XQuery 3.1中,我使用transform:transform()
执行XSL 2.0转换。在转换中,我将一个参数传递到XSL转换中,以供Saxon使用以访问数据库中的信息。
<param name="paramSaxondatapath" value="xmldb:exist:///db/apps/deheresi/data/"/>
一切正常:Saxon从eXist-DB中的文档中检索所需的节点,并且XSL转换成功。
现在,我尝试从eXist-DB环境(本地驱动器,使用Oxygen)的外部执行相同的操作。因此,在XSLT文档中,我对参数进行了硬编码:
<xsl:param name="paramSaxondatapath">xmldb:exist:///db/apps/deheresi/data/</xsl:param>
但是,当我在本地启动XSLT文件(在Oxygen,本地XSLT文件,Saxon-HE 9.6.0.7中)时,Saxon抛出了一个异常unknown protocol: xmldb
FODC0002: Exception thrown by URIResolver:
Malformed URL
xmldb:exist:///db/apps/deheresi/data/bibliography.xml
(base file:/Users/foo/Desktop/De_Heresi/deheresi_TEI/fo_dep_single.xsl):
unknown protocol: xmldb
考虑到这是以相同的方式(即用doc(concat(paramSaxondatapath,'somefile.xml')
包装)传递给Saxon的,我很惊讶这两次都没有以相同的方式做出反应。
我应该使用其他URI吗?
非常感谢。
编辑:奇怪的是,如果我使用命令行进行转换(即未由氧气触发),Saxon会接受它并执行转换。看来与氧气有关...
答案 0 :(得分:0)
我的猜测是,当eXist调用Saxon时,它会设置一个URIResolver
来识别带有"xmldb:exist:"
前缀的URI并自行处理。在eXist环境之外,您需要提供自己的URIResolver
,其作用类似-连接到数据库并检索所需的文档。