繁体   English   中英

如何在XQUERY 1.0 FLOWR中解决这个自动增量变量的情况?

[英]How can I solve this autoncremental var case in XQUERY 1.0 FLOWR?

伪代码类似于:

 let $myNode as node() := $node 
 for $subpath in tokenize($path,'/')
 $myNode := $myNode/*[name()=$subpath] (: Here is the invalid line :)

我知道在xQuery 3.0中有一个运算符,我要求xQuery 1.0。

没有XQuery 2.0 ,但是你想要做的事情不仅仅是FLWOR表达式,不管版本如何。 必须在迭代之间更新当前节点集,这不是FLWOR表达式的工作方式。

也就是说,使用XQuery 1.0中的递归函数可以轻松实现您想要做的事情:

declare function local:path(
  $context as node()*,
  $steps as xs:string*
) as node()* {
  if(empty($steps)) then $context
  else local:path(
    $context/*[name() = $steps[1]],
    $steps[position() gt 1]
  )
};

您可以使用local:path(document{ <x><y>foo</y><z/></x> }, tokenize("x/y", '/'))来调用它。

XQuery 3.0中,它更容易做到,没有新的顶级功能:

fn:fold-left(
  function($context, $step) {
    $context/*[name() eq $step]
  },
  document{ <x><y>foo</y><z/></x> },
  tokenize('x/y', '/')
)

函数fn:fold-left(..)在内部处理递归,您只需指定如何修改每个步骤中设置的上下文。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM