Вызов marklogic rest с манипуляцией с xpath [мусор после элемента документа]
Я работал над учебником по созданию службы отдыха с marklogic. Я построил простой пример с помощью инструмента развертывания roxy и вызова ml ext . Моя проблема заключается в попытке извлечь конкретный элемент из документа с помощью вызова rest . Вот что у меня есть:
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, я получаю сообщение об ошибке:
После прочтения многих ссылок на stackru это, кажется, происходит из Xpath, возвращающего только фрагмент. Проблема в том, что я не знаю, как вернуть полные результаты. Я где-то читал, что могу установить свойство где-нибудь в своей папке rest-api, но это не остановило эту проблему. Поэтому в конечном итоге мне бы хотелось найти ключевые слова во внутренней структуре конкретного документа.
РЕДАКТИРОВАТЬ: было бы лучше использовать RXQ для этой цели?
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-вызов:
Параметры для расширений REST API должны иметь префикс "rs:", чтобы отличать их от параметров самого REST API. Так что ваш URL должен выглядеть так:
В вашем расширении вы можете получить доступ к таким параметрам:
let $data-type := map:get($params, "dataType")