2011-03-12 26 views
5

Digamos que tengo el siguiente código XML:Seleccionar valores distintos según nodo hijo en 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> 

y la siguiente XQuery

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

Esto, por supuesto, salidas:

title1 
title1 
title2 

¿Cómo puedo usar distinct-values para eliminar duplicados? Me pregunto porque for esencialmente solo me da un artículo por iteración y no puedo llamar al distinct-values en $A. ¿O hay alguna otra forma de eliminar la salida duplicada?

El problema es que necesito hacer referencia a otro nodo, por lo que básicamente llamar a distinct-values(doc...) no funciona, ya que no devuelve nodos.

Respuesta

5

ACTUALIZACIÓN

para filtrar duplicados nodos, utilizar una variación de la XPath de this answer:

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

esto le da todas las A s con diferentes title s.

puede expandir esta expresión xpath para filtrar también en Y - sin necesidad de XQuery FLWOR.

ACTUALIZACIÓN FIN

aplicar el distinct-values a la expresión XPath sobre el que desea repetir:

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

o simplemente

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

+1 Por último XQuery correcta/Expresión XPath. –

+0

¡Gracias por la actualización! ¡Lo echaré un vistazo más adelante! – slhck

+0

@slhck entonces, ¿cómo te fue? –

Cuestiones relacionadas