XML-запрос, порядок возникновения ошибки Ожидается элемент, последовательность найдена в BaseX

Я использую базу данных mondial, которая доступна как в формате SQL, так и в виде XML, но меня интересует следующий вопрос:

<mondial>
  <country car_code="S" area="449964" capital="cty-Sweden-Stockholm" 
           memberships="org-AfDB org-AG org-AsDB org-BIS org-CE
                        org-CBSS org-CCC org-ECE org-EBRD org-EIB 
                        org-CERN org-ESA org-EU org-FAO org-G-6 org-G-9 
                        org-G-10 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-EN org-NSG  
                        org-OECD org-OSCE org-PFP org-PCA org-UN  
                        org-UNAVEM-III org-UNCRO org-UNESCO org-UNIDO  
                        org-UNITAR org-UNIKOM org-UNMOGIP org-UNOMIG  
                        org-UNHCR org-UNPREDEP org-UNPROFOR org-UNTSO  
                        org-UPU org-WEU org-WFTU org-WHO org-WIPO  
                        org-WMO org-WTrO org-ZC">
    <name>Sweden</name>
    <population>8900954</population>
    <population_growth>0.56</population_growth>
    <infant_mortality>4.5</infant_mortality>
    <gdp_total>177300</gdp_total>
    <gdp_agri>2</gdp_agri>
    <gdp_ind>27</gdp_ind>
    <gdp_serv>71</gdp_serv>
    <inflation>2.6</inflation>
    <government>constitutional monarchy</government>
    <encompassed continent="europe" percentage="100"/>
    <ethnicgroup percentage="83">Swede</ethnicgroup>
    <ethnicgroup percentage="5">Finn</ethnicgroup>
    <religion percentage="87">Protestant</religion>
    <religion percentage="1.5">Roman Catholic</religion>
    <language percentage="96">Swedish</language>
    <language percentage="2.6">Finnish</language>
    <border country="SF" length="586"/>
    <border country="N" length="1619"/>
    <name>Sweden</name>
    <population>8900954</population>
    <population_growth>0.56</population_growth>
    <infant_mortality>4.5</infant_mortality>
    <gdp_total>177300</gdp_total>
    <gdp_agri>2</gdp_agri>
    <gdp_ind>27</gdp_ind>
    <gdp_serv>71</gdp_serv>
    <inflation>2.6</inflation>
    <government>constitutional monarchy</government>
    <encompassed continent="europe" percentage="100"/>
    <ethnicgroup percentage="83">Swede</ethnicgroup>
    <ethnicgroup percentage="5">Finn</ethnicgroup>
    <religion percentage="87">Protestant</religion>
    <religion percentage="1.5">Roman Catholic</religion>
    <language percentage="96">Swedish</language>
    <language percentage="2.6">Finnish</language>
    <border country="SF" length="586"/>
    <border country="N" length="1619"/>
    <province id="prov-Sweden-5" capital="cty-Sweden-3" country="S">
      <name>Vastra Gotaland</name>
      <area>24473</area>
      <population>1464971</population>
      <city id="cty-Sweden-3" is_state_cap="yes" country="S" 
            province="prov-Sweden-5">
        <name>Goteborg</name>
        <longitude>12</longitude>
        <latitude>57.4</latitude>
        <population year="95">449189</population>
        <located_at watertype="sea" sea="sea-Kattegat"/>
        <located_at watertype="river" river="river-Goetaaelv"/>
      </city>
      <city id="cty-Sweden-Vanersborg" country="S" 
            province="prov-Sweden-5">
        <name>Vanersborg</name>
        <longitude>12.2</longitude>
        <latitude>58.2</latitude>
        <population year="87">35804</population>
        <located_at watertype="river" river="river-Goetaaelv"/>
        <located_at watertype="lake" lake="lake-Vaenersee"/>
      </city>
      <city id="cty-Sweden-Mariestad" country="S" 
            province="prov-Sweden-5">
        <name>Mariestad</name>
        <longitude>13.5</longitude>
        <latitude>58.4</latitude>
        <population year="87">24255</population>
        <located_at watertype="lake" lake="lake-Vaenersee"/>
      </city>
    </province>
    <province id="prov-Sweden-3" capital="cty-Sweden-Karlskrona" country="S">
      <name>Blekinge</name>
      <area>2941</area>
      <population>151168</population>
      <city id="cty-Sweden-Karlskrona" is_state_cap="yes" country="S" 
            province="prov-Sweden-3">
        <name>Karlskrona</name>
        <longitude>15.3</longitude>
        <latitude>56.1</latitude>
        <population year="87">59007</population>
        <located_at watertype="sea" sea="sea-Ostsee"/>
      </city>
    </province>
  </country>
</mondial>

Дело в том, что я хочу написать запрос на следующий вопрос: Показать названия, население и столицы провинций (лен) Швеции в порядке численности населения в первую очередь.

Итак, что я сделал до сих пор, так это то, что я написал в XQuery следующее:

let $mondial := db:open('mondial')
for $x in $mondial/mondial/country[name="Sweden"]
let $pop := $x/province/population
return $pop/string()

это дает мне все провинции с населением Швеции, которые работают нормально, затем я добавил в запрос следующее:

let $mondial := db:open('mondial')
for $x in $mondial/mondial/country[name="Sweden"]
let $pop := $x/province/population
let $cname := $x/province/name
let $cap := $x/province/city[@is_state_cap="yes"]/name
return ($cname/string(), $pop/string(), $cap/string())

который также отлично работает и дает мне название провинции, населения и столицы, но когда я затем пытаюсь добавить порядок по населению следующим образом:

let $mondial := db:open('mondial')
for $x in $mondial/mondial/country[name="Sweden"]
let $pop := $x/province/population
let $cname := $x/province/name
let $cap := $x/province/city[@is_state_cap="yes"]/name
order by $pop 
return ($cname/string(), $pop/string(), $cap/string())

BaseX выдает ошибку

Ожидаемый элемент, найдена последовательность: (совокупность элементов {....}, ...)

и я не могу понять почему. Я также попытался добавить /string() после порядка by и попытался добавить по убыванию, но пока безуспешно.


person Dreamus    schedule 22.03.2015    source источник


Ответы (1)


order by требует одного элемента на итерацию цикла. Поскольку вы перебираете все страны, а не провинции Швеции, вместо этого вы получаете последовательность населения для каждой шведской провинции.

Вместо этого пройдите по провинциям. В следующем коде я изменил две вещи:

  • Цикл по провинциям вместо стран, таким образом, также скорректирован выбор подэлементов (удален шаг оси /province)
  • Изменены на разумные имена переменных. $x - одно из наихудших возможных имен переменных для провинции. Вы могли бы даже осознать проблему самостоятельно, если бы использовали озвучивание имен переменных, поскольку первая строка указывала бы присвоение стран провинциям.
let $mondial := db:open('mondial')
for $province in $mondial/mondial/country[name="Sweden"]/province
let $population := $province/population
let $name := $province/name
let $capital := $province/city[@is_state_cap="yes"]/name
order by $population
return ($name/string(), $population/string(), $capital/string())
person Jens Erat    schedule 22.03.2015