Когда 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 ....