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

时间:2015-04-16 06:25:09

标签: xml xslt xquery marklogic

示例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查询控制台执行,它将取代&#34;类别&#34;用&#34;娱乐&#34;和&#34;类别&#34;与&#34;娱乐&#34;。

但我们如何将其编写为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

2 个答案:

答案 0 :(得分:2)

简而言之,您需要针对REST-api服务器对/ v1 / config / transforms / yourtransformname执行PUT调用,并将XSLT作为请求主体。详情如下:

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

Content-type: application/xslt+xml

在那里,您可以将转换应用于/ v1 / documents(GET,POST和PUT),以及通过添加值为yourtransformname的转换请求参数来搜索/ v1 /搜索GET响应。详情如下:

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

HTH!

答案 1 :(得分: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

希望有所帮助。