2016-12-10 11 views
1

http:// http://localhost:7040/index.xqyのような、MarkLogicサーバーにHTTPリクエストを送信しています。リクエストは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>無効な強制:()をxs:string +として検索を実行中:

私がここで間違って何をしているのですか?

答えて

3

解決策が見つかりました。基本的に$ qtextは空のsequence()です。これは検索では許可されていません:search。私がしたのは -
let $query := if(fn:empty($q-text)) then "" else $q-textです。示唆したように
あなたもこのリンクはhttp://jaketrent.com/post/unexpected-results-marklogic-xquery-type-coercion/

を助けたlocalhost:7040/index.xqy?q= のようなものに要求を変更することができ、これは良いですxdmp:get-request-field("q", "") XQueryで簡潔にデフォルト値を提供するために非常に便利なイディオムは、xsの変換規則に依存している

+2

xdmpを可能にするために使用することができ、デフォルトとして空の文字列をしたいですフィールドのデフォルト値であるオプションの第2パラメータ。 'xdmp:get-request-field(" q "、" ")'を実行することができます。 –

+0

ohh! nice..thanks dave – basari66

2

:XSに文字列:

使用
$sequence[.] 

の行動と一緒にブール ''シーケンス式の述語はシーケンスの各アイテムをブール値として評価するため、trueの場合はそのアイテムが含まれ、falseの場合は除外されます。 xs:stringのブール値への変換ルールは、長さがゼロ以外の文字列の場合は 'true'、長さがゼロまたは空の場合は 'false'です。以下は、xs:stringのシーケンスに対する冗長な同等物です。 $配列中$アイテムの

リターン 場合(いない(空の($アイテム))と、文字列の長さ($アイテム)> 0)を 他$アイテム()

したがって、以下のパターンであります多くの場合、$ xは空またはゼロな長されていない場合、さもなければ$ yを使用して、「使用$ Xを言うために使用される。

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

注 『[1]』先行発現に起因することを最初の項目を選択する。 $ xのデフォルト値を

のように指定する例

cts:search(doc() , (get-the-search-string() , "default")[.][1]) 
空のシーケンスまたはゼロ長ストリングまたは1の配列を返すかもしれない「を取得 - 検索文字列を()」

:機能に結果または引数10

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

同じより多くの弦。取得要求フィールドを()も取る:あなたの例では

は、あなたはとてもわずかな変異体「」ではなく()

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

は間違いなく簡潔です。そしてそれは正確に見える。しかし、可読性/保守性に関する懸念はありますか? –

関連する問題