【问题标题】:MarkLogic: convert string to path expression in cts:searchMarkLogic:将字符串转换为 cts:search 中的路径表达式
【发布时间】:2014-01-30 16:52:48
【问题描述】:

如何在 MarkLogic 中创建一个将 XPath 作为字符串并将其传递给 cts:search 函数的函数?

我想做这样的事情:

xquery version "1.0-ml";

declare namespace local = "http://www.local.com/" ;

declare function local:xpath-search($xpath as xs:string, $collection as xs:string, $limit  as xs:string) {
let $valid := cts:valid-index-path($xpath,fn:false())
let $results := cts:search(xdmp:value($xpath), cts:and-query(()) ) [position() < 100]
return 
    if ($valid = false()) then "xpath is invalid"
    else (
        if ($results = '') then "no results were found"
             else $results
        )
    } ;


local:xpath-search('//p', '', '')

但是,我收到“表达式无法搜索”错误。

【问题讨论】:

    标签: xml xpath xquery marklogic


    【解决方案1】:

    使用http://docs.marklogic.com/search:search 并为其提供&lt;searchable-expression&gt; 选项。

    search:search 函数已经实现了你想要的。在后台它调用cts:search 并使用xdmp:value 提供可搜索表达式。你可以这样做,但search:search 已经编写和测试过了。

    顺便说一句,使用带有cts:search 的基于路径的可搜索表达式对于粗心的人来说是一个陷阱。在大多数情况下,最好使用collection() 作为cts:search 的第一个参数,匹配整个数据库。然后使用cts:query 作为第二个参数,以匹配您感兴趣的文档。

    但是//p 呢?重要的是要了解 MarkLogic 索引片段,而不是元素。默认情况下,片段是文档。您可以更改:您甚至可以在//p 级别进行分段。但在大多数情况下,这是一个坏主意。您最好使用cts:search 匹配文档,使用cts:highlight 在段落中查找匹配项。 search:search 函数也支持这一点。

    【讨论】:

      【解决方案2】:

      卡斯卡维尔:

      您可以尝试将整个 cts:search() 表示为字符串(将静态部分与路径连接)并使用 xdmp:value 或 xdmp:eval 调用它。

      希望对您有所帮助,

      埃里克·亨纳姆

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-29
        • 2010-12-12
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-23
        • 1970-01-01
        相关资源
        最近更新 更多