Xquery 转换错误 "Invalid coercion () as document-node()"
Xquery transform error "Invalid coercion () as document-node()"
我正在尝试使用 XQuery 将我的搜索结果转换为其他格式。我在文档中使用示例 XQuery 转换,例如:
xquery version "1.0-ml";
module namespace example = "http://marklogic.com/rest-api/transform/add-attr";
import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";
declare function example:transform(
$context as map:map,
$params as map:map,
$content as document-node()
) as document-node()
{
let $searchResult := $content
let $docs := fn:doc($searchResult/search:result/@uri)
return $docs
};
使用
安装转换
curl --anyauth --user user:password -X PUT -d@"./add-attr.xqy" -H "Content-type: application/xquery" 'http://IP-ADD:port/LATEST/config/transforms/add-attr?trans:name=string\?&trans:value=string\?'
现在,当我尝试使用如下转换搜索任何字符串时:
http://IP-ADD:port/v1/search?q=xyz&transform=add-attr
我收到以下错误:
<rapi:error
xmlns:rapi="http://marklogic.com/rest-api">
<rapi:status-code>500</rapi:status-code>
<rapi:status>INTERNAL ERROR</rapi:status>
<rapi:message-code>XDMP-AS</rapi:message-code>
<rapi:message>XDMP-AS: (err:XPTY0004) $service($context, $service-params, $input) -- Invalid coercion: ("{&quot;root&quot;:{&quot;claim&quot;:[{&quot;type&quot;:&quot;In...", ",") as document-node(). See the MarkLogic server error log for further detail.</rapi:message>
</rapi:error>
我正在尝试将每个文档从转换函数中的搜索结果转换为 JSON(我没有在上面包含该代码)。
我想念什么?我哪里错了?你能帮帮我吗?
提前致谢,
普里特维
错误是因为它实际上是文本节点,而不是文档节点。如果你想解决这个问题,你应该将预期的参数类型更改为元素节点(如 element() )。
转换在一次调用中接收整个 search:response。这意味着 $searchResult/search:result/@uri XPath 为您提供了一页的 URI(可能是十页)。当 return 类型只需要一个时,您 return 将它们作为一系列文档进行处理。您需要为它们提供一个包装器,以便您只有一个文档。类似于:
document {
fn:doc($content/search:result/@uri)
}
此外,您似乎想要使用完整文档,而不仅仅是片段。您可以通过将此添加到您的 REST 搜索选项来获取这些内容:
<transform-results apply="raw"/>
我正在尝试使用 XQuery 将我的搜索结果转换为其他格式。我在文档中使用示例 XQuery 转换,例如:
xquery version "1.0-ml";
module namespace example = "http://marklogic.com/rest-api/transform/add-attr";
import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";
declare function example:transform(
$context as map:map,
$params as map:map,
$content as document-node()
) as document-node()
{
let $searchResult := $content
let $docs := fn:doc($searchResult/search:result/@uri)
return $docs
};
使用
安装转换curl --anyauth --user user:password -X PUT -d@"./add-attr.xqy" -H "Content-type: application/xquery" 'http://IP-ADD:port/LATEST/config/transforms/add-attr?trans:name=string\?&trans:value=string\?'
现在,当我尝试使用如下转换搜索任何字符串时:
http://IP-ADD:port/v1/search?q=xyz&transform=add-attr
我收到以下错误:
<rapi:error
xmlns:rapi="http://marklogic.com/rest-api">
<rapi:status-code>500</rapi:status-code>
<rapi:status>INTERNAL ERROR</rapi:status>
<rapi:message-code>XDMP-AS</rapi:message-code>
<rapi:message>XDMP-AS: (err:XPTY0004) $service($context, $service-params, $input) -- Invalid coercion: ("{&quot;root&quot;:{&quot;claim&quot;:[{&quot;type&quot;:&quot;In...", ",") as document-node(). See the MarkLogic server error log for further detail.</rapi:message>
</rapi:error>
我正在尝试将每个文档从转换函数中的搜索结果转换为 JSON(我没有在上面包含该代码)。 我想念什么?我哪里错了?你能帮帮我吗?
提前致谢,
普里特维
错误是因为它实际上是文本节点,而不是文档节点。如果你想解决这个问题,你应该将预期的参数类型更改为元素节点(如 element() )。
转换在一次调用中接收整个 search:response。这意味着 $searchResult/search:result/@uri XPath 为您提供了一页的 URI(可能是十页)。当 return 类型只需要一个时,您 return 将它们作为一系列文档进行处理。您需要为它们提供一个包装器,以便您只有一个文档。类似于:
document {
fn:doc($content/search:result/@uri)
}
此外,您似乎想要使用完整文档,而不仅仅是片段。您可以通过将此添加到您的 REST 搜索选项来获取这些内容:
<transform-results apply="raw"/>