当从 eXist-db 调用转换时,document-uri 在 XSLT 中不起作用

document-uri not working in XSLT when transform is called from eXist-db

此转换称为 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>

不是 return 使用此 xQuery 从 exist-db 调用时正在处理的 xml 文件的名称

xquery version "3.1";

transform:transform(doc("/db/apps/data/aDatabaseFile.xml"),
                    doc("/db/apps/docUri.xsl"),())  

应该return“/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 不知道文件的节点上下文。因此它无法报告文件的 "name"。

如果需要名称(或与其节点相关的任何其他数据),则必须告诉 Saxon 如何从数据库中检索文档。为此,需要将 完整路径 作为参数传递给 transform:transform 函数的第三个参数 ($parameters)。 XSL 样式表中的 Saxon 可以使用此参数(根据名称匹配),它将 return 您需要的

作为第三个参数的参数:

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 的....