Sunteți pe pagina 1din 14

1. 2. 3. 4. 5.

XQuery Funciones de entrada Path expresiones en Xquery. Evaluacion Sentencias FLWOR Clausulas for, let, where, order, return

XQUERY
XQuery, tambin conocido como XML Query, es un lenguaje creado para buscar y extraer elementos y atributos de documentos XML. Podemos decir que XQuery es para XML lo que SQL es para las BD. Su principal funcin es extraer informacin de un conjunto de datos organizados como un rbol n-ario de etiquetas XML. En este sentido XQuery es independiente del origen de los datos. XQuery es un lenguaje funcional, es decir que en lugar de ejecutar una lista de comandos como un lenguaje procedimental clsico, cada consulta es una expresin que es evaluada y va a devolver un resultado, al igual que en SQL. Se pueden combinar de forma muy flexible diversas expresiones con otras expresiones para crear nuevas expresiones ms complejas y de mayor potencia semntica.

Similitudes entre SQL y Xquery: Los dos permiten realizar consultas ya sea en SGBDR en XML y presentan similitudes en la sintaxis como veremos en las expresiones FLOWR Diferencias entre SQL y Xquery: Xquery va a recorrer datos jerrquicos mientras que SQL recorre generalmente datos relacionales esto significa que los sistemas en los que operan son totalmente distintos. SQL permite modificar eliminar datos pero Xquery no permite eliminar editar datos directamente de la fuente

En Xquery una consulta es una expresin que lee una secuencia de datos en XML y devuelve como resultado otra secuencia de datos en XML. En Xquery, a diferencia de lo que sucede en SQL, las expresiones y los valores que se devuelven van a depender del contexto. Esto significa que los nodos que aparecern en el resultado dependen de cosas como por ejemplo los namespaces, la posicin donde aparezca la etiqueta raz del nodo (dentro de otra, por ejemplo), etc. Xquery va a utiliza Xpath como lenguaje de base y sus principales aplicaciones se pueden resumir en tres: 1. Recuperar informacin a partir de conjuntos de datos XML. Es decir permite filtrar los nodos que interesan de un documento XML y transformarlos para mostrar la informacin deseada con la estructura adecuada. 2. Transformar unas estructuras de datos XML en otras estructuras que organizan la informacin de forma diferente. 3. Ofrecer una alternativa a para realizar transformaciones de datos en XML a otro tipo de representaciones, como HTML o PDF. Xquery es un lenguaje sensible a maysculas. Va todo en minsculas En XQuery Los comentarios se expresan entre (: :) XQuery presenta varios tipos de expresiones, el valor de una expresin es una secuencia heterognea de nodos y valores atmicos y la mayora de las expresiones estn compuestas por expresiones de ms bajo nivel combinadas mediante operadores y palabras reservadas La estructura de una consulta en Xquery esta formada por un PROLOGO + EXPRESION Prologo: formado por declaraciones que marcan el entorno de la consulta por ejemplo:version, espacios de nombres, declaraciones de variables, de funciones etc Expresion: que es la consulta propiamente dicha En XQuery las consultas pueden estar compuestas por clusulas de hasta cinco tipos distintos. y siguen la norma FLWOR, siendo FLWOR las siglas de For, Let, Where, Order y Return.

Funciones de entrada
XQuery dispone de dos funciones de entrada que puede utilizar en expresiones Xpath en las clusulas FOR o LET para identificar el origen de los datos: La funcin doc (URI) devuelve el nodo documento ( o nodo raz) del documento referenciado por un identificador universal de recursos (URI). Esta es la funcin ms habitual para acceder a la informacin almacenada en archivos. ejemplo: Obtener todos los alumnos aprobados doc (alumnos.xml)//alumno [nota > 5] La funcin collection (URI) devuelve una secuencia de nodos referenciados por una URI, sin necesidad de que exista un nodo documento o nodo raz. Esta es la funcin ms habitual para acceder a la informacin almacenada en una base de datos que tenga capacidad para crear estructuras de datos XML. collection (empleados)

Path expresiones en XQuery


Como ya hemos dicho las Path expresiones en XQuery estn basadas en la sintxis de Xpath Estn formadas por una serie de pasos separados por / or // El resultado de cada paso es una secuencia de nodos Su valor es la secuencia de nodos que resultan del ltimo paso en el path EJEMPLO: Obtener todos los elementos libro del elemento librera.xml doc(libreria.xml)/libreria/libro
funcin que devuelve todo el documento selecciona el elemento libreria en la raz selecciona los elementos libro del elemento libreria

