伪代码将类似于:

 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(..)在内部负责递归,您只需要指定如何在每个步骤中修改上下文集即可。

关于xml - 如何解决XQUERY 1.0 FLOWR中的这种自动增量var情况?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11816437/

10-13 01:49