Страны, частью которых является остров, находятся в /mondial/island/@country
, а не в /mondial/island/located/@country
. Смотрите, например, запись для Ирландия :
<island id="island-Ireland" country="IRL GB" sea="sea-Irische_See sea-Atlantic">
<name>Ireland</name>
<islands>British Isles</islands>
<located country="GB" province="prov-gb-12"/>
<area>84421</area>
<latitude>53.5</latitude>
<longitude>-7.8</longitude>
<elevation>1041</elevation>
</island>
И Ирландия, и страна, и Великобритания (т. Е. Северная Ирландия) находятся на острове Ирландия, поэтому в /mondial/island[name = 'Ireland']/@country
.
есть две разделенные пробелами записи.
Вы можете использовать fn:tokenize($string[, $separator])
, чтобы получить все отдельные страны и (для производительности) получить все уникальные островные страны с fn:distinct-values($sequence)
. Остальные могут остаться прежними:
let $doc := doc("mondial.xml")
let $islands := distinct-values($doc/mondial/island/@country/tokenize(.))
for $country in $doc/mondial/country
let $c_code := $country/data(@car_code)
let $c_name := data($country/name)
where not($c_code=$islands)
order by $c_name
return $c_name
Теперь возвращается 120 стран, как и ожидалось.