我正在向MarkLogic服务器发送一个http请求,类似于- 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>
我在这里做错什么了?
发布于 2016-12-10 10:07:35
我找到了解决办法。基本上,$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", "")
发布于 2016-12-10 21:27:05
在XQuery中简明地提供默认值的一个非常有用的成语依赖于xs:string到xs:boolean的转换规则以及
$sequence[.]使用“.”当序列表达式中的谓词将序列中的每个项计算为布尔值时,如果为true,则包含该项,如果为false,则排除该项。对于非零长度字符串,xs:string的转换规则为“true”,对于零长度或空序列,“false”为“false”。以下是xs序列的详细等效:string。
对于$item in $sequence,返回if( not(空( $item) )和string-length( $item ) >0),然后返回$item$item ()
因此,以下模式通常用于“如果$x不是空的或零长度,则使用$x,否则使用$y。
( $x , $y )[.][1]注意'1‘,它选择由前一个表达式产生的第一个项目。为$x提供默认值的示例,如
($x , "Default value")[.][1]对职能的结果或论点也是如此:
cts:search( doc() , ( get-the-search-string() , "default")[.][1] )其中'get-the-search- string ()‘可能返回一个空序列、一个零长度字符串或一个1或多个字符串序列。
在您的示例中,您希望默认使用一个空字符串,因此可以使用一个细微的变体来允许一个"“,而不是()
let $query := ($q-text,"")[1]https://stackoverflow.com/questions/41074319
复制相似问题