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

问题描述 投票:0回答:1

此转换称为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?上存在类似的问题

xslt xquery exist-db
1个回答
0
投票

当在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的引擎。

© www.soinside.com 2019 - 2024. All rights reserved.