2011-03-12 17 views
5

Diciamo che ho il seguente codice XML:Selezionare distinti valori in base al nodo figlio in XQuery

<info> 
    <channel> 
     <A> 
      <X> 
      <title>title1</title> 
      </X> 
      <Y value="20"/> 
     </A> 
    </channel> 
    <channel> 
     <A> 
      <X> 
      <title>title1</title> 
      </X> 
      <Y value="20"/> 
     </A> 
     <A> 
      <X> 
      <title>title2</title> 
      </X> 
      <Y value="20"/> 
     </A> 
    </channel> 
</info> 

e il seguente XQuery

{ 
for $A in doc('test.xml')//A 
let $TITLE := $A/X/title 
where string($A/Y/value) > 20 
return 
    string($TITLE) 
} 

questo, naturalmente, uscite:

title1 
title1 
title2 

Come posso utilizzare distinct-values per rimuovere i duplicati? Mi chiedo perché lo for in sostanza mi dia solo un articolo per iterazione e non posso chiamare distinct-values su $A. O c'è un altro modo per rimuovere l'output duplicato?

Il problema è che ho bisogno di fare riferimento a un altro nodo, quindi in pratica chiamare distinct-values(doc...) non funziona, in quanto non restituisce nodi.

risposta

5

UPDATE

per filtrare duplicati nodi, utilizzare una variante del XPath da this answer:

//A[index-of(//A/X/title, X/title)[1]] 

questo ti dà tutti i A s con differenti title s.

si può espandere questa espressione XPath per filtrare anche Y - senza bisogno di XQuery FLWOR.

AGGIORNAMENTO FINE

applicare il distinct-values all'espressione XPath su cui si desidera iterare:

for $title in distinct-values(doc('test.xml')//A/X/@title) 
return string($title) 

o semplicemente

distinct-values(doc('test.xml')//A/X/@title) 
+0

+1 Per ultimo corretta XQuery/Espressione XPath. –

+0

Grazie per l'aggiornamento! Ti darò un'occhiata in seguito! – slhck

+0

@slhck quindi come è andata? –

Problemi correlati