2017-03-16 48 views
0

我一直在通过教程来构建与marklogic休息服务。我已经通过使用roxy deploy工具和调用ml ext来构建了一个简单的示例。我的问题是试图通过休息呼叫从文档中获取特定元素。以下是我迄今为止:marklogic休息调用xpath操作[文档元素后的垃圾]

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返回文档。当我呼吁这个网址我得到这样的错误:

enter image description here

经过许多环节计算器看完这似乎从纯XPath返回一个片段干。问题是我不知道如何返回完整的结果。我曾经在某处读过我可以在我的“rest-api”文件夹中的某处设置属性,但这并没有阻止这个问题。所以我最终希望能够搜索关键字的特定文档的内部结构。

编辑:我会更好使用RXQ为此目的?

+1

我认为罪魁祸首是不是事实,你正在返回一个xml片段,但是您可能会将多个片段嵌入到一个文档节点中,这将成为无效的XML。将XPath从$ doc包装到使用'(..)[1]'的谓词后面,只选择第一个匹配的sitData以验证此想法。如果有帮助,退后一步,并考虑如何处理多个匹配。 – grtjn

+0

@grtjn所以这就是我想弄明白。如果我想搜索数据库中的特定文档,我不确定如何在不使用xpath的情况下完成该操作,并且如果文档中有多个xml片段,我怎样才能将它们作为单个文档发送。 – Joshhw

回答

1

根据您的意见:

如果我要搜索数据库中的一个特定的文件我不知道如何实现这一目标,而不使用XPath

如果你知道的URI你想要返回的文件,你可以用fn:doc($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") 
+0

嘿Dave,非常感谢您的回复,您的视频帮助我顺利达到了这一点。我的问题是,如果我只想选择符合我的搜索条件的某些文档,那么约束条件是不是一个好的途径? – Joshhw

+0

从您的参数看,可能是的,你想约束。我猜测policyNumber匹配一个元素或属性。这很容易通过[值约束]完成(http://docs.marklogic.com/guide/search-dev/appendixa#id_52778)。相同的方法可能适用于dataType。对于searchTerm,可以是传递给[/v1/search](http://docs.marklogic.com/REST/GET/v1/search)的“q”参数。您可以使用Roxy配置搜索选项 - 请参阅$ {project-home} /rest-api/config/options/all.xml。 –

+0

很高兴视频很有帮助! –

相关问题