如何在xquery中迭代地构建字符串

时间:2011-08-30 08:40:18

标签: xquery

我需要xquery结构,它与java代码相同

   string temp
   for(int i=0,i<string[].length,i++)
   temp=temp+string[i]

例如,在xquery中,我有字符串/ a / b / c我需要像

这样的东西
 let $temp:=""
   for $x in tokenize(string,'/')
   $temp=concat($temp,$x)
   return $temp

并且它应该在每次迭代时返回以下内容

   a
   ab
   abc

但不知何故它接缝这句话$ temp = concat($ temp,$ x)无效。那么这样做的正确语法是什么?提前致谢

2 个答案:

答案 0 :(得分:2)

我认为,你需要获得声明性编程的概念。您试图告诉处理器该做什么(就像您在java中所做的那样)而不是描述整体结果。例如,如果您不使用scripting extension(仅某些处理器支持,例如zorba),则不能像在java中使用它们那样使用赋值。将其视为描述一个结果文档的完整查询。

这个东西在开始时很难获得,但它最终带来了巨大的好处(生产力,稳健性,性能)。

我会将你的命令式伪代码翻译成这个单行代码:

string-join(tokenize("/a/b/c",'/'))

您可以在try.zorba-xquery.com上进行测试。我真的希望这会有所帮助。对不起,如果这不是您要找的答案......

答案 1 :(得分:0)

$ temp = conct($ temp,$ x)不会累积,因为在XQuery中,每次循环都是一个新变量。请尝试以下操作(在MarkLogic中测试但使用所有标准语法):

declare function local:build($prefix, $tokens)
{
  if (fn:exists($tokens)) then
    let $str := fn:concat($prefix, $tokens[1])
    return ( 
      $str,
      local:build($str, fn:subsequence($tokens, 2))
    )
  else ()
};

let $string := "/a/b/c"
return local:build("", fn:tokenize($string, "/"))