在 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 支持