我有一个XML文档:
<resultsets>
<row>
<emp_no>10001</emp_no>
<first_name>Georgi</first_name>
<last_name>Facello</last_name>
</row>
<row>
<emp_no>10002</emp_no>
<first_name>Bezalel</first_name>
<last_name>Simmel</last_name>
</row>
<row>
<emp_no>10003</emp_no>
<first_name>Parto</first_name>
<last_name>Bamford</last_name>
</row>
</resultsets>
目前,我的代码如下:
let $first := doc("db/apps/flowq/index/employees.xml")//first_name
let $last := doc("db/apps/flowq/index/employees.xml")//last_name
我的问题是,是否可以仅使用$first
和$last
来生成以下结果?
<row>
<first_name>Georgi</first_name>
<last_name>Facello</last_name>
</row>
<row>
<first_name>Bezalel</first_name>
<last_name>Simmel</last_name>
</row>
<row>
<first_name>Parto</first_name>
<last_name>Bamford</last_name>
</row>
基本上,如果我们有两个相同大小的节点列表,我们如何逐个合并它们?我试过了
($first_name, $last_name)
和($first_name union $last_name)
但不起作用,
谢谢!
答案 0 :(得分:3)
当然对于FP afficionados,有基本的递归函数:
declare function local:merge($s1, $s2) {
if ($s1 and $s2)
then (<row>{head($s1), head($s2)}</row>,
local:merge(tail($s1), tail($s2)))
else ()
}
答案 1 :(得分:1)
首先从同一文档中提取两个不同的序列有点奇怪,但一般来说,如果你想要进行位置合并,那么使用for $item at $pos
会有所帮助:
let $first := (
<first_name>Georgi</first_name>,
<first_name>Bezalel</first_name>,
<first_name>Parto</first_name>),
$second := (
<last_name>Facello</last_name>,
<last_name>Simmel</last_name>,
<last_name>Bamford</last_name>
)
return for $name at $pos in $first
return
<row>
{$name, $second[$pos]}
</row>
http://xqueryfiddle.liberty-development.net/eiQZDbb
或使用高阶for-each-pair
:
let $first := (
<first_name>Georgi</first_name>,
<first_name>Bezalel</first_name>,
<first_name>Parto</first_name>),
$second := (
<last_name>Facello</last_name>,
<last_name>Simmel</last_name>,
<last_name>Bamford</last_name>
)
return for-each-pair($first, $second, function($f, $s) { <row>{$f, $s}</row>})