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

XQuery file inserted into MarkLogic using REST API causes unexpected syntax error

我有以下 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 文档。

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

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_"}}

在查询控制台中查看文件,它看起来像这样:

我可能希望它的格式类似于 XQuery 文件,所以我不确定这是否会导致问题。

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

这是使用 MarkLogic 8.0-6.1。

我不明白是什么导致了这种不同的行为。

我认为这是由于您在 XQuery 中发帖的方式所致。 如您所见,您的换行符已被删除,这可能意味着未正确处理包含嵌套注释的 XQuery。 如果你使用“--data-binary”而不是“-d”,它应该可以工作。