我想匹配XQuery函数中几个部分术语搜索的结果


“ joh do”匹配“ john doe”
“ do jo”也匹配“ john doe”
等等


使用contains(),只有“ john do”或“ joh”会匹配结果。

$item[contains(., "john do")]


我想这样做

$item[contains(., "joh") and contains(., "do")]


...无论搜索字符串中有多少个字词。

我正在尝试使用tokenize(),然后在其上循环创建所需的内容

let $search := "john do"
let $terms := fn:tokenize($search, '\s')
let $query := string-join(
    (for $t in $terms
     return
       concat('contains(.,"', $t, '")')
     ), ' and '
)
return $query


该循环的结果完全符合我的预期,但是它对XPATH查询没有影响,因为它只是文本(并且显然concat()仅产生文本)

$item[$query]


我错过了什么 ?对于该示例,有没有函数比concat()好?

谢谢你的帮助 !

最佳答案

您的方法根本不是一个好主意。您可以那样做,但是我强烈建议您不要这样做。您试图做的是构造一个XPath / XQuery表达式来对其求值,即创建代码。这通常不是一个好主意。

而是可以在for循环中检查条件,而不是创建此查询。更好的是,XQuery和XPath(但只有XPath 2.0)具有量化的表达式,非常适合您的用例:

for $item in $items
let $search := "john do"
let $terms := fn:tokenize($item, '\s')
where every $term in $terms satisfies contains($search, $term)
return $item


希望这很容易理解,因为它非常接近自然语言:每个术语都必须满足特定条件(在您的情况下为contains()

关于xpath - 基于标记化字符串的多个contains(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43779390/

10-17 03:04