0

我是 Marklogic XSLT 转换的新手,我有以下问题。

Marklogic 使用什么 XSLT 引擎来使用xdmp:xslt-invoke()函数转换文档?有没有一种方法可以在 Marklogic 中支持 XSLT 3.0 版本?

我正在尝试使用具有以下变量的 XSLT 3.0 版本进行转换

<xsl:variable name="format-map" as="map(xs:string,xs:string)">

在 Marklogic 中使用 xdmp:xslt-invoke() 函数时出现以下错误

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)

请让我知道如何解决这个问题

4

1 回答 1

3

MarkLogic 支持 XSLT 2.0,但这并不妨碍您使用内存中的样式映射。

只需在样式表中声明 MarkLogic 映射命名空间,就可以访问 MarkLogic 的映射函数。请注意 1 个关键区别,即 MarkLogic 的映射是可变的,而 XSLT 3.0 中的映射是不可变的。

换句话说,如果您向 MarkLogic 地图添加/更改/删除内容,例如map:put($map, "a", "b"),地图 $map 会直接就地更改 - 当您稍后尝试执行此操作时map:get($map, "a"),您将获得最新版本的内容a是,即“b”。

如果您尝试在 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>
于 2020-09-02T21:46:38.853 回答