此转换称为docUri.xsl
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0" expand-text="yes">
<xsl:output method="text"/>
<xsl:template match="document-node()">{document-uri(.)}</xsl:template>
</xsl:stylesheet>
使用此xQuery从exist-db调用时,不返回正在处理的xml文件的名称
xquery version "3.1";
transform:transform(doc("/db/apps/data/aDatabaseFile.xml"),
doc("/db/apps/docUri.xsl"),())
它应该返回“ /db/apps/data/aDatabaseFile.xml”
好像在MarkLogic XSLT doc(uri) or document(uri) function not resolving uri in context of content database?上存在类似的问题
当在eXist-db中执行transform:transform
时,数据文件将移交给Saxon进行处理。那时,Saxon是不知道文件的节点上下文。因此,它无法报告文件的“名称”。
[如果要使用名称,则必须告诉Saxon如何从数据库中检索文档。为此,将full path作为参数传递给transform:transform
函数的第三个参数($parameters
)。该参数可用于XSL样式表中的Saxon(名称匹配),它将返回您需要的内容
参数作为第三个参数:
let $parameters :=
<parameters>
<param name="my_saxon_path" value="xmldb:exist://db/apps/data/aDatabaseFile.xml"/>
</parameters>
在XSL样式表中,您将参数引用为
<xsl:param name="my_saxon_path"/>
然后将参数用作常规节点:
<xsl:template match="document-node()">{document-uri($my_saxon_path)}</xsl:template>
这在eXist-db documentation中有完整的解释。
副作用是,如果Saxon可以直接通过提供的路径访问文档,则不会将文档直接传递给transform:transform
函数。这些技术之间的平衡取决于代码的优化位置和要执行的繁重工作:通过eXist的引擎,或Saxon的引擎。