let $max := max(//country/population) let $c := //country[population = $max] return {$c/name} {$c/population} for $o in //organization let $sum := sum($o/members/id(@country)/population[1]) order by $sum descending return 3) let $seq := ( let $l := number(//city[name='Dakar']/longitude) for $c in //city[longitude<$l] order by number($c/longitude) descending return $c ) return $seq[1] let $l := number(//city[name='Dakar']/longitude) let $max := max(//city[longitude<$l]/longitude) return //city[longitude = $max]/name 4) //river[id(@country)/name="Russia" and count(id(@country)) = 2]/name union //lake[id(@country)/name="Russia" and count(id(@country)) = 2]/name union //sea[id(@country)/name="Russia" and count(id(@country)) = 2]/name (//river | //lake | //sea)[id(@country)/name="Russia" and count(id(@country)) = 2]/name for $water in (//river | //lake | //sea) where $water/id(@country)/name="Russia" and count(id($water/@country)) = 2 return $water/name 5) SQL style: for $c1 in //country[encompassed/id(@continent)/name="Europe"], $c2 in //country[encompassed/id(@continent)/name="Europe"] let $seas1 := //sea[id(@country)/name = $c1/name]/name, $seas2 := //sea[id(@country)/name = $c2/name]/name where $c1/name < $c2/name and not (some $s1 in $seas1 satisfies (not($s1 = $seas2))) and not (some $s2 in $seas2 satisfies (not($s2 = $seas1))) return {$seas1} {$seas2} .. towards more XML style: for $c1 in //country[encompassed/id(@continent)/name="Europe"], $c2 in //country[encompassed/id(@continent)/name="Europe"] let $seas1 := {//sea[id(@country)/name = $c1/name]/name}, $seas2 := {//sea[id(@country)/name = $c2/name]/name} where $c1/name < $c2/name and $seas2 = $seas1 return {$seas1} {$seas2} ... use deep equality: for $c1 in //country[encompassed/id(@continent)/name="Europe"], $c2 in //country[encompassed/id(@continent)/name="Europe"] let $seas1 := {//sea[id(@country)/name = $c1/name]/name}, $seas2 := {//sea[id(@country)/name = $c2/name]/name} where $c1/name < $c2/name and deep-equal($seas2,$seas1) return {$seas1} {$seas2} note: deep-equal is not broken down to element-wise application for $c1 in //country[encompassed/id(@continent)/name="Europe"], $c2 in //country[encompassed/id(@continent)/name="Europe"] let $seas1 := //sea[id(@country)/name = $c1/name]/name, $seas2 := //sea[id(@country)/name = $c2/name]/name where $c1/name < $c2/name and deep-equal($seas2,$seas1) return {$seas1} {$seas2} 6) sum(//sea[contains(name,'Caribbean')]/id(@country)/@area) 7) basis: (some europ country) //organization[members/id(@country)/encompassed/id(@continent)/name="Europe"] no europ members: //organization[not(members/id(@country)/encompassed/id(@continent)/name="Europe")] only europ. members: for $o in //organization where every $c in $o/members/id(@country) satisfies $c/encompassed/id(@continent)/name="Europe" return $o all europs are members: for $o in //organization where every $c in //country[encompassed/id(@continent)/name="Europe" and count(id(@memberships)) > 1] satisfies $c = $o/members/id(@country) return $o 8) for $c in //country return {$c/name} {sum($c/border/id(@country)/population[1])} 9) for $c in //country[count(.//city) >= 3] let $bigc := (for $city in $c//city order by number($city/population[1]) descending return $city) let $bigc3 := $bigc[position()<4] return {$c/name} {sum($bigc3/population[1])} 10) for $c in //country let $avg := avg($c//city/population[1]) for $x in $c//city[population > $avg] return $x