Поддержка XSLT 3.0 в XML-преобразовании Marklogic

Я новичок в преобразованиях 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)

Пожалуйста, дайте мне знать, как решить эту проблему


person Antony    schedule 02.09.2020    source источник
comment
Согласно документам на странице docs.marklogic.com/guide/xquery/xslt они поддерживают XSLT 2.0, а не 3.0. Похоже, что они позволяют использовать свои собственные расширения модели данных W3C XDM в XQuery и XSLT, в XSLT, используя, например, xdmp:dialect="1.0-ml" в корневом элементе таблицы стилей, таким образом вы сможете использовать предоставляемое ими расширение карты, которое, однако, не указано W3C.   -  person Martin Honnen    schedule 02.09.2020
comment
@MartinHonnen Я попробовал ваше предложение, объявив xdmp:dialect=1.0-ml в таблице стилей, но по-прежнему получаю ту же ошибку.   -  person Antony    schedule 02.09.2020
comment
Как я уже сказал, их синтаксис и система типов для карт не соответствуют указанным W3C, поэтому я не думаю, что as="map(xs:string,xs:string)" будет работать, это больше похоже на <xsl:variable name="map" select="map:new() => map:with('foo', 'bar')"/>, а затем вы можете использовать <xsl:value-of select="map:get($map, 'foo')"/>. И я думаю, вам нужно объявить xmlns:map="http://marklogic.com/xdmp/map". В настоящее время у меня нет доступа к Marklogic, поэтому вы можете поэкспериментировать самостоятельно или подождать, пока не получите ответ от кого-то более понимающего.   -  person Martin Honnen    schedule 02.09.2020


Ответы (1)


MarkLogic поддерживает XSLT 2.0, но это не мешает вам использовать карты в стиле in-memory.

Просто объявите пространство имен карты MarkLogic в таблице стилей, после чего вы получите доступ к функциям карты MarkLogic. Просто обратите внимание на одно ключевое отличие: карты MarkLogic изменяемы, тогда как карты в XSLT 3.0 неизменяемы.

Другими словами, если вы добавляете/изменяете/удаляете контент на карту MarkLogic, скажем, с помощью map:put($map, "a", "b"), карта $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>
person Charles Foster    schedule 02.09.2020