使用REST API插入MarkLogic的XQuery文件会导致意外的语法错误

时间:2017-04-13 07:32:36

标签: rest deployment xquery marklogic

我有以下XQuery文件,它从一系列节点组装JATS XML document(内容在内容管理系统中保存为单独的文件):

let $jatsManifest := xdmp:unquote(xdmp:get-request-body())
let $jatsDoc := xdmp:xslt-eval(

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xdmp="http://marklogic.com/xdmp" extension-element-prefixes="xdmp" version="2.0">

<xsl:template match="/">
  <article xmlns:xlink="http://www.w3.org/1999/xlink">
      <xsl:variable name="node"><xsl:value-of select="concat('/workspace/SpacesStore/', /jats-manifest/@id)"/></xsl:variable>
      <xsl:copy-of select="document($node)" />
<body>
    <xsl:apply-templates select="jats-manifest/segment" />
</body>
</article>
</xsl:template>

<xsl:template match="segment">
    <!-- Create an ID that passes the JATS manifest validation (workspace-SpacesStore-{UUID}) -->
    <xsl:variable name="nodeId"><xsl:value-of select="replace(replace(@id, '://', '-'), '/', '-')"/></xsl:variable>
    <sec id="{{$nodeId}}">
        <!-- Create the nodeName as known in ML (/workspace/SpacesStore/{UUID}) -->
        <xsl:variable name="node"><xsl:value-of select="replace(concat('/', @id), '://', '/')"/></xsl:variable>
        <title><xsl:copy-of select="document($node)"/></title>
        <xsl:apply-templates />
    </sec>
</xsl:template>

<xsl:template match="chunk">

  <!-- Create the nodeName as known in ML (/workspace/SpacesStore/{UUID}) -->
  <xsl:variable name="node"><xsl:value-of select="replace(concat('/', @id), '://', '/')"/></xsl:variable>
  <xsl:copy-of select="document($node)"/>
</xsl:template>

</xsl:stylesheet>
,
$jatsManifest)
let $articleId := $jatsManifest/jats-manifest/@id
let $jatsURL := fn:concat('/JATS/workspace/SpacesStore/', $articleId)
let $_ := xdmp:document-insert($jatsURL, $jatsDoc)
return $jatsURL

可以在URL http://localhost:8012/generateJATSDoc.xqy的MarkLogic服务器上访问它,并在HTTP正文中接受类似的内容:

<?xml version="1.0" encoding="UTF-8"?>
<jats-manifest id="c4b3baaa-038c-43cf-8667-31b208cdb6ad">
    <title>English</title>
    <segment id="workspace://SpacesStore/bc4a3486-0c4d-4f95-b677-61269645fc26">
        <chunk id="workspace://SpacesStore/8535cbe4-0b90-4d4e-baf4-8de678d7438f"/>
    </segment>
</jats-manifest>

如果处理XQuery文件的MarkLogic应用服务器设置为使用文件系统作为模块数据库,则可正常工作并组装JATS文档。

但是,如果应用服务器使用数据库作为模块,并使用MarkLogic REST API将XQuery文件插入数据库,如下所示:

curl -v -X PUT --anyauth -u admin:admin --header "Content-Type:application/xquery" \
-d@"generateJATSDoc.xqy" \
"http://127.0.0.1:8012/v1/documents?uri=/generateJATSDoc.xqy&database=My-Modules-Database"

以完全相同的方式调用它时出现以下错误:

{"errorResponse":{"statusCode":400, "status":"Bad Request", "messageCode":"XDMP-UNEXPECTED", "message":"XDMP-UNEXPECTED: (err:XPST0003) Unexpected token syntax error, unexpected Dollar_"}}

查看Query Console中的文件,它看起来像这样:

Screenshot of XQuery file after inseting via REST

我可能希望它被格式化为XQuery文件,所以我不确定这是否会导致问题。

我正在使用管理员用户对MarkLogic进行身份验证,以排除任何与权限相关的问题,但这似乎没有任何影响。

这是使用MarkLogic 8.0-6.1。

我不明白可能导致这种不同行为的原因。

1 个答案:

答案 0 :(得分:5)

我认为这是由于您在XQuery中发布的方式。 如您所见,您的换行符已被删除,这可能意味着包含嵌套注释的XQuery未正确处理。 如果您使用&#34; - 数据二进制&#34;而不是&#34; -d&#34;它应该工作。