多个contains()基于标记化字符串

时间:2017-05-04 09:46:22

标签: xpath xquery contains tokenize concat

我希望匹配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()更好?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你的方法根本不是一个好主意。你可以这样做,但我强烈建议你不这样做。您要做的是构造一个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()