无效的强制:() 作为 xs:string+ 在执行 search:search($qtext)



我正在向MarkLogic服务器发送一个http get请求,类似于 - 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>

我在这里做错了什么?

我找到了解决方案。基本上$qtext是空序列(),这在search:search中是不允许的。我所做的是 -
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", "")

在 XQuery 中简洁地提供默认值的一个非常有用的习惯用法依赖于 xs:string 到 xs:boolean 的转换规则以及

$sequence[.]

在序列表达式中使用 '." 作为谓词将序列中的每个项目计算为布尔值,如果为 true,则包含该项,如果为 false,则排除该项。xs:string 到布尔值的转换规则对于非零长度字符串为"true",对于零长度或空序列为"false"。以下是 xs:string 序列的详细等效项。

对于$sequence的$item 返回 if( not( empty( $item) ) 和 string-length($item)> 0 ) 然后$item其他()

因此,以下模式通常用于表示"使用 IF $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]

最新更新