我正在向MarkLogic服务器发送一个http get请求,类似于 - http://localhost:7040/index.xqy。使用xdmp:get-request-field("q")
捕获请求,该search:search($qtext)
接受查询到变量,比如$ qtext并将其传递给<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>
。
这将返回404未找到的错误说明
let $query := if(fn:empty($q-text)) then "" else $q-text
我在这里做错了什么?
答案 0 :(得分:3)
我找到了解决方案。基本上$ qtext是空序列(),这在搜索中是不允许的:搜索。我做的是 -
localhost:7040/index.xqy?q=
。
您也可以将请求更改为xdmp:get-request-field("q", "")
之类的内容
此链接有助于http://jaketrent.com/post/unexpected-results-marklogic-xquery-type-coercion/
根据建议,这更好visit
答案 1 :(得分:2)
在XQuery中简洁地提供默认值的一个非常有用的习惯用法依赖于xs:string到xs:boolean的转换规则以及
的行为$sequence[.]
使用'。'因为序列表达式中的谓词将序列中的每个项目评估为布尔值,如果为true,则包含该项目,如果为false,则将其排除。 xs:string to boolean的转换规则对于非零长度字符串是'true',对于零长度或空序列是'false'。以下是xs:string序列的详细等价。
$ item中的$ item 返回 if(not(empty($ item))和string-length($ item)&gt; 0) 然后$ item else()
因此,以下模式通常用于表示“使用$ x IF $ x不为空或零长度,否则使用$ y。
( $x , $y )[.][1]
注意'[1]',它选择前一个表达式产生的第一个项目。 提供$ x的默认值的示例,如
($x , "Default value")[.][1]
对于函数的结果或参数也一样:
cts:search( doc() , ( get-the-search-string() , "default")[.][1] )
其中'get-the-search-string()'可能返回一个空序列或一个零长度字符串或一个或多个字符串的序列。
在你的例子中,你想要一个空字符串作为默认字符串,因此可以使用一个轻微的变体来允许“”而不是a()
let $query := ($q-text,"")[1]