我有以下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中的文件,它看起来像这样:
我可能希望它被格式化为XQuery文件,所以我不确定这是否会导致问题。
我正在使用管理员用户对MarkLogic进行身份验证,以排除任何与权限相关的问题,但这似乎没有任何影响。
这是使用MarkLogic 8.0-6.1。
我不明白可能导致这种不同行为的原因。
答案 0 :(得分:5)
我认为这是由于您在XQuery中发布的方式。 如您所见,您的换行符已被删除,这可能意味着包含嵌套注释的XQuery未正确处理。 如果您使用&#34; - 数据二进制&#34;而不是&#34; -d&#34;它应该工作。