2016-12-10 4 views
1

Я отправляю запрос http на сервер MarkLogic, что-то вроде - http://localhost:7040/index.xqy. Запрос захватывается с помощью xdmp:get-request-field("q"), которые принимают запрос в переменную, например $ qtext, и передают ее на search:search($qtext).
Это возвращает 404 не найдена ошибка с указанием
<error:xquery-version>1.0-ml</error:xquery-version> <error:message>Invalid coercion</error:message> <error:format-string>XDMP-AS: (err:XPTY0004) $qtext as xs:string+ -- Invalid coercion:() as xs:string+</error:format-string>

Что я здесь делаю неправильно?

ответ

3

Я нашел решение. В основном $ qtext - это пустая последовательность(), которая недопустима в поиске: поиск. Что я сделал -
let $query := if(fn:empty($q-text)) then "" else $q-text.
вы можете также изменить запрос на что-то вроде localhost:7040/index.xqy?q= Эта ссылка помогла http://jaketrent.com/post/unexpected-results-marklogic-xquery-type-coercion/

Как предположил, что это лучше xdmp:get-request-field("q", "")

+2

xdmp: получить-запрос-поле() также принимает необязательный второй параметр, который является значением по умолчанию для поля. Вы можете сделать 'xdmp: get-request-field (« q »,« »)'. –

+0

ohh! nice..thanks dave – basari66

2

Очень полезная идиома для предоставления значений по умолчанию сжато в XQuery основан на правилах конверсии хз : string to xs: boolean вместе с поведением

$sequence[.] 

Использование '.' поскольку предикат в выражении последовательности оценивает каждый элемент в последовательности как логический, если true, то этот элемент включен, если false, он исключен. Правило преобразования для xs: string для boolean является «true» для строк с ненулевой длиной и «false» для нулевой длины или пустых последовательностей. Ниже приведен подробный эквивалент последовательности xs: string.

за $ элемента $ последовательности возврата если (не (пусто ($ пункт)) и длины строки ($ элемент)> 0) тогда $ пункт еще()

Таким образом, следующая картина часто используется, чтобы сказать, «Использование $ х, если $ й не пусто или нулевой длиной, в противном случае использовать $ Y.

($x , $y)[.][1] 

Обратите внимание на„[1]“, который выбирает первый элемент, который в результате предшествующего выражения. Пример предоставления значения по умолчанию для $ x, как

($x , "Default value")[.][1] 

То же результаты или аргументы функций:

cts:search(doc() , (get-the-search-string() , "default")[.][1]) 

где «получить-на-поиск строку()» может вернуть пустую последовательность или строку нулевой длины или последовательность 1 или больше строк.

В вашем примере вы хотите пустую строку в качестве значения по умолчанию, так небольшой вариант может быть использован, чтобы позволить «», но не()

let $query := ($q-text,"")[1] 
+0

определенно кратким. И это кажется точным. Но какие-либо опасения относительно удобочитаемости/ремонтопригодности? –

Смежные вопросы