2012-07-29 86 views
2

如何控制從for $x in (...)選擇的順序?在下面的XQuery的最後一行中,我想要的結果是按照$retmax,$retmin的順序排列,但是它以相反的順序出現。從序列控制選擇順序

<result> 
{ 
    let $max := max(doc("countries.xml")//country/(@population div @area)) 
    let $min := min(doc("countries.xml")//country/(@population div @area)) 
    for $country in doc("countries.xml")//country 
    let $density := $country/(@population div @area) 
    let $ret_min := if ($density = $min) 
        then <lowest density="{$density}">{data($country/@name)}</lowest> 
        else() 
    let $ret_max := if ($density = $max) 
        then <highest density="{$density}">{data($country/@name)}</highest> 
        else() 
    for $r in ($ret_max, $ret_min) return $r 
} 
</result> 

生產:

<result> 
    <lowest density="0.026752619966905682">Greenland</lowest> 
    <highest density="31052.3125">Macau</highest> 
    </result> 

,但我想:

<result> 
    <highest density="31052.3125">Macau</highest> 
    <lowest density="0.026752619966905682">Greenland</lowest> 
    </result> 
+0

這種複雜的代碼,必然有一個邏輯錯誤 - 它不在'$ r中($ ret_max,$ ret_min)返回$ r',順便說一句,寫的只是'($ ret_max,$ ret_min)'的不自然的方式 - 問題出現在複雜的環境表達中。因此,這個問題的標題是不恰當的 - 一個更好的標題將是:「請在我的邏輯中找到錯誤」 - 這不符合與XQuery相關的問題。 – 2012-07-29 14:44:01

+0

我試圖'返回($ ret_max,$ ret_min)',但它不起作用。 – 2012-07-29 19:02:55

+0

Rose Perrone,試試這個查詢:'for $ r in(7,2)return $ r'結果是'7 2'。嘗試相同的方法,但用'7'和'2'替換爲節點值 - 同樣,結果是節點按它們在表達式中出現的順序排列。這不是令人驚訝的,它來自Xpath數據模型中序列的定義。這意味着,在你的問題表達式中提供的,在$($ ret_max,$ ret_min)'中圍繞$ r的子表達式的邏輯存在一些問題。 – 2012-07-29 19:55:41

回答

1

這是我怎麼會寫......

let $ordered_countries := for $country in doc("countries.xml")//country 
          let $density := $country/(@population div @area) 
          order by $density 
          return $country 
let $low := $ordered_countries[1] 
let $high := $ordered_countries[fn:last()] 
return (
    <lowest density="{$low/(@population div @area)}">{data($low/@name)}</lowest>, 
    <highest density="{$high/(@population div @area)}">{data($high/@name)}</highest> 
)