Reputation: 87
I need to return the top 5 <Concelho>
elements with the most <Habitante>
grandchildren from Ano
= 2001, but I'm having problems.
My code:
for $x in doc("Camaras.xml")/Portugal/Concelho
order by xs:integer($x/Habitantes/Habitante[@Ano = "2001"]) descending
return data($x[position() <= 5])
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE Portugal SYSTEM "CamarasDTD.dtd"> <Portugal>
<Concelho Nome="Arganil " id="0">
<Contactos>
<Email>[email protected]</Email>
<Telefone> +351 235 200 150</Telefone>
<Fax> +351 235 200 158</Fax>
</Contactos>
<Localização>
<Codigo-Postal>3304-954 Arganil</Codigo-Postal>
</Localização>
<Mapa src="http://cim-regiaodecoimbra.pt/wp-content/uploads/2014/04/3D_arganil.png" />
<Habitantes>
<Habitante Ano="2001">2001</Habitante>
<Habitante Ano="2011">12145</Habitante>
</Habitantes>
</Concelho>
<Concelho Nome="Cantanhede " id="1">
<Contactos>
<Email>[email protected]</Email>
<Telefone> +351 231 410 100</Telefone>
<Fax> +351 231 410 199</Fax>
</Contactos>
<Localização>
<Codigo-Postal>3060-133 Cantanhede</Codigo-Postal>
</Localização>
<Mapa src="http://cim-regiaodecoimbra.pt/wp-content/uploads/2014/04/3D_cantanhede1.png" />
<Habitantes>
<Habitante Ano="2001">37910</Habitante>
<Habitante Ano="2011">36595</Habitante>
</Habitantes>
</Concelho>
<Concelho Nome="Coimbra " id="2">
<Contactos>
<Email>[email protected]</Email>
<Telefone> +351 239 857 500</Telefone>
<Fax> +351 239 820 114</Fax>
</Contactos>
<Localização></Portugal>
The ordering is working correctly, but it's retuning all <Concelho>
elements.
Upvotes: 1
Views: 40
Reputation: 13142
You need to do the sort, then filter:
let $foo :=
for $x in doc("Camaras.xml")/Portugal/Concelho
order by xs:integer($x/Habitantes/Habitante[@Ano = "2001"]) descending
return $x
return $foo[ position() <= 5 ]
Upvotes: 1