【问题标题】:document-uri not working in XSLT when transform is called from eXist-db从 eXist-db 调用转换时,document-uri 在 XSLT 中不起作用
【发布时间】:2020-05-26 13:43:44
【问题描述】:

这个转换叫做 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 从存在数据库调用时不返回正在处理的 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】:

    在 eXist-db 中执行transform:transform 时,会将数据文件交给 Saxon 进行转换。那时撒克逊人不知道文件的节点上下文。因此它不能报告文件的“名称”。

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

    参数作为第三个参数:

    let $parameters :=
        <parameters>
            <param name="my_saxon_path" value="xmldb:exist://db/apps/data/aDatabaseFile.xml"/>
        </parameters>
    

    在您的 XSL 样式表中,您将参数引用为

    &lt;xsl:param name="my_saxon_path"/&gt;

    然后将参数作为常规节点使用:

    &lt;xsl:template match="document-node()"&gt;{document-uri($my_saxon_path)}&lt;/xsl:template&gt;

    这在eXist-db documentation中有充分的解释。

    这样做的副作用是,如果 Saxon 可以通过提供的路径直接访问它,您就不会将文档直接传递给 transform:transform 函数。平衡这些技术取决于您的代码在哪里进行优化以及您希望在哪里完成繁重的工作:通过 eXist 的引擎或 Saxon 的....

    【讨论】:

      猜你喜欢
      • 2014-10-10
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-31
      相关资源
      最近更新 更多