簡體   English   中英

在MarkLogic中使用XSLT / XQUERY進行轉換?

[英]transformations using XSLT/XQUERY in 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查詢控制台執行,它將用“娛樂”代替“類別”,用“娛樂”代替“類別”。

但是,我們如何將其編寫為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

簡而言之,您需要使用XSLT作為請求主體,對REST-api服務器對/ v1 / config / transforms / yourtransformname進行PUT調用。 詳細信息在這里描述:

重要的一點是,當您推送XSLT時,請確保證明以下標頭,否則可以假設它是XQuery,就像您的錯誤消息所假設的那樣:

Content-type: application/xslt+xml

到達那里后,您可以通過添加值為yourtransformname的轉換請求參數,將轉換應用於/ v1 / documents(GET,POST和PUT)以及/ v1 / search GET響應。 詳細信息在這里:

api參考文檔包含許多深入到用戶指南的鏈接。 這些通常也值得一讀。

HTH!

從錯誤消息中,看起來安裝程序正在使用* .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

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM