Xquery 如何基于MarkLogic中的一组带引号的字符串动态创建搜索查询

Xquery 如何基于MarkLogic中的一组带引号的字符串动态创建搜索查询,xquery,marklogic,Xquery,Marklogic,我有以下查询,其中我想从列表中形成一个值字符串,我想使用逗号分隔的字符串作为or查询,但它不给出任何结果,但是当我只返回连接的字符串时,它给出了查询所需的确切值 查询如下: xquery version "1.0-ml"; declare namespace html = "http://www.w3.org/1999/xhtml"; declare variable $docURI as xs:string external ; declare variable $orQuery

我有以下查询,其中我想从列表中形成一个值字符串,我想使用逗号分隔的字符串作为or查询,但它不给出任何结果,但是当我只返回连接的字符串时,它给出了查询所需的确切值

查询如下:

 xquery version "1.0-ml";
 declare namespace html = "http://www.w3.org/1999/xhtml";


 declare variable $docURI as xs:string external ;
 declare variable $orQuery as xs:string external ;

 let $tags :=
 <tags>
  <tag>"credit"</tag>
  <tag>"bank"</tag>
  <tag>"private banking"</tag>
 </tags>


 let $docURI := "/2012-10-22_CSGN.VX_(Citi)_Credit_Suisse_(CSGN.VX)__Model_Update.61198869.xml"
 let $orQuery :=  (string-join($tags/tag, ','))


 for $x in cts:search(doc($docURI)/doc/Content/Section/Paragraph, cts:or-query(($orQuery)))


 let $r := cts:highlight($x, cts:or-query($orQuery), <b>{$cts:text}</b>)

 return <result>{$r}</result>
当我这么做的时候

 return (string-join($tags/tag, ','))
这正是我所需要的

 "credit","bank","private banking"

但是为什么它不返回任何结果或查询?

字符串联接步骤不需要是字符串联接。以文本字符串形式传递的。在xQuery中,序列是您的朋友

我想你想做这样的事情:

let $tags-to-search :=  ($tags/tag/text()!replace(., '^"|"$', '') ) (: a sequence of tags :)
cts:search(doc($docURI)/doc/Content/Section/Paragraph, cts:word-query($tags-to-search))
cts:word查询是默认查询,如果传入字符串,则用于搜索的参数2。cts:word查询还返回序列中任何项的匹配项(如果与该项一起出现)


编辑:按照Abel的建议为引号添加了替换步骤。这是针对原始问题提供的数据。整体方法保持不变。

也许你需要这样的东西吗
让$orQuery:=for$tags in$tags/tag返回cts:word query($tag)

我使用了fn:tokenize,它非常适合我的用例 这是因为我试图使用XCC api从java传递这些参数,它不会返回任何字符串值

  xquery version "1.0-ml";
  declare namespace html = "http://www.w3.org/1999/xhtml";

  declare variable $docURI as xs:string external ;
  declare variable $orQuery as xs:string external ;

  let $input := "credit,bank"
  let $tokens := fn:tokenize($input, ",") 

  let $docURI := "2012-11-19 0005.HK (Citi) HSBC Holdings Plc (0005.HK)_ Model Update.61503613.pdf"

  for $x in cts:search(fn:doc($docURI), cts:or-query(($tokens)))

  let $r := cts:highlight($x, cts:or-query(($tokens)), <b>{$cts:text}</b>)

  return <result>{$r}</result>
xquery版本“1.0-ml”;
声明命名空间html=”http://www.w3.org/1999/xhtml";
将变量$docURI声明为xs:string external;
将变量$orQuery声明为xs:string external;
let$input:=“信贷,银行”
让$tokens:=fn:tokenize($input,,“”)
let$docURI:=“2012-11-19 0005.HK(花旗)汇丰控股有限公司(0005.HK)uu模型更新。61503613.pdf”
对于cts:search(fn:doc($docURI)、cts:or query($tokens))中的$x
让$r:=cts:highlight($x,cts:or查询($tokens)),{$cts:text})
返回{$r}

需要一组子查询,您给它一个逗号分隔的带引号字符串,这与查询不同。我认为这很接近,但仍然不起作用,因为OP在输入文档中引用了单词。考虑添加<代码> $标签进行搜索!替换(,“^”|“$,”)。有些包含空格(可能)并不重要,因为它仍然是一个字符串序列。
  xquery version "1.0-ml";
  declare namespace html = "http://www.w3.org/1999/xhtml";

  declare variable $docURI as xs:string external ;
  declare variable $orQuery as xs:string external ;

  let $input := "credit,bank"
  let $tokens := fn:tokenize($input, ",") 

  let $docURI := "2012-11-19 0005.HK (Citi) HSBC Holdings Plc (0005.HK)_ Model Update.61503613.pdf"

  for $x in cts:search(fn:doc($docURI), cts:or-query(($tokens)))

  let $r := cts:highlight($x, cts:or-query(($tokens)), <b>{$cts:text}</b>)

  return <result>{$r}</result>