Вызов 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-вызов:

HTTP: // локальный: 8040 / v1 / ресурсы / Decosta DATATYPE = вещь и policyNumber = 1234 & SEARCHTERM = thisthingrighthere

Параметры для расширений REST API должны иметь префикс "rs:", чтобы отличать их от параметров самого REST API. Так что ваш URL должен выглядеть так:

HTTP: // локальный: 8040 / v1 / ресурсы / Decosta RS: DATATYPE = вещь и RS: policyNumber = 1234 & RS: SEARCHTERM = thisthingrighthere

В вашем расширении вы можете получить доступ к таким параметрам:

let $data-type := map:get($params, "dataType")
Другие вопросы по тегам