2010-06-26 5 views
6

Mi piacerebbe sapere se l'espressione xquery FLWOR ha un'istruzione exit come continue e break?XQuery ha un'istruzione exit per le espressioni FLWOR

Ad esempio, desidero uscire dal ciclo for quando si raggiunge una condizione particolare.

+1

espressioni FLWOR non sono realmente anelli - non è garantito che gli elementi "for" saranno valutati in un dato ordine, o anche in un singolo thread; potevano essere tutti fatti in parallelo e combinati insieme in una volta, e finché la semantica fosse mantenuta, ciò sarebbe valido. –

risposta

7

Vorrei sapere se XQuery FLWOR espressione ha una dichiarazione di uscita come continuare e rompere?

Ad esempio, desidero uscire dal ciclo quando una condizione specifica è la copertura .

XQuery è un funzionale lingua , che tra le altre cose significa che non esiste il concetto rigoroso ordine di esecuzione. Pertanto qualsiasi tentativo di fare qualcosa di specifico quando succede qualcosa, non ha senso.

L'approccio corretto è quello di fare qualcosa se una condizione specifica è soddisfatta.

Non esiste alcun modo per uscire da un'espressione FLWOR diversa dalla funzione error(), ma ciò interrompe l'elaborazione.

Uno non dovrebbe preoccuparsi troppo dell'ottimizzazione - molti processori hanno buoni ottimizzatori.

Così molti processori valuteranno pigramente e si fermerà la valutazione dell'espressione FLOWR sotto, la prima volta produce risultato che soddisfa la specific-condition():

(someFlowerExpression)[specific-condition(.)][1] 
1

XQuery Scripting ha un'istruzione di uscita:

variable $i := 0; 
while(true()) 
{ 
    $i := $i + 1; 
    if($i = 3) then 
     exit returning $i 
    else(); 
} 

O

for $i in (1 to 1000) 
return 
    if($i = 3) then 
    exit returning $i; 
    else(); 

Puoi provare questo esempio dal vivo al http://www.zorba-xquery.com/html/demo#JvSLsVh3ZjhvTHecVd9jyE1vEBc=

+0

Non ci sono parole chiave di uscita o di restituzione in XQuery. –

+0

'for $ i in (da 1 a 1000) dove $ i LT 4 ritorno $ i ' –

+0

Entrambi i collegamenti sono morti :( –

0

Anche se la domanda è abbastanza vecchia, la risposta è come alcune persone nuove potrebbero affrontare una simile situazione e ottenere una soluzione migliore.

Questa soluzione sarebbe eseguito facilmente su BaseX 7,6

for $i in (1 to 10) 
return 
    if ($i = 3) then 
     $i 
    else 
     exit 

uscita sarà - 3

O questo genererà l'uscita - 3,

for $i in (1 to 10) 
return 
    if ($i = 3) then 
     $i 
    else 
     () 
+0

Non ho avuto il tempo di provare questo in BaseX, ma in teoria questo sarebbe uscita nulla , dal momento che per la prima volta attraverso il ciclo, a causa di '$ i = 1', sarebbe già uscito. –

+0

@Vincent: ho aggiornato la risposta, la seconda funziona con BaseX, l'ho verificata. SOLO 3. – John