【发布时间】:2019-06-03 11:57:25
【问题描述】:
要求:
将cts/search 查询与 XPath 查询相结合。
XPath 是未知的用户输入字符串。
search:resolve 函数采用“一个 cts:query 对象、序列化的 cts:query 或结构化查询 (search:query)”。 (Source)
问题:
是否有将 XPath 转换为 cts 或结构化查询的 api,以便我可以结合 XPath 和其他搜索查询?
不工作的例子:
xquery version "1.0-ml";
let $doc :=
<test>
<name>Mike</name>
<age>20</age>
</test>
return xdmp:document-insert('mike.xml', $doc);
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy";
let $xpath := '/test[name="Mike"]'
let $cts-query := cts:and-query(
xpathToCts($xpath), (: Somehow convert XPath to cts query here :)
cts:element-value-query(xs:QName("age"), "20")
)
return search:resolve($cts-query)
如果目前没有办法将 XPath 字符串转换为search 兼容格式,有没有其他方法可以结合 XPath 和 cts/search 查询?
任何帮助将不胜感激!
更新 1:
我尝试使用建议的searchable-expression 选项,但将它与extract-document-data 结合时遇到了另一个问题:
import module namespace search = "http://marklogic.com/appservices/search"
at "/MarkLogic/appservices/search/search.xqy";
search:resolve(
cts:element-value-query(xs:QName("name"), "Mike"),
<options xmlns="http://marklogic.com/appservices/search">
<searchable-expression>/test[age = 20]</searchable-expression>
<extract-document-data>
<extract-path>/test/name</extract-path>
</extract-document-data>
</options>
)
此查询确实返回以下提取的数据:
<search:extracted-none>
</search:extracted-none>
虽然没有可搜索的表达式,但我得到了预期:
<search:extracted kind="element">
<name>Mike</name>
</search:extracted>
如果我没记错的话,searchable-expression 的行为与cts:search 的第一个参数相同。阅读它说的文档:
例如,如果指定 //p,则 p 匹配搜索的元素 返回条件。
因此,生成的节点仅限于可搜索表达式和下面的所有节点,这不是我想要的。
【问题讨论】:
标签: marklogic