在 MarkLogic 中使用 XSLT/XQUERY 进行转换?

Posted

技术标签:

【中文标题】在 MarkLogic 中使用 XSLT/XQUERY 进行转换?【英文标题】:transformations using XSLT/XQUERY in MarkLogic? 【发布时间】:2015-06-22 09:29:03 【问题描述】:

示例 XML:

let $xml := document 
  <doc>
    <p>sample</p>
    <categories>
      <category>comdey</category>
      <category>drama</category>
    </categories>
  </doc>

代码:

let $xsl :=
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="ISO-8859-1" indent="no"/>

    <xsl:template match="category">
      <entertainment>
        <xsl:apply-templates select="@*|node()"/>
      </entertainment>
    </xsl:template>

    <xsl:template match="categories">
      <entertainments>
        <xsl:apply-templates select="@*|node()"/>
      </entertainments>
    </xsl:template>

    <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
    </xsl:template>

  </xsl:stylesheet>

return xdmp:xslt-eval($xsl, $xml)

上述代码可以从 MarkLogic 查询控制台执行,它将“类别”替换为“娱乐”,将“类别”替换为“娱乐”。

但是我们如何将其编写为 MarkLogic xslt 转换,可以使用 REST API 或 Java API 安装并应用于保存在 MarkLogic 中的 xml 文件。

阅读: 通过 JAVA API 创建和安装转换已经实现,并且正在为 MarkLogic 站点中给出的示例内容转换文件工作。

问题是我们不清楚如何将此 xslt 代码转换为 MarkLogic 指定的转换方言。我们确实尝试过转换,但出现了错误(在底部提到)

trail.xslt 代码:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:example="http://marklogic.com/rest-api/transform/trial"
    xmlns:map="http://marklogic.com/xdmp/map">
  <xsl:param name="context" as="map:map"/>
  <xsl:param name="params"  as="map:map"/>
  <xsl:template match="genre">
    <entertainment>
      <xsl:apply-templates select="@*|node()"/>
    </entertainment>
  </xsl:template>

  <xsl:template match="genres">
    <entertainments>
      <xsl:apply-templates select="@*|node()"/>
    </entertainments>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

我们已将上述代码保存为 trail.xslt 并尝试安装转换但遇到一些错误,错误如下

错误:

HTTP Status 500 - Request processing failed; nested exception is com.marklogic.client.FailedRequestException: Local message: config/transforms write failed: Bad Request. Server Message: RESTAPI-INVALIDCONTENT: (err:FOER0000)


Invalid content: invalid trial extension: could not parse XQuery extension trial; please see the server error log for detail XDMP-IMPORTMOD: Cannot import Main Module /marklogic.rest.transform/trial/assets/transform.xqy; trial either is not a valid module or does not provide extension functions (transform) in the http://marklogic.com/rest-api/transform/trial namespace

【问题讨论】:

【参考方案1】:

简而言之,您需要对您的 REST-api 服务器执行对 /v1/config/transforms/yourtransformname 的 PUT 调用,并将 XSLT 作为请求正文。详细说明如下:

http://docs.marklogic.com/REST/PUT/v1/config/transforms/[name]

其中一个重要的一点是,当您推送 XSLT 时,请确保证明以下标头,否则它可能会假定它是 XQuery,就像您的错误消息所假设的那样:

Content-type: application/xslt+xml

在那里,您可以将转换应用于 /v1/documents(GET、POST 和 PUT)以及 /v1/search GET 响应,方法是添加一个值为 yourtransformname 的转换请求参数。详情在这里:

http://docs.marklogic.com/REST/GET/v1/documents http://docs.marklogic.com/REST/POST/v1/documents http://docs.marklogic.com/REST/PUT/v1/documents http://docs.marklogic.com/REST/POST/v1/documents@extension=[ext] http://docs.marklogic.com/REST/GET/v1/search http://docs.marklogic.com/REST/POST/v1/search (也许还有更多……)

api 参考文档包含大量指向用户指南的深层链接。这些通常也值得一读。

HTH!

【讨论】:

我们更新了问题。通过 JAVA API 安装转换已经实现,并且适用于 Marklogic 站点中给出的示例内容转换文件。如问题所述,它会引发一些错误。 我更新了答案。该消息似乎表明它安装不正确。也可能有助于提供安装它的代码或命令..【参考方案2】:

从错误消息看来,安装程序正在编写带有 *.xqy 消息的转换,这意味着安装程序正在尝试将转换解析为 XQuery。

您是否可能正在使用 writeXQueryTransform() 方法编写转换?

如果是这样,请尝试使用 writeXSLTransform() 方法:

http://docs.marklogic.com/javadoc/client/com/marklogic/client/admin/TransformExtensionsManager.html#writeXSLTransform%28java.lang.String,%20com.marklogic.client.io.marker.XMLWriteHandle%29

希望对您有所帮助。

【讨论】:

以上是关于在 MarkLogic 中使用 XSLT/XQUERY 进行转换?的主要内容,如果未能解决你的问题,请参考以下文章

Camel + marklogic不使用Marklogic Content Pump

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

Marklogic xml 转换中的 XSLT 3.0 支持

使用 MarkLogic 的 REST API 设置文档权限

在Docker中安装MarkLogic的2节点群集

在 Marklogic 数据库中存储名称/值对的最有效方法是啥