Xquery 分解序列

Xquery 分解序列,xquery,Xquery,作为数据库课程的一部分,我刚刚开始学习xQuery。对于本课程,我们使用的是mondial数据库,可在此处找到()。数据库基本上包含世界、国家、湖泊、河流等信息 我们的一项任务是把所有湖泊中有一个岛屿的区域,然后按大陆将其分组。到目前为止,我已经做到了: let $lakes := for $lakeList in doc("mondial.xml")/mondial/lake[@island] for $country in doc("mondial.xml")/mond

作为数据库课程的一部分,我刚刚开始学习xQuery。对于本课程,我们使用的是mondial数据库,可在此处找到()。数据库基本上包含世界、国家、湖泊、河流等信息

我们的一项任务是把所有湖泊中有一个岛屿的区域,然后按大陆将其分组。到目前为止,我已经做到了:

let $lakes := 
    for $lakeList in doc("mondial.xml")/mondial/lake[@island]
      for $country in doc("mondial.xml")/mondial/country

      where $lakeList/located/@country = $country/@car_code

  return <lake area = "{$lakeList/area}" country = "{$country/name}" continent = "{$country/encompassed/@continent}" continentPerc = "{$country/encompassed/@percentage}"></lake> 

return ($lakes)
let$lakes:=
在doc(“mondial.xml”)/mondial/lake[@island]
对于文档中的$country(“mondial.xml”)/mondial/country
其中$lakeList/located/@country=$country/@car\U代码
返回
回报(美元)
此查询将生成以下结果:

<lake area="40.2" country="Denmark" continent="europe" continentPerc="100"/>
<lake area="56" country="United Kingdom" continent="europe" continentPerc="100"/>
<lake area="71" country="United Kingdom" continent="europe" continentPerc="100"/>
<lake area="10" country="Russia" continent="europe asia" continentPerc="25 75"/>
<lake area="670" country="Japan" continent="asia" continentPerc="100"/>
<lake area="1.8" country="Philippines" continent="asia" continentPerc="100"/>
<lake area="234.2" country="Philippines" continent="asia" continentPerc="100"/>
<lake area="0.3" country="Philippines" continent="asia" continentPerc="100"/>
<lake area="911" country="Philippines" continent="asia" continentPerc="100"/>
<lake area="354.6" country="Philippines" continent="asia" continentPerc="100"/>
<lake area="1103" country="Indonesia" continent="asia australia" continentPerc="78 22"/>
<lake area="0.04" country="Indonesia" continent="asia australia" continentPerc="78 22"/>
<lake area="11.3" country="Indonesia" continent="asia australia" continentPerc="78 22"/>
<lake area="537.5" country="Canada" continent="america" continentPerc="100"/>
<lake area="5542" country="Canada" continent="america" continentPerc="100"/>
<lake area="104" country="Canada" continent="america" continentPerc="100"/>
<lake area="38.7" country="Canada" continent="america" continentPerc="100"/>

现在求和的问题似乎是某些属性包含多个值。因此,不可能按大陆分组。因此,我想将具有多个大陆和大陆PERC的序列分割开来,以便该区域与相应的大陆相一致

我的意思示例:

<lake area="1103" country="Indonesia" continent="asia australia" continentPerc="78 22"/>

应该成为

<lake area="1103" country="Indonesia" continent="asia" continentPerc="78"/>

<lake area="1103" country="Indonesia" continent="australia" continentPerc="22"/>

这能以某种方式实现吗?或者我应该选择另一种策略吗


我非常感谢能得到的任何帮助和指点,因为我在Xquery方面非常糟糕。提前感谢。

我不熟悉该数据库结构,我也不确定我是否理解了这个问题(仍在怀疑一个湖泊是否可以属于亚洲和澳大利亚),但如果您直接提取大陆并在大陆上分组元组流,如

let $countries := doc('mondial.xml')/mondial/country
for $lake in doc("mondial.xml")/mondial/lake[@island]
for $continent in $countries[@car_code = tokenize($lake/@country, '\s+')]/encompassed/@continent
group by $continent
order by $continent
return <continent name="{$continent}">{$lake/<lake name="{@id}" area="{area}"/>}</continent>
let$countries:=doc('mondial.xml')/mondial/country
对于doc中的$lake(“mondial.xml”)/mondial/lake[@island]
对于$countries中的$constance[@car_code=tokenize($lake/@country,“\s+”)]/包含的/@constance
按$大陆分组
按$大陆订购
返回{$lake/}
然后你得到

