J.Fernandes
J.Fernandes

Reputation: 87

How to return elements with positions < 5

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

Answers (1)

JonSG
JonSG

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

Related Questions