Kurs XML-a, zadanie 15.

Jedna uwaga: kolejności atrybutów się nie zgadzają.

xquery version "1.0";
 
declare function local:distance($from, $to, $doc, $dist) as node() {
    if (exists($from[name = $to/name]) ) then
        <country distance="{$dist}" name="{$to/name/text()}"/>
    else
        if ($dist > count($doc/country)) then
            <country distance="infinity" name="{$to/name/text()}"/>
        else
            let $neighbours :=
                (
                    for $code in $from/border/@country
                    return $doc/country[@car_code = $code]
                )
            return local:distance($from union $neighbours, $to, $doc, $dist + 1)
};
 
let $doc := doc("mondial-europe.xml")/mondial
 
let $top_cities :=
    (
        for $city in $doc//city
        let $population := avg($city/population)
        order by number($population) descending
        return $city
    )
 
let $top30_cities := subsequence($top_cities, 1, 30)
 
return
<results author='Tomasz Maciejewski'>
 
    <result query='1'>
    {
        for $country in $doc/country
        let $name := $country/name/text()
        let $population := $country/population/text()
        let $gdp := $country/gdp_total/text()
        where exists($gdp)
        order by number($gdp) div number($population) descending
        return
        <country>
        <name>{$name}</name>
        <gdp>{$gdp}</gdp>
        <population>{$population}</population>
        </country>
    }
    </result>
 
    <result query='2'>
    {
        let $sea := $doc/sea[name="Mediterranean Sea"]
        for $code in tokenize($sea/@country, " ")
        return
        <country name="{$doc/country[@car_code=$code]/name}"/>
    }
    </result>
 
    <result query='3'>
    {
        for $city in $top30_cities
        let $country := $doc/country[province/city = $city]
        return
        <city>
            <name>{$city/name/text()}</name>
            <population>{xs:integer(avg($city/population))}</population>
            <country>{$country/name/text()}</country>
        </city>
    }        
    </result>
 
    <result query='4'>
    {
        for $country in $doc/country
        let $cities := $country//city intersect $top30_cities 
        where count($cities) gt 0
        order by count($cities) descending
        return
        <country name="{$country/name/text()}">
        {
            for $city in $cities
            return <city>{$city/name/text()}</city>
        }
        </country>
    }
    </result>
 
    <result query='5'>
    {
        for $country in $doc/country
        let $religion := $country/religions[@percentage>50]
        for $code in $country/border/@country
        let $other_country := $doc/country[@car_code=$code]
        let $other_religion := $other_country/religions[@percentage>50]
        where $country/name < $other_country/name
            and $religion ne $other_religion
        return
        <border>
            <country name="{$country/name/text()}" religion="{$religion/text()}"/>
            <country name="{$other_country/name/text()}" religion="{$other_religion/text()}"/>
       </border>
    }
    </result>
 
    <result query='6'>
    {
        for $group in distinct-values($doc//ethnicgroups)
        order by $group
        return
        <ethnicgroup name="{$group}">
        {
            for $country in $doc/country[ethnicgroups = $group]
            let $percentage := $country/ethnicgroups[text() = $group]/@percentage
            order by number($percentage) descending
            return <country name="{$country/name/text()}" percentage="{$percentage}"/>
        }
        </ethnicgroup>
    }
    </result>
 
    <result query='7'>
    {
        let $poland := $doc/country[name = "Poland"]
        for $country in $doc/country
        let $dist := local:distance($poland, $country, $doc, 0)
        where $dist/@distance ne "infinity"
        order by number($dist/@distance)
        return $dist
    }
    </result>
 
</results>
 
kurs_xml/10.zadanie15.txt · ostatnio zmienione: 2010/05/13 08:42 przez d
 
Wszystkie treści w tym wiki, którym nie przyporządkowano licencji, podlegają licencji:MIT License
Recent changes RSS feed