Поддержка XSLT 3.0 в преобразовании Marklogic xml
Я новичок в преобразованиях Marklogic XSLT, и у меня есть следующие вопросы.
Какой механизм XSLT использует Marklogic для преобразования документа с помощью xdmp:xslt-invoke()
Есть ли способ, которым мы можем поддерживать версию XSLT 3.0 в Marklogic?
Я пытаюсь использовать версию XSLT 3.0 с переменной ниже для преобразования
<xsl:variable name="format-map" as="map(xs:string,xs:string)">
и я получаю ошибку ниже при использовании функции xdmp:xslt-invoke() в Marklogic
XSLT-BADSEQTYPE: (err:XTSE0020) /*:stylesheet/*:variable[1] -- Invalid sequence type: /*:stylesheet/*:variable[1]/@as (XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax error, unexpected Lpar_, expecting $end)
Пожалуйста, дайте мне знать, как решить эту проблему
1 ответ
MarkLogic поддерживает XSLT 2.0, но это не мешает вам использовать карты стилей в памяти.
Просто объявите пространство имен карты MarkLogic в таблице стилей, и тогда вы получите доступ к функциям карты MarkLogic. Просто обратите внимание на одно ключевое отличие: карты MarkLogic изменяемы, тогда как карты в XSLT 3.0 неизменны.
Другими словами, если вы добавляете / изменяете / удаляете контент на карту MarkLogic, скажем, map:put($map, "a", "b")
, map $map изменяется напрямую, на месте - и когда вы пытаетесь сделать map:get($map, "a")
позже вы получите самую последнюю версию того, что a
есть, то есть "б".
Если вы попытаетесь обновить карту в XSLT 3.0, вы получите совершенно новую обновленную неизменяемую копию.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:map="http://marklogic.com/xdmp/map"
exclude-result-prefixes="map"
version="2.0">
<xsl:variable name="my-map" as="map:map" select="map:map()" />
<xsl:template match="/">
<xsl:sequence select="map:put($my-map, 'a', 'b')"/>
<xsl:value-of select="map:get($my-map, 'a')"/>
</xsl:template>
</xsl:stylesheet>