用xpath操作的marklogic rest调用[文档元素之后的垃圾]

时间:2017-03-16 18:47:33

标签: xml rest xpath marklogic roxy

我一直在编写一个教程,用marklogic构建一个休息服务。我通过使用roxy deploy工具并调用ml ext来构建一个简单的示例。我的问题是试图通过休息调用从文档中获取特定元素。以下是我到目前为止的情况:

    declare
%roxy:params("dataType=xs:string","pNumber=xs:number", "sNumber=xs:string", "searchTerm=xs:string")
function jad:get(
  $context as map:map,
  $params  as map:map
) as document-node()*
{
  map:put($context, "output-types", "application/xml"),
  map:put($context, "accept-types", "multipart/mixed"),
  map:put($context, "output-status", (200, "OK")),
  let $doc := doc('testNew.xml')
  let $docs := $doc//stuff/pData/sData/headerData/bData/sitData[contains(., 'word')]
  let $c := json:config("custom"),

   $_ := map:put($c,"whitespace", "ignore"),
   $_ := map:put( $c , "camel-case" , fn:true() )
   let $results := search:search("word",
   <options xmlns="http://marklogic.com/appservices/search">
     <transform-results apply="raw"/>
   </options>)
return document{$doc//stuff/pData/sData/headerData/bData/sitData[contains(., 'word')]}

这经历了很多次迭代,但最终问题是我似乎无法在休息时沿着xpath返回文档。当我调用此URL时,我收到如下错误:

enter image description here

在阅读了许多stackoverflow链接后,这似乎源于Xpath只返回一个片段。问题是我不知道如何返回完整的结果。我曾经读过某个地方,我可以在我的&#34; rest-api&#34;文件夹,但这还没有解决这个问题。所以我最终希望能够搜索特定文档的关键字内部结构。

编辑:为了这个目的,我会更好地使用RXQ吗?

1 个答案:

答案 0 :(得分:1)

根据您的意见:

  

如果我想搜索数据库中的特定文档,我不知道如何在不使用xpath的情况下完成该操作

如果您知道要返回的文档的URI,则可以使用fn:doc($uri)获取该文档的URI。

  

如果我从文档中获得多个xml片段,我该如何将它们作为单个文档发送

这应该这样做:

let $results := search:search("word",
  <options xmlns="http://marklogic.com/appservices/search">
    <transform-results apply="raw"/>
  </options>)
return document { $results }

search:search返回单个XML元素;你需要返回一个文档节点,所以我把搜索结果包装在document { }中。

如果要返回多个元素,则需要将它们包含在单个父元素中,因为XML文档可能只有一个根:

return document{
  <root>{
    $doc//stuff/pData/sData/headerData/bData/sitData[contains(., 'word')]
  }</root>
}

另外,查看您的HTTP呼叫:

  

http://localhost:8040/v1/resources/decosta?dataType=thing&policyNumber=1234&searchTerm=thisthingrighthere

Parameters for REST API extensions are required to have an "rs:" prefix on them,以区别REST API本身的参数。因此,您的网址应如下所示:

  

http://localhost:8040/v1/resources/decosta?rs:dataType=thing&rs:policyNumber=1234&rs:searchTerm=thisthingrighthere

在您的扩展程序中,您可以访问以下参数:

let $data-type := map:get($params, "dataType")