document-uri не работает в XSLT, когда преобразование вызывается из eXist-db - PullRequest
0 голосов
/ 26 мая 2020

Это преобразование, называемое 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>

, не возвращает имя файла xml, обрабатываемого при вызове из exist-db с этим xQuery

xquery version "3.1";

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

It должен вернуть "/db/apps/data/aDatabaseFile.xml"

Похоже, была аналогичная проблема с MarkLogi c XSLT do c (uri) или document (uri) функция не разрешает uri в контексте базы данных контента?

1 Ответ

5 голосов
/ 26 мая 2020

Когда transform:transform выполняется в eXist-db, файл данных передается Saxon для преобразования. В этот момент Saxon не знает о контексте узла файла . Поэтому он не может сообщить "имя" файла.

Если кому-то нужно имя (или любые другие данные, относящиеся к его узлу), то Saxon нужно сообщить, как получить документ из базы данных. Для этого передается полный путь к документу в качестве параметра третьему аргументу функции transform:transform ($parameters). Этот параметр доступен для Saxon внутри таблицы стилей XSL (соответствие по имени), и он вернет то, что вам нужно

Параметр в качестве третьего аргумента:

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 .

Побочным эффектом этого является то, что вы не передаете документ непосредственно в функцию transform:transform, если Saxon может получить к нему доступ напрямую через указанный путь. Баланс этих методов зависит от того, где ваш код оптимизирован и где вы хотите, чтобы тяжелая работа выполнялась: с помощью движка eXist или Saxon ....

...