示例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
答案 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()方法:
希望有所帮助。