根据它们在Xquery 3.0中的位置,在单独的序列中连接元素

时间:2017-08-06 00:32:32

标签: xquery xquery-3.0

我有2个序列,如下所示:

let $city := ('London', 'Tokyo')
let $country := ('England', 'Japan')
let $region := ('Europe','Asia')

我想做的是操纵2个序列,使其显示为:

<Data>
    <location>
        <city>London</city>
        <country>England</country>
        <region>Europe</region>
    </location>
    <location>
        <city>Tokyo</city>
        <country>Japan</country>
        <region>Asia</region>
    </location>  
</Data>

我的计划是做以下事情:

1)分别为$ city,$ country和$ region序列添加一个计数,如下所示。请注意,我还没有详细说明我是如何做到的,但我相信它应该相当简单。

let $city := ('1London', '2Tokyo')
let $country := ('1England', '2Japan')
let $region := ('1Europe','2Asia')

2)加入序列中每个项目的第一个字符并以某种方式对其进行操作,如下所示。请注意,此代码不起作用,但我相信它可以起作用。

let $city := ('1London', '2Tokyo')
let $country := ('1England', '2Japan')
let $region := ('1Europe','2Asia')

for $locCity in $city, $locCountry in $country, $locRegion in $region
where substring($locCity,1,1) = substring($locCountry ,1,1) and 
substring($locCountry ,1,1) = substring($locRegion ,1,1)

let $location := ($locCity,$locCountry,$region)

return 
$location

然而,这根本不起作用。我不确定如何继续下去。我确信有更好的方法来解决这个问题。也许是&#34;组&#34;方法可能有效。任何帮助将不胜感激。感谢。

干杯 杰

1 个答案:

答案 0 :(得分:2)

使用max()找出哪些序列的项目最多,然后从1迭代到max()并为每个序列构建<location>元素。使用谓词选择按位置从每个序列中选择值:

xquery version "1.0";
let $city := ('London', 'Tokyo')
let $country := ('England', 'Japan')
let $region := ('Europe','Asia')
return
  <Data>
  {
  for $i in 1 to max((count($city), count($country), count($region)))
  return
    <location>
        <city>{ $city[$i] }</city>
        <country>{ $country[$i] }</country>
        <region>{ $region[$i] }</region>
    </location>
  }
  </Data>