Marklogic xml 转换中的 XSLT 3.0 支持

Posted

技术标签:

【中文标题】Marklogic xml 转换中的 XSLT 3.0 支持【英文标题】:XSLT 3.0 support in Marklogic xml transformation 【发布时间】:2020-12-21 10:34:48 【问题描述】:

我是 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)

请告诉我如何解决这个问题

【问题讨论】:

根据docs.marklogic.com/guide/xquery/xslt 的文档,他们支持 XSLT 2.0,而不是 3.0。似乎允许在 XQuery 和 XSLT 中使用他们自己的 W3C XDM 数据模型扩展,在 XSLT 中使用例如xdmp:dialect="1.0-ml" 在样式表的根元素上,这样您就可以使用他们提供的地图扩展名,然而,这不是 W3C 指定的。 @MartinHonnen 我通过在样式表中声明 xdmp:dialect="1.0-ml" 尝试了您的建议,但仍然遇到相同的错误。 正如我所说,它们的地图语法和类型系统不是 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,因此您可能想自己进行试验或等到您从更有洞察力的人那里得到答案。 【参考方案1】:

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>

【讨论】:

以上是关于Marklogic xml 转换中的 XSLT 3.0 支持的主要内容,如果未能解决你的问题,请参考以下文章

如何在Marklogic或Couchbase中进行xslt类型转换?

xslt 节点替换然后用 javascript 摄取

XML 文件中的 XML 模式声明破坏了 XSLT 转换 [重复]

使用 XSLT 转换 xml 中的特殊字符

xslt 3.0 json-to-xml 和 xml-to-json 转换

使用 XSLT 进行空前缀转换的 XML [重复]