假设我有一个元素
我可以这样做:
但是有没有一种通过递归完成而不是下降和解析,而是上升和构建的方法呢?
<x>x</x>
和一些空元素(<a/>, <b/>, <c/>)
,我想将第一个元素包裹在第二个元素中,依次进行,结果为<c><b><a><x>x</x></a></b></c>
。当我不知道空元素的数量时,我该如何做呢?我可以这样做:
xquery version "3.0";
declare function local:wrap-up($inner-element as element(), $outer-elements as element()+) as element()+ {
if (count($outer-elements) eq 3)
then element{node-name($outer-elements[3])}{element{node-name($outer-elements[2])}{element{node-name($outer-elements[1])}{$inner-element}}}
else
if (count($outer-elements) eq 2)
then element{node-name($outer-elements[2])}{element{node-name($outer-elements[1])}{$inner-element}}
else
if (count($outer-elements) eq 1)
then element{node-name($outer-elements[1])}{$inner-element}
else ($outer-elements, $inner-element)
};
let $inner-element := <x>x</x>
let $outer-elements := (<a/>, <b/>, <c/>)
return
local:wrap-up($inner-element, $outer-elements)
但是有没有一种通过递归完成而不是下降和解析,而是上升和构建的方法呢?
for
表达式的情况下进行迭代,因为tail()
返回移动head()
之前的所有内容。很酷。我会看看自己是否足够理解并使用它.... - Jens Østergaard Petersentail($item)
和head($item)
只是$item[1]
和$item[position() > 1]
的语法糖。但它们产生的代码更易于阅读和理解,特别是对具有强大函数式背景的开发人员来说。 - Jens Erat