2008-09-17 8 views

Odpowiedz

22

Począwszy XQuery 1.1 za pomocą przełącznika:

http://www.w3.org/TR/xquery-11/#id-switch

switch ($animal) 
    case "Cow" return "Moo" 
    case "Cat" return "Meow" 
    case "Duck" return "Quack" 
    default return "What's that odd noise?" 
3

XQuery nie ma funkcji do włączania elementów innych niż elementy.

Pierwszą rzeczą, którą robisz, jest zamiana łańcucha na element.

let $str := "kitchen" 
let $room := element {$str} {} 

Następnie wystarczy użyć typeswitch zrobić normalny przełącznik:

return typeswitch($room) 
    case element(bathroom) return "loo" 
    case element(kitchen) return "scullery" 
    default return "just a room" 

Należy pamiętać, że może to być tylko MarkLogic rozwiązanie.

+1

Roztwór ten (o) działają w każdym procesorze xquery, ale nie jest tak wyraźny jak proste zagnieżdżone jeśli roztwór. –

+0

Po prostu nienawidzę zagnieżdżonych, jeśli jest. Podoba mi się przykład XQuery 1.1, więc oznaczyłem go jako odpowiedź. – Sixty4Bit

3

Wystarczy użyć serię jeśli wyrażenia:

if ($room eq "bathroom") then "loo" 
else if ($room eq "kitchen") then "scullery" 
else "just a room" 

Korzystanie z typeswitch ukrywa to, co naprawdę robi.

Która z tych metod jest najbardziej wydajna, zależy od procesora XQuery, z którego korzystasz. W idealnym świecie powinno to być tylko kwestią gustu, ponieważ optymalizator powinien wybrać odpowiednią metodę, ale jeśli wydajność jest ważna, warto przetestować obie wersje. Byłbym bardzo zaskoczony, gdyby procesor zoptymalizował budowę węzła z twojego przykładu i nie zoptymalizował mojego przykładu do wyspecjalizowanego przełącznika.

+0

Czasami jest miło i elegancko ukryć to, co naprawdę robisz, jeśli nie zapominasz, że robisz to ... – Ar3s

+0

Głosowałem za tym, ponieważ pytanie próbuje znaleźć składnię przełącznika/case nie, jeśli/else. – Sixty4Bit

+0

@ Sixty4Bit - Kiedy odpowiadałem na pytanie, zachowanie przełącznika nie zostało sfinalizowane, dlatego w lutym opublikowałem drugą odpowiedź! –

2

Jeśli procesor obsługuje XQuery 1.1, to możesz po prostu zrobić:

switch ($room) 
    case "bathroom" return "loo" 
    case "kitchen" return "scullery" 
    default return "just a room"