Marklogic使用XML字符串查询

时间:2013-12-09 00:33:38

标签: marklogic

大家好我想尝试使用 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>

我不明白的是,总是没有结果。运用 用

替换 $ query
let $query:=cts:element-value-query(xs:QName("date"),"2013-11-18")

始终有效。

所以我不明白,使用xdmp:unquote转换的自定义xml字符串与cts:element-value-query之间的区别是什么。我已将它们都打印出来并且它们是相同的。

3 个答案:

答案 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