<continent name="america">
   <lake name="lake-Hazen" area="537.5"/>
   <lake name="lake-Nettilling" area="5542"/>
   <lake name="lake-Lake_Manitou" area="104"/>
   <lake name="lake-Mindemoya" area="38.7"/>
</continent>
<continent name="asia">
   <lake name="lake-KoltsevoyeLake" area="10"/>
   <lake name="lake-Biwa" area="670"/>
   <lake name="lake-Pinatubo" area="1.8"/>
   <lake name="lake-Taal" area="234.2"/>
   <lake name="lake-TaalCrater" area="0.3"/>
   <lake name="lake-LagunaDeBay" area="911"/>
   <lake name="lake-Lanao" area="354.6"/>
   <lake name="lake-Toba" area="1103"/>
   <lake name="lake-DanauKumbang" area="0.04"/>
   <lake name="lake-SegaraAnak" area="11.3"/>
</continent>
<continent name="australia">
   <lake name="lake-Toba" area="1103"/>
   <lake name="lake-DanauKumbang" area="0.04"/>
   <lake name="lake-SegaraAnak" area="11.3"/>
   <lake name="lake-LakeTaupo" area="622"/>
   <lake name="lake-Wanaka" area="192"/>
</continent>
<continent name="europe">
   <lake name="lake-Arresoe" area="40.2"/>
   <lake name="lake-LoughNeagh" area="392"/>
   <lake name="lake-LochNess" area="56"/>
   <lake name="lake-LochLomond" area="71"/>
   <lake name="lake-KoltsevoyeLake" area="10"/>
</continent>

尝试将我得出的国家和百分比数据合并起来

let $countries := doc('mondial.xml')/mondial/country
for $lake in doc("mondial.xml")/mondial/lake[@island]
for $lake-country in $countries[@car_code = $lake/located/@country]
for $continent in $lake-country/encompassed
group by $continent-name := $continent/@continent
order by $continent-name
return 
  <continent name="{$continent-name}">{
     $lake!<lake name="{@id}"
                        area="{area}"
                        country="{let $l := . return $countries[@car_code = $l/located/@country and encompassed[@continent = $continent-name]]/name}"
                        percentage="{let $l := . return $countries[@car_code = $l/located/@country]/encompassed[@continent = $continent-name]/@percentage}"/>
    }</continent>
let$countries:=doc('mondial.xml')/mondial/country
对于doc中的$lake(“mondial.xml”)/mondial/lake[@island]
对于$countries中的$lake country[@car_code=$lake/located/@country]
对于$lake country/包含的$COUNTRINE
按$大陆名称分组:=$大陆/@大陆
按$大陆名称订购
返回
{
$lake!
}

我希望有更优雅、简洁的方式来表达这一点,但它似乎起到了作用。

是的!这正是我想要做的,但我也希望得到我以前拥有的百分比,即湖泊在大陆上的比例(作为湖泊的一个属性)。非常感谢。@Augman,我已经用一些公认的有点复杂的方法扩展了答案,以整合国家和百分比数据(尽管我认为这些数据与国家表面与大陆相关,而不是与湖泊相关),希望其他人能想出更紧凑的方法。是的!这正是我想做的,非常感谢你的帮助!关于国家的百分比,你是对的。我以前做过这个作业,但用的是SQL。作业要求我们计算多个大陆上的湖泊对两个大陆的贡献。由于lake节点中没有此类值,因此我们必须使用该国的大陆数据。这是错误的,但至少可以合理化一些。我不明白,第九排的感叹号。在xquery上下文中,这意味着什么?(因为我们已经有了“not”操作符)
A!xquery3.0中的B
大致相当于返回$x中$x的
。它与“/”相同,但没有排序到文档顺序的复杂性,也没有结果必须是同质的限制。这里只是为了方便设置上下文项,以避免在RHS上重复使用
$lake/