XQuery对带有子字符串的字符串

梦想家

这是我正在使用的数据库中的代码示例:

<mondial>
<mountain id="mount-Sajama" country="BOL" type="volcano">
<name>Sajama</name>
<mountains>Andes</mountains>
<located country="BOL" province="prov-BOL-2"/>
<elevation>6542</elevation>
<longitude>-68.9</longitude>
<latitude>-18.1</latitude>
</mountain>
<mountain id="mount-Licancabur" country="BOL RCH" type="volcano">
<name>Licancabur</name>
<mountains>Andes</mountains>
<located country="BOL" province="prov-BOL-3"/>
<located country="RCH" province="prov-Chile-2"/>
<elevation>5920</elevation>
<longitude>-67.9</longitude>
<latitude>-22.8</latitude>
</mountain>
<country car_code="N" area="324220" capital="cty-Norway-Oslo" memberships="org-AfDB org-AsDB org-BIS org-CE org-CBSS org-CCC org-ECE org-EBRD org-EFTA org-CERN org-ESA org-FAO org-IADB org-IAEA org-IBRD org-ICC org-ICAO org-ICFTU org-Interpol org-IDA org-IEA org-IFRCS org-IFC org-IFAD org-ILO org-IMO org-Inmarsat org-IMF org-IOC org-IOM org-ISO org-ICRM org-ITU org-Intelsat org-MTCR org-NAM org-NC org-NIB org-ANC org-NATO org-EN org-NSG org-OECD org-OSCE org-PCA org-UN org-UNAVEM-III org-UNCRO org-UNESCO org-UNIDO org-UNITAR org-UNIFIL org-MINURSO org-UNHCR org-UNPREDEP org-UNPROFOR org-UNTSO org-UPU org-WEU org-WHO org-WIPO org-WMO org-WTrO org-ZC">
<name>Norway</name>
<population>4383807</population>
<population_growth>0.48</population_growth>
<infant_mortality>4.9</infant_mortality>
<gdp_total>106200</gdp_total>
<gdp_agri>2.9</gdp_agri>
<gdp_ind>34.7</gdp_ind>
<gdp_serv>62.4</gdp_serv>
<inflation>2.5</inflation>
<indep_date from="S">1905-10-26</indep_date>
<government>constitutional monarchy</government>
<encompassed continent="europe" percentage="100"/>
<ethnicgroup percentage="82.5">Norwegian</ethnicgroup>
<ethnicgroup percentage="1.5">Sami</ethnicgroup>
<religion percentage="86.7">Protestant</religion>
<religion percentage="1">Roman Catholic</religion>
<religion percentage="1.8">Muslim</religion>
<language percentage="99">Norwegian</language>
<border country="R" length="167"/>
<border country="SF" length="729"/>
<border country="S" length="1619"/>
<province id="lteil-OS-N" capital="cty-Norway-Oslo" country="N">
<name>Oslo</name>
<population>449337</population>
<city id="cty-Norway-Oslo" is_country_cap="yes" is_state_cap="yes" country="N" province="lteil-OS-N">
<name>Oslo</name>
<longitude>10.7333</longitude>
<latitude>59.9333</latitude>
<population year="87">449337</population>
<located_at watertype="sea" sea="sea-Skagerrak"/>
</city>
</province>
<province id="lteil-AK-N" capital="cty-Norway-Oslo" country="N">
<name>Akershus</name>
<population>393217</population>
</province>
</mondial>

您可以在此处找到完整的XML文件:https : //www.kth.se/social/files/54f4817bf27654358032133f/mondial.xml

我遇到了一个问题,因为在我的数据库中存在国家代码(国家(地区)中的car_codes和山区中的国家(地区)),可以在同一国家代码中为一个山区编写多个国家(如您在Mount-Licancabur中看到的示例) 。

所以现在我想为每个大陆选择最高的山峰,所以我编写了以下代码:

let $mondial := db:open('mondial')
for $country in $mondial/mondial/country/encompassed/@continent
for $mountains in $mondial/mondial/mountain
where contains($country/../../@car_code, $mountains/@country)

(: Tokenize ev för att lösa berg i två länder :)
let $elevation := $mountains/elevation
group by $country

return ($country, max($elevation))

这给出了输出:

europe
5642
asia
8167
africa
5895
australia
5775
america
6962

起初这些看似正确,但珠穆朗玛峰应该是亚洲最大的高山,海拔8848米。

所以我想问你,我又如何将其在car_code / country中的两个国家/地区代码与国家/地区代码进行比较?我已经阅读了一些有关标记化的知识,但到目前为止还无法使它工作。

希望外面有人可以帮我,被困了一段时间:)

泰勒重制

通过阅读您的问题并查看xml,您似乎正在尝试解决如下所示的mount元素的问题:

<mountain id="mount-Matterhorn" country="CH I">
 <name>Matterhorn</name>
 <mountains>Alps</mountains>
 <located country="CH" province="prov-Switzerland-24"/>
 <located country="I" province="prov-Italy-9"/>
 <elevation>4478</elevation>
 <longitude>7.56</longitude>
 <latitude>46</latitude>
</mountain>

@country中有多个国家/地区的地方。

您可以通过更改此处的位置来使用令牌化来完成此操作

where $mountains[tokenize(@country, " ") eq $country/../../@car_code]

您在此处所做的操作存在一些性能问题。每个山地元素将被标记为每个国家/地区。这可以写成更好的表现,如果您愿意,我可以和您一起讨论。

更新:

这是另一种方法,可以使您在每个大陆上的海拔最高。使用XML的方式,您必须在山上使用标记化来比较县,但至少这样,它只会对每个大陆的每座山进行处理。

for $continent in fn:distinct-values($mondial/mondial/country/encompassed/@continent)
let $counties := $mondial/mondial/country[encompassed/@continent eq $continent]/@car_code
let $highest :=
(
    for $elevation in $mondial/mondial/mountain[fn:tokenize(@country, " ") = $counties]/elevation/text()
    order by xs:int($elevation) descending
    return $elevation
)[1]
return ($continent, $highest)

输出是

europe
7010
asia
8848
africa
5895
australia
4884
america
6962

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章