Pueden tambin retornar atributos, usando el smbolo @: doc ("catalog.xml")/*/product/@dept retorna los atributos dept existentes en el documento de entrada. El * puede ser usado como un comodn para indicar cualquier nombre del elemento interpretacin en este ejemplo: retornar cualquier hijo product del elemento ms externo, independiente de cual sea el nombre de este elemento externo Tambien se puede usar la doble barra inclinada (//) para retornar los elementos product que aparecen en cualquier lugar en el documento catalog con la expresin doc("catalog.xml")//product/@dept

Evaluacin de las expresiones XPath


En las expresiones Xpath al realizar la evaluacin: Los nodos seleccionados por cada paso sirven como nodos de contexto para los siguientes pasos Si un paso tiene varios nodos de contexto se evala cada uno de ellos y el resultado es la union de los resultados de la evaluacin de cada uno de ellos El resultado ser siempre una secuencia de nodos distintos (no se admiten duplicados) En las expresiones Xpath en Xquery un predicado es una expresin encerrada entre corchetes que se emplea para filtrar una secuencia de valores Ejemplos: libro [titulo = mi titulo] selecciona el libro mi titulo libro [precio >10] selecciona los libros con precio mayor de 10 libro[5] selecciona el quinto nodo hijo libro[precio] selecciona los libros que tienen un nodo hijo precio libro[@ao>1997] selecciona los libros cuyo ao es posterior al 97

Sentencias FLWOR
Son expresiones que permiten la unin de variables sobre conjuntos de nodos y la iteracin sobre el resultado. FLWOR es la contraccin de For Let Where Order Return. El funcionamiento de la sentencia es el siguiente: con las sentencias FOR y LET (podemos usar una de las dos las dos) se consigue una secuencia de variables ligadas a nodos (tuplas); con la sentencia WHERE (opcional) podemos seleccionar o descartar determinadas tuplas de esa secuencia; la sentencia ORDER (opcional) la utilizaremos cuando necesitemos reordenar la secuencia de tuplas la sentencia RETURN es evaluada para cada una de las tuplas.

Expresiones sentencias FLWOR en XQuery


Las expresiones FLWOR (For Let Where Order Return) son una de las expresiones ms potentes y tpicas de Xquery. Se basan en ligar valores a variables con las clusulas for y let y emplear esas variables para crear nuevos resultados Una expresin FLWOR se evala en este orden Comienza con una o ms clusulas for left en cualquier orden incluso unas dentro de otras (al menos aparecer una de ellas) . Pueden ir seguidas por una nica clusula where (opcional) Puede aparecer una unica clusula order by (opcional) aunque pueden aparecer varios criterios de ordenacin separados por una coma que se van a aplicar de izquierda a derecha Finaliza con una clusula return obligatoria * tupla= en XQuery se refiere a cada uno de los valores que toma una variable

Clausula for
Su objetivo es obtener una secuencia de tuplas ( una tupla se puede asimilar a un valor nodo del arbol de documento que tratamos) Su formato es similar al formato en Xpath y va a contener: var que es una variable sobre la que se almacenan los nodos binding sequence que indica los nodos que se van a tratar for var in binding sequence Con esto conseguiremos una secuencia de tuplas asociada a la variable var y para cada ocurrencia que tengamos en la binding sequence obtendremos una tupla Se pueden especificar mas de una variable en la misma sentencia y si lo hacemos obtendremos una tupla para el producto cartesiano de todas ellas Probar los siguientes ejemplos for $a in //numero return <poliza>{$a}</poliza> salen 3 elementos poliza for $a in //tomador return <poliza>{$a}</poliza> salen 3 elementos for $a in //numero, $b in //tomador return <poliza>{$a,$b}</poliza> Podemos ver que la sentencia RETURN es evaluada para cada una de la tuplas y en el ejemplo con dos variables, devuelve todas las posibles combinaciones de las dos secuencias es decir nueve elementos poliza

Clausula for (variable posicional)


Al usar la clusula FOR podemos indicar si nos interesa usar la variable posicional, que va a identificar la posicin de un elemento en la secuencia de tuplas que se genera, para ello podemos usar la particula at y declarar otra variable asi: for $a at $p en esa instruccin la variable $p contendr la posicin del elemento $a que se este tratando en cada momento. Ejemplo: Crear un elemento nuevoasegurado que slo contenga parmetros (atributos), de los cuales el ltimo nos indique la posicin en la secuencia generada for $a at $p in //asegurado return <nuevoasegurado pol= " {$a/ancestor::poliza/numero}" nombre= "{$a/@nombre} " posic= "{$p}"/>

Clausula let
El objetivo de la sentencia LET es el mismo de la sentencia FOR, obtener una secuencia de tuplas, pero la forma de hacerlo es distinta. Su formato es: let $var := binding sequence Tambin podemos especificar la unin con varias variables en una misma sentencia. Pero mientras en la sentencia FOR se va a obtener una tupla con cada elemento de entrada, con la sentencia LET obtenemos una nica tupla. Veamos la diferencia usando los mismos ejemplos usados para for y comparemos resultados: let $a := //numero return <poliza>{$a}</poliza> let $a := //tomador return <poliza>{$a}</poliza> let $a := //numero,$b := //tomador return <poliza>{$a,$b}</poliza> Vemos que la sentencia RETURN slo se evala para una nica tupla, y solo obtenemos un elemento <poliza>.

Uso conjunto de FOR y LET


Se puede usar de forma conjunta las partculas FOR y LET y entonces para cada tupla devuelta por la sentencia FOR se evala la sentencia LET, y despus se evala RETURN Ejemplo : for $a in //numero let $b:=$a/ancestor::poliza/tomador return poliza>{$a,$b}</poliza>

<

Clausula where
Es una clusula opcional y sirve para seleccionar ciertas tuplas del flujo generado por las sentencias FOR y LET. Su sintaxis es: WHERE expresin donde expresin sera evaluado a booleano y para cada tupla del flujo puede ser: (true y entonces se trata ) (false y entonces se descarta) Ejemplo : for $a in //numero where $a > 99000001 return <poliza>{$a}</poliza>: esta sentencia tratar todos los nodos nmero (3), pero solo devuelve el nico que cumple la condicin. Otro Ejemplo : for $a in //tomador where uppercase(substring($a,1,6)) = 'MANUEL' return <tomadores>{$a}</tomadores> esta sentencia trata todos los tomadores, pero solo se seleccionan aquellos que sus 6 primeras posiciones contengan MANUEL independientemente de si estn en maysculas o minsculas

Clausula order
Es una clusula opcional. Sirve para reorganiza la secuencia de tuplas generadas por las sentencias FOR y LET y filtradas por WHERE, pero como se evala antes de la sentencia RETURN el orden en la que las evala la sentencia RETURN viene marcada por el orden que le especifique la clusula ORDER BY. La forma de ordenar la secuencia de tuplas viene dada a travs de las orderspecs que aparecen en su formato ( se pueden especificar varias order-specs.) order by expr order-modifier stable order by expr order-modifier Si se especifica stable al comienzo de la sentencia queremos decir que en el caso de existir dos tuplas que contengan valores idnticos en todos los orderspec que hemos utilizado se mantenga el orden de entrada (stable es una opcin no reconocida al menos de momento- en eXist). Tambien se puede especificar el orden de la ordenacin del valor a) ascending b) descending Tambien nos permite especificar como tratar las tuplas que no contengan el elemento por el que se ordena empty greatest empty least Ejemplos: for $a in //tomador return $a for $a in //tomador order by $a ascending return $a for $a in //tomador order by $a descending return $a

Clausula return
La sentencia RETURN, como hemos dicho antes se evalua una vez para cada tupla dentro de la secuencia de tuplas obtenida con las sentencias FOR, LET, WHERE y en el orden especificado por ORDER BY. La potencia de esta sentencia radica (al contrario que en XPath) en que puede ser cualquier expresin (incluida una sentencia FOR) y que nos permite la creacin de nuevos elementos (ya veremos como se crean nodos) y por tanto poder cambiar la estructura del documento. En los ejemplos anteriores hemos visto como se devolva la variable tratada o sencillamente se envolva todo con un elemento raz para ilustrar diferencias entre FOR y LET, pero veamos ahora algn ejemplo ms Ejemplos: Obtener los asegurados de la primera pliza, cambiando el formato convirtiendo los atributos en elementos for $a in /envio/poliza[1]/asegurado return <nuevoasegurado> <nombre>{$a/@nombre}</nombre> <apellidos>{$a/@apellidos}</apellidos> </nuevoasegurado> Obtener un nuevo elemento pliza que contenga un parmetro nuevo con el nmero de asegurados for $a in //poliza return <poliza numaseg="{count($a/asegurado)}"> </poliza>

S-ar putea să vă placă și