大家好我想尝试使用 CTS 查询以及符合 CTS 查询的用户输入 XML 字符串。
test.xqy:
let $query:=xdmp:unquote(xdmp:get-request-field('query'))
let $results:=cts:search(/,$query)
return
<r>
<q>
{$query}
</q>
{$results}
</r>
查询将是
<cts:element-value-query>
<cts:element>date</cts:element>
<cts:text xml:lang="en">2013-11-18</cts:text>
</cts:element-value-query>
我不明白的是,总是没有结果。运用 用
替换 $ querylet $query:=cts:element-value-query(xs:QName("date"),"2013-11-18")
始终有效。
所以我不明白,使用xdmp:unquote
转换的自定义xml字符串与cts:element-value-query
之间的区别是什么。我已将它们都打印出来并且它们是相同的。
答案 0 :(得分:1)
http://docs.marklogic.com/cts:search使用cts:item
而不是XML元素。如果xdmp:get-request-field('query')
需要返回序列化的cts:query XML,请尝试以下操作:
`cts:query(xdmp:unquote(xdmp:get-request-field('query'))/*)`
/*
步骤是必要的,因为xdmp:unquote
会返回文档节点。
答案 1 :(得分:0)
取消引用XML字符串将返回XML文档,而不是cts:query。在这种情况下,您可能希望得到类型冲突,但我认为cts:search也可以接受字符串作为查询,在这种情况下,字符串被解释为cts:word-query。所以我认为正在发生的事情是XML文档的字符串值(“date 2013-11-18”,模数空格)被解释为单词查询,而不是匹配任何内容。
要做你想做的事情,我想你可能需要使用xdmp:eval() - 而不是unquote。但是我不建议允许将可执行代码作为查询参数传入。这只是为了滥用而哭泣。
答案 2 :(得分:0)
Mike说的主要原因是xdmp:unquote不会给我一个cts:query。
需要实际使用cts:查询自身将元素转换为cts:query 所以
之后let $query:=xdmp:unquote(xdmp:get-request-field('query'))
let $cts_query:=cts:query($query)
let $results:=cts:search(/,$cts_query/*)
你可以在搜索开发者指南下找到,功能构建一个cts:query from XML