【问题标题】:how to build string iteratively in xquery如何在 xquery 中迭代地构建字符串
【发布时间】:2011-08-30 08:40:17
【问题描述】:

我需要和java代码一样的xquery结构

   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) 不起作用。那么执行此操作的正确语法是什么?提前致谢

【问题讨论】:

    标签: xquery


    【解决方案1】:

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

    这些东西一开始很难获得,但最终会带来巨大的好处(生产力、稳健性、性能)。

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

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

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

    【讨论】:

      【解决方案2】:

      $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, "/"))
      

      【讨论】:

        猜你喜欢
        • 2021-10-31
        • 1970-01-01
        • 2012-03-06
        • 2019-07-15
        • 1970-01-01
        • 1970-01-01
        • 2021-04-03
        • 2010-09-10
        • 1970-01-01
        相关资源
        最近更新 更多