1 00:00:07,089 --> 00:00:33,829 Un nodo y por otro lado nos va a dar un valor atómico. Si veis, coge la edad y le suma un valor, una unidad. Al final, lo que nos está obteniendo, pues, ¿qué es? Nos está teniendo, pues, valores, ¿veis? Una secuencia heterogénea como resultado. La secuencia nos está dando, por un lado, que sería la primera línea, nos está dando, pues, un nodo y por la segunda línea nos está dando, pues, un valor atómico, como es un valor entero, ¿vale? 2 00:00:33,829 --> 00:00:38,270 Esto sería la definición de los comentarios dentro de XQuery 3 00:00:38,270 --> 00:00:42,369 Si veis, le antepone o flanquea el comentario 4 00:00:42,369 --> 00:00:45,149 con un paréntesis de apertura con dos puntos 5 00:00:45,149 --> 00:00:48,429 y lo cierra con dos puntos y un paréntesis de cierre 6 00:00:48,429 --> 00:00:51,390 Aquí nos está indicando con estos dos comentarios 7 00:00:51,390 --> 00:00:54,149 que aquí va a sacar por pantalla 8 00:00:54,149 --> 00:00:59,780 cada nodo y aquí un valor atómico 9 00:00:59,780 --> 00:01:02,579 En relación con XPath, lo he estado diciendo a lo largo 10 00:01:02,579 --> 00:01:06,140 desde que he empezado con XQuery 11 00:01:06,140 --> 00:01:29,719 XQuery se construye sobre XPath. Toda expresión XPath válida es también válida en XQuery. Aprovecha ese poder para localizar nodos y traer sobre estructuras jerárquicas. Aquí tenemos ahora otro fichero XML como sería empresa que contiene nodos empleado y cada nodo empleado tiene dos subnodos nombre y departamento. 12 00:01:29,719 --> 00:01:45,379 Entonces, el hecho de poner aquí doc empleados.xml, doble slash y nombre, pues aquí está utilizando XPath puro en el XQuery y nos está indicando que se sitúe aquí en nombre. 13 00:01:46,319 --> 00:01:55,280 Después, posteriormente, este es otro ejemplo en el que nos está indicando que se sitúe en empleado. 14 00:01:55,280 --> 00:02:17,879 ¿Vale? Bueno, comentarios y expresiones en XQuery, ya he hablado de los comentarios, que serían de esta forma, y en cuanto a las expresiones no he hablado, pero siempre que pongas dos llaves, una llave de apertura y una llave de cierre con algo en el centro, pues aquí esto sería una expresión y como tal la va a ejecutar. 15 00:02:17,879 --> 00:02:36,520 Aquí tenemos un ejemplo, este sería un ficherito XML sencillito de empleado con dos subcampos, nombre y salario, y lo que va a recorrer aquí se sitúa en empleado y va a meter cada uno del contenido del orden de empleado en la variable E. 16 00:02:36,520 --> 00:02:52,539 Una vez que lo ha metido ahí, a continuación nos hace un retrum para devolvernos un resultado que va a ser la etiqueta resultado, la etiqueta, este nodo resultado que va a flanquear, el que va a flanquear a nombre y a salario incrementado. 17 00:02:52,539 --> 00:03:12,360 Pero dentro, como valores, ha metido dos expresiones. Veis aquí que tiene dos llaves. Aquí está metiendo la expresión que nos está diciendo en esta expresión. Nos está diciendo, oye, méteme aquí dentro el valor dentro de lo que ha recogido en E, que sería el nombre, dentro de nombre, recógeme o sácame cada uno de los valores. 18 00:03:13,259 --> 00:03:18,360 El salario incrementado lo está haciendo, pero ahora nos está indicando que cogemos el salario, 19 00:03:18,740 --> 00:03:21,719 le multiplicamos por 1,10 y lo ponemos en decimal. 20 00:03:22,259 --> 00:03:24,500 Y eso es lo que ha realizado en el propio resultado. 21 00:03:24,659 --> 00:03:32,000 Si veis, esa llave lo que está haciendo es una operación aquí en el centro del propio resultado. 22 00:03:32,259 --> 00:03:34,500 Dos operaciones concretamente, esta y esta otra. 23 00:03:34,819 --> 00:03:39,400 Las ejecuta esas dos operaciones y las inserta dentro de toda esta estructura que nos ha puesto como resultado. 24 00:03:41,710 --> 00:03:42,750 Condicionales en XQuery. 25 00:03:42,750 --> 00:03:54,310 XQuery permite también expresiones condicionales y si veis la estructura de la expresión condicional en XQuery, bueno, es muy parecida a lo que hemos visto en varios lenguajes, habréis visto en algún lenguaje de programación. 26 00:03:54,710 --> 00:04:03,810 Aquí hay que decir que utiliza el S y también utiliza el DEN. Si condición se cumple, pues entonces resultado 1, si no, pues resultado 2. 27 00:04:03,810 --> 00:04:07,349 si veis la semántica es la misma 28 00:04:07,349 --> 00:04:09,430 a muchos lenguajes de programación 29 00:04:09,430 --> 00:04:12,270 hay que decir que aquí tenemos un ejemplo en el que 30 00:04:12,270 --> 00:04:16,329 lo que hace es que a través de este fichero personas.xml 31 00:04:16,329 --> 00:04:18,269 pues bueno, esto no lo he dicho 32 00:04:18,269 --> 00:04:21,129 pero el let lo utiliza para declarar una variable 33 00:04:21,129 --> 00:04:23,370 al declarar aquí una variable lo veis con el 34 00:04:23,370 --> 00:04:27,389 nos está diciendo pues que introduzca dentro de la misma 35 00:04:27,389 --> 00:04:30,709 pues todo dentro del fichero personas.xml 36 00:04:30,709 --> 00:04:32,850 todas las personas que tenga, como aquí solo tiene una 37 00:04:32,850 --> 00:04:37,910 e insertará todo esto dentro de esta variable, y luego en el resultado lo que hará es utilizar el condicional. 38 00:04:38,389 --> 00:04:43,970 En el RETRUN utiliza el condicional y nos dice que si este compendio que ha metido en P, 39 00:04:44,589 --> 00:04:52,649 concretamente en su subnodo edad, es mayor o igual que 18, pues entonces que saque estas dos etiquetas mensaje, 40 00:04:52,810 --> 00:04:56,990 estas flancadas con una expresión en su interior. 41 00:04:56,990 --> 00:05:02,410 La expresión es que saque el nombre de la variable que conlleva todo esto. 42 00:05:02,410 --> 00:05:31,050 Entonces, fijaos, si como tiene que ser mayor o igual que 18 y este es 16, lógicamente no nos va a sacar, no sacará pues el mismo nombre, porque lo ha puesto en los dos, tanto en el den como en el ese, no sacará el nombre pues que tiene este subnodo persona, que será Ana, pero nos va a sacar el segundo mensaje, que es menor de edad, ¿vale? Porque no cumple, esta condición no la cumple este nodo persona. 43 00:05:31,050 --> 00:05:35,259 expresiones FLWR 44 00:05:35,259 --> 00:05:37,699 que es FOR, LET, WHERE, ORDER BY 45 00:05:37,699 --> 00:05:39,740 y RETRUN, si veis son las primeras 46 00:05:39,740 --> 00:05:41,620 líneas de, y bueno 47 00:05:41,620 --> 00:05:43,540 pues lo que va a hacer es que a lo largo de 48 00:05:43,540 --> 00:05:45,620 toda la misma, lo que va a hacer es iterar 49 00:05:45,620 --> 00:05:47,500 sobre elementos con el FOR, va a 50 00:05:47,500 --> 00:05:49,480 declarar variables con el LET, lo hemos visto antes 51 00:05:49,480 --> 00:05:51,680 va a filtrar con una condición 52 00:05:51,680 --> 00:05:53,480 que sería el WHERE, va a ordenar 53 00:05:53,480 --> 00:05:55,500 los resultados con el ORDER BY 54 00:05:55,500 --> 00:05:57,519 y va a construir un resultado 55 00:05:57,519 --> 00:05:59,600 final con el RETRUN, que es lo que nos va a devolver 56 00:05:59,600 --> 00:06:01,399 vale, aquí tenemos un ejemplo 57 00:06:01,399 --> 00:06:12,680 en el que, bueno, pues con este otro fichero pues XML que se llama libros, que es con una red catálogo y que está formando por varios nodos libro, 58 00:06:13,220 --> 00:06:22,500 lo que nos hace aquí, si lo veis en recorrido, pues es que se sitúe el libro y una vez situado ahí, pues vaya cogiendo todos los que tengan el precio menor de 20. 59 00:06:22,500 --> 00:06:28,480 Si nos fijamos aquí, los libros que tienen un precio, un subcampo precio menor de 20 sería el primero y el último. 60 00:06:28,480 --> 00:06:49,879 Entonces, esos son los que va a coger. Una vez que los ha cogido, dice, oye, ordénamelos por el título. Como el order by, por defecto, ordena de la A a la Z. Si no, habría que poner la palabra descending que lo que hace es que la clasificaría desde la Z a la A. Aquí clasifica de la A a la Z. 61 00:06:49,879 --> 00:06:52,860 y luego nos dice que en el return nos saque nada más que el título de esos. 62 00:06:53,259 --> 00:07:01,300 Entonces, ha cogido este, ha cogido este de abajo y luego dentro de los dos los ha ordenado por el título alfabéticamente. 63 00:07:01,500 --> 00:07:04,680 Pondría primero aprende XML y luego fundamentos, que es lo que aparece aquí. 64 00:07:07,399 --> 00:07:14,439 Estructurado una consulta XQuery, es decir, que tiene un prólogo, que nosotros podemos declarar espacio de nombres, funciones, 65 00:07:14,439 --> 00:07:19,519 podemos poner variables y luego la expresión, la expresión que es lo que estamos viendo hasta ahora, 66 00:07:19,519 --> 00:07:27,720 que es el cuerpo de la consulta, utilizar expresiones XPath, condicionales, etc. Esto que aparece aquí, que sería la expresión, es lo que hemos hecho hasta ahora. 67 00:07:27,980 --> 00:07:32,060 Pero que sepáis que también hay una parte de prólogo en la que podemos crear todas estas cosas. 68 00:07:34,480 --> 00:07:43,759 Las cláusulas no las voy a repetir, es lo mismo que he dicho antes. Aquí tenemos que, os he puesto, para el que se le haga un poquito difícil la compresión, 69 00:07:43,759 --> 00:08:02,699 He puesto el recorrido, como también hacen en el Aura Virtual, de cada una de las partes, primero con el for, en el que cómo utiliza el for. He añadido aquí lo que llama producto cartesiano, hay veces cuando en el for se añade dos variables, lo veis, las podéis separar con una coma. 70 00:08:02,699 --> 00:08:28,819 Aquí nos está diciendo que, oye, dentro de este fichero datos que está formado por elementos autores y libros, pues está cogiendo, si lo veis, dentro de autor y dentro de libro y nos está dando una salida en el que cuando tenga dos variables lo que hace es que hace un producto cartesiano en el que permite recorrer XML y acceder a nodos repetidos. 71 00:08:28,819 --> 00:08:41,480 Entonces, ¿qué está cogiendo aquí? Me está diciendo, oye, métete en autor y métete en libro. Y lo que saques, lo que tenga ahí, se lo metes en la variable autor y en la variable libro. 72 00:08:42,080 --> 00:08:55,840 Después, ¿qué me vas a retornar? Me retornas en franqueado por las etiquetas asignación. Me vas a ir añadiendo el nombre de autores y el título de libros. 73 00:08:55,840 --> 00:09:17,779 Y veis, lo va sacando aquí. Asignación es lo que hemos visto antes en cuanto a la creación de variables. Utiliza estos dos puntos igual para la asignación y utiliza la parábola let delante de la variable. Y aquí realiza una asignación. ¿Qué está haciendo aquí? Está diciendo, oye, cógeme de precio, me lo metes valor de x y me lo multiplicas por 1,21. 74 00:09:17,779 --> 00:09:32,019 Luego teníamos la parte del WHERE, que no es más que una condición. Veis, aquí está estableciendo una condición. Está diciendo, oye, fíltrame o solo deja pasar aquellos cuya etiqueta precio tenga valor menor que 20. 75 00:09:32,019 --> 00:09:50,480 Y tenemos el ordenamiento. He dicho anteriormente que podemos ordenarlo sin esta palabra, sin descending. Si no pones descending, te lo va a ordenar, aquí lo está, va a ordenarlo por título, por el título de la A a la Z e irá de arriba a abajo en función de la A a la Z. 76 00:09:50,480 --> 00:10:01,360 Si nosotros ponemos descending, te está diciendo que lo va a ordenar por el título, pero desde la Z a la A. Con lo cual, el que tenga el sistema cerca de la Z aparecerá arriba y el que esté más cerca de la A aparecerá abajo. 77 00:10:02,019 --> 00:10:30,580 Y por último el retrum, que es el que nos va a construir el resultado. Y bueno, en el que le podemos incluso, como hace aquí, meter una expresión. Ha metido aquí una expresión sacando todos los valores título. Aquí hay un ejemplo completo que no voy a... lo dejo que aparezca en la grabación, pero que no lo voy a explicar porque es más de lo mismo. El ejemplo hace exactamente lo mismo que hemos visto hasta ahora. 78 00:10:34,110 --> 00:10:40,889 Sobre las cláusulas, iterar, calcular, filtrar, ordenar y generar el resultado. En eso se basa el FLWR. 79 00:10:42,350 --> 00:10:46,470 Y aquí tenemos los ejemplos que os he puesto, que son los ejemplos que aparecen en el aula virtual. 80 00:10:47,129 --> 00:10:57,710 Ejemplos del aula virtual, no voy a recorrer los ejemplos, los tenéis allí en el aula y tan solo, pues, no sé, aparte no vamos muy bien de tiempo. 81 00:10:57,710 --> 00:11:01,429 que sepáis que lo tenéis aquí en la presentación 82 00:11:01,429 --> 00:11:04,509 aquí he metido el ejercicio 1, el 2 y el 3 resueltos 83 00:11:04,509 --> 00:11:06,690 que es lo mismo que aparece en el mismo 84 00:11:06,690 --> 00:11:09,490 aquí si veis en este está utilizando una función 85 00:11:09,490 --> 00:11:10,809 ahora veremos lo que son las funciones 86 00:11:10,809 --> 00:11:12,990 si veis aquí está sacando el número de libros 87 00:11:12,990 --> 00:11:15,509 veis que la estructura de todos los ejemplos 88 00:11:15,509 --> 00:11:17,649 es una biblioteca y luego dentro de la biblioteca 89 00:11:17,649 --> 00:11:19,110 está formada por etiquetas 90 00:11:19,110 --> 00:11:21,629 está la etiqueta libros 91 00:11:21,629 --> 00:11:23,370 y dentro de libros hay etiquetas libro 92 00:11:23,370 --> 00:11:26,009 esos libros individuales 93 00:11:26,009 --> 00:11:32,850 Están formados por un título, por un autor, y luego dentro del autor hay un nombre y un apellido, hay una editorial, páginas, versión electrónica, etc. 94 00:11:33,330 --> 00:11:40,190 Entonces, aquí, por ejemplo, por solo hablar de un ejemplo, sería este, pues, obtener el número de libros de menos de 100 páginas. 95 00:11:40,330 --> 00:11:47,549 Pues aquí, claro, tendremos que saber cuántas páginas tiene cada libro, tendremos que utilizar una función count. 96 00:11:48,490 --> 00:11:49,490 ¿Quién nos las va a contar? 97 00:11:49,490 --> 00:12:02,929 Si veis aquí lo que está haciendo es, me vas a recorrer en el doc libros.xml desde el punto libros, me vas a recorrer y me lo vas a meter en la variable x. 98 00:12:03,330 --> 00:12:14,250 Una vez que tenemos la variable x me vas a contar, si veis aquí está metiéndose en libro y aquí está metiendo en number. 99 00:12:14,250 --> 00:12:31,490 Si nosotros nos fijamos en el libro, nos está diciendo el número de páginas que va a tener. Si este es menor que 100, pues retórname el contaje de las mismas. Lo cuenta, lo metería aquí en esta variable y te da el resultado con la función count. 100 00:12:31,950 --> 00:12:38,490 Veremos ahora al final las funciones que podemos generar con XQuery, que pueden ser de texto, que pueden ser numéricas, etc. 101 00:12:39,409 --> 00:12:47,750 Voy a pasar los ejemplos porque los tenéis en el libro, no los voy a detallar porque si no ya se nos ha pasado una hora, entonces voy a ir un poquito más deprisa. 102 00:12:48,870 --> 00:12:58,190 Estas serían las funciones que va a tener XQuery, que serían funciones numéricas, funciones de cadenas, de manipulación de secuencias, de fechas y expresiones regulares, lógica ovuleana, definición de funciones propias. 103 00:12:59,289 --> 00:13:00,990 Y aquí tenemos todas ellas. 104 00:13:01,490 --> 00:13:21,950 Aquí tenemos las funciones numéricas, que serían funciones muy parecidas a las que aparecen en cualquier lenguaje de programación. En cuanto a las funciones de texto, también serían con qué termina la palabra, con qué comienza, pásamela toda la palabra o la extrema a mayúsculas, a minúsculas, concatename dos cadenas, esta con esta. 105 00:13:21,950 --> 00:13:38,230 En cuanto a estas funciones, las típicas de sacarme la media, suma total, etc. Tenemos también funciones de uso general como pueden ser empty, exits, estas serían true si la sentencia está vacía, true si contiene al menos un elemento. 106 00:13:38,230 --> 00:13:42,230 importante los cuantificadores existenciales que lo vimos anteriormente 107 00:13:42,230 --> 00:13:46,230 que os dije que son para generar expresiones lógicas 108 00:13:46,230 --> 00:13:49,950 esto sería matemática lógica o proposicional como aparece 109 00:13:49,950 --> 00:13:53,850 en el comprolog en el que utiliza el sum y el every 110 00:13:53,850 --> 00:13:58,190 en el que el sum nos está diciendo que cógeme realmente 111 00:13:58,190 --> 00:14:02,250 una expresión lógica que nos va a devolver, nos va a devolver siempre un valor 112 00:14:02,250 --> 00:14:05,850 binario que será o true o false, un 0 o un 1 113 00:14:05,850 --> 00:14:22,450 Aquí, en este caso, nos va a devolver true o false. Y some y every se utilizan como expresiones lógicas que nos van a devolver ese resultado. Some es cuando al menos un elemento cumple la condición, mientras que every nos está diciendo que todos los elementos deben cumplir la condición. 114 00:14:22,450 --> 00:14:38,649 Aquí tenemos el libros, en el que está formado a su vez por un libro con páginas, etc. Entonces, nos está diciendo aquí, oye, seleccioname aquello que satisface, dime si satisface que precio sea menor de 20. 115 00:14:38,649 --> 00:14:58,389 Si está dentro de ello y hay alguno de ellos, entonces devuelve un verdadero. De hecho, pues como aquí, menor de 20, hay uno que es 15, pues nos devuelve true. El every nos está diciendo que todos deben satisfacer que las páginas sean mayor de 50, todas las elementos que tenga de libros. 116 00:14:58,389 --> 00:15:05,389 Como vemos que no todas son mayores de 50, pues lógicamente no va a devolver un false. Esos son los cuantificadores esenciales. 117 00:15:05,389 --> 00:15:22,590 Ejemplo con data, pues, y esto se lo resumo porque no es fácil, se usa para obtener solo el texto que haya dentro de la etiqueta, para eso se usa data, y en eso se basa. 118 00:15:22,590 --> 00:15:44,809 No sé si aquí hay un ejemplo, pero data lo que busca cuando yo pongo la función data es esto que hay aquí en el interior de cada una de las etiquetas. Si veis aquí se ha introducido dentro de la etiqueta título y nos ha dicho, oye, recórremelo, me lo metes en la variable x y me obtienes de los datos de x. De hecho, obtiene el R en xml y obtiene cada uno de ellos. 119 00:15:47,629 --> 00:15:50,669 Esto sería un ejemplo de definición y llamada a una función. 120 00:15:51,190 --> 00:15:56,629 Las dos funciones se declaran, ahora lo veremos a continuación, con el declare, luego function y el nombre de la función. 121 00:15:56,629 --> 00:16:04,950 Y dentro aparecen cada uno de los parámetros que ya les mete un tipo de valor a través del x, s, dos puntos, decimal o enteger o lo que sea. 122 00:16:05,710 --> 00:16:09,509 ¿Veis? Declara la función y le añade el contenido de la función siempre con un retro. 123 00:16:09,509 --> 00:16:28,730 Una función, acordaros, es una estructura donde tiene cero o más parámetros en su interior y devuelve siempre un valor, ¿vale? Aquí nos está indicando, pues, que el tipo de valor para devolver, ¿veis? Aquí ha puesto como que tiene que ser decimal. Esta es la estructura. 124 00:16:28,730 --> 00:16:48,289 Para llamar a la función una vez que ha sido declarada, además aquí en xQuery bastante claro porque ya te está poniendo la palabra declara, vemos que esta sería la declaración para llamarla o lo que se llama la invocación a la función sería esta de aquí que lo hace a través de una expresión. 125 00:16:48,289 --> 00:16:59,649 Si lo veis, llama minPrice y le pasa una serie de parámetros que con ellos va a interactuar para devolver un resultado que es lo que aparecerá aquí como resultado de esta expresión. 126 00:17:01,590 --> 00:17:06,990 Comparación de varios escalares. No me voy a meter en esto. Igual, no igual, como todos los lenguajes de programación. 127 00:17:07,569 --> 00:17:16,450 Comparación general de secuencias. Tampoco me voy a meter con los operadores de comparación porque ya sabemos también cómo son. El mayor igual, el menor igual. 128 00:17:16,450 --> 00:17:33,930 Tenemos también comparación de nodos con el is y el is not. Aquí tenemos, estos sí son un poco más elises, verdaderos y apuntan al mismo nodo. Fijaos aquí, tenemos el catálogo con varios libros y luego tenemos que dentro de cada libro tenemos un título de etiqueta. 129 00:17:33,930 --> 00:17:56,769 Y nos está indicando aquí que, oye, méteme dentro de la variable, asígname a la variable A, me asigna dentro del documento libros.xml, que es este, y dentro de catálogo libro 1, que sería este de aquí, y le está diciendo, y luego está definiendo otra variable, B, que le asigna también el mismo contenido y nos está diciendo, 130 00:17:56,769 --> 00:18:04,750 retro, A es B, A apunta al mismo nodo los dos, por eso nos sale un true. 131 00:18:05,170 --> 00:18:08,250 En cambio, si nos llama al primer libro y al segundo libro, 132 00:18:08,329 --> 00:18:10,589 nos meten los dos variables y las compara con el disnode, 133 00:18:10,670 --> 00:18:13,029 nos está diciendo también que es verdad, ¿por qué? 134 00:18:13,369 --> 00:18:17,329 Porque es verdad que este libro y este libro, estos dos nodos, 135 00:18:17,670 --> 00:18:19,950 las dos variables no están apuntando al mismo nodo, 136 00:18:20,009 --> 00:18:21,490 sino que están apuntando a distintos nodos. 137 00:18:21,490 --> 00:18:51,470 Orden entre nodos también, pues que lo utiliza con este operador. Este nos indica que el nodo izquierdo aparece antes que el derecho y este nos indica que el izquierdo aparece después que el derecho. Operadores lógicos, ANPOR, en esto no me voy a parar. Operadores sobre secuencias de nodos, UNION, INTERSET, STET, nos está diciendo, esto pues como pasaba en cualquier lenguaje declarativo SQL, pues tenemos la operación UNION en el que todos los nodos 138 00:18:53,250 --> 00:18:56,829 nos va a devolver todos los nodos únicos de ambos operandos comparados. 139 00:18:57,470 --> 00:18:59,250 Comparado a ambos operandos y nos va a dar todo. 140 00:19:00,029 --> 00:19:04,269 En cambio, la intersección solo nos va a dar aquellos nodos que coincidan en ambos dos. 141 00:19:04,829 --> 00:19:09,250 Y excepto, nos está diciendo, oye, dame todos los nodos que sean diferentes a los que yo tengo. 142 00:19:12,410 --> 00:19:16,529 Operadores aritméticos, tampoco me voy a meter porque esto es como cualquier otro lenguaje de programación. 143 00:19:17,430 --> 00:19:20,710 Y aquí acabaría lo que es la sesión. 144 00:19:20,710 --> 00:19:36,950 Sé que ha sido un poquito larga, pero es que el tema es verdad que aunque en el aula virtual es corto, quería que os quedara más claro porque nos metemos aquí con programación, nos metemos con un tema un poquito más, entonces quería que estuviera un poquito más claro.