Upload
nguyencong
View
255
Download
1
Embed Size (px)
Citation preview
Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red
IES Valle del Cidacos – Calahorra
Lenguajes de Marcas y Sistemas Gestores de Información
© Enrique Rivas Marco
Usted es libre de:
Compartir — copiar y redistribuir el material en cualquier medio o formato
Adaptar — remezclar, transformar y crear a partir del material
El licenciador no puede revocar estas libertades mientras cumpla con los términos de la licencia.
Bajo las condiciones siguientes:
Reconocimiento — Debe reconocer adecuadamente la autoría, proporcionar un enlace a la
licencia e indicar si se han realizado cambios<. Puede hacerlo de cualquier manera razonable,
pero no de una manera que sugiera que tiene el apoyo del licenciador o lo recibe por el uso que
hace.
NoComercial — No puede utilizar el material para una finalidad comercial.
CompartirIgual — Si remezcla, transforma o crea a partir del material, deberá difundir sus
contribuciones bajo la misma licencia que el original.
No hay restricciones adicionales — No puede aplicar términos legales o medidas tecnológicas que legalmente restrinjan realizar aquello que la licencia permite.
1
XML - Tratamiento y recuperación de datos
1. Bases de datos XML nativas. ......................................................................................... 3
1.1. Características de BaseX: ................................................................................................... 3
1.2. Instalación de BaseX ........................................................................................................... 3
1.3. Crear una base de datos. .................................................................................................... 5
1.4. Agregar registros a la base de datos. ............................................................................... 5
1.5. Consultas a la base de datos .............................................................................................. 8
1.6. Backups ................................................................................................................................. 8
2. XPath. ............................................................................................................................... 10
2.1. Direccionamiento o localización ...................................................................................... 10
2.2. Filtrar el acceso a elementos ............................................................................................ 12 2.2.1. Funciones numéricas: .................................................................................................................... 13 2.2.2. Funciones de cadena ..................................................................................................................... 13 2.2.3. Funciones de posición de elementos ........................................................................................ 14 2.2.4. Funciones que devuelven nodos ................................................................................................ 14 2.2.5. Funciones de agregado ................................................................................................................. 14
2.3. Consultas XPath anidadas ................................................................................................ 16
2.4. Sintaxis abreviada y compleja .......................................................................................... 16
2.5. Ejes ....................................................................................................................................... 17
2.6. Ejercicios XPath .................................................................................................................. 20 2.6.1. Ejercicio 1 - Expresiones simples ............................................................................................... 20 2.6.2. Ejercicio 2 – Expresiones simples .............................................................................................. 21 2.6.3. Ejercicio 3 – Expresiones anidadas ........................................................................................... 23
3. XQuery. ............................................................................................................................. 25
3.1. Introducción ........................................................................................................................ 25
3.2. Consultas FLWOR .............................................................................................................. 25 3.2.1. Cláusula "for" y "return" ............................................................................................................... 26 3.2.2. Cláusula "let" ................................................................................................................................... 27 3.2.3. Cláusula "for" y "let" ...................................................................................................................... 28 3.2.4. Cláusula "where" ............................................................................................................................. 29 3.2.5. Cláusula "order by" ........................................................................................................................ 29 3.2.6. Otros ejemplos de funciones y operadores ............................................................................. 29
3.3. Ejercicios ............................................................................................................................. 30 3.3.1. Bloque de consultas XQuery 1 .................................................................................................... 30 3.3.2. Bloque de consultas XQuery 2 .................................................................................................... 35
4. Bibliografía .............................................................................................................................. 41
2
1. Bases de datos XML nativas.
Las bases de datos XML nativas permiten almacenar documentos XML con sus
elementos y atributos.
BaseX es un motor de bases de datos XML nativo, ligero, de alto rendimiento en
las operaciones y fácilmente escalable. Incluye procesadores Xpath y Xquery y
soporte de la última actualización de la W3C.
1.1. Características de BaseX:
• Alto rendimiento de almacenamiento con texto, atributos, texto completo y
rutas.
• Apoyo de las Recomendaciones del W3C Xpath/Xquery.
• Una de las más altas tasas de cumplimiento para todas las especificaciones
admitidas.
• Arquitectura Cliente/Servidor, con soporte de transacciones seguras ACID,
gestión de usuarios y autenticación.
• Visualizaciones altamente interactivas, con soporte para documentos XML
de gran extensión.
• Editor XQuery en tiempo real disponible, con resaltado de sintaxis y
feedback de errores.
Se puede acceder a la página oficial de BaseX en http://basex.org/home/ allí se
explican sus características y funcionalidades, en el apartado de descargas
http://basex.org/products/download/all-downloads/ encontramos las distintas versiones
disponibles.
1.2. Instalación de BaseX
Linux – Ubuntu. En Ubuntu se encuentra disponible el paquete basex del cual
procederemos a la instalación:
sudo apt-get install basex
A continuación procedemos a arrancar el servidor mediante la orden:
sudo basexserver
Una vez arrancado el servidor ya tenemos a nuestra disposición el control del
servidor, con lo cual podemos ejecutar todas las órdenes que nos permite BaseX.
3
Windows. Descargaremos el instalador y lo ejecutaremos.
Seguimos la instalación, aceptamos los términos de la licencia
Elegimos la ruta donde se instalará y las opciones de instalación. Y se instala.
Este es el aspecto que tendrá nuestro programa una vez instalado.
4
1.3. Crear una base de datos.
Ahora que tenemos instalado Basex vamos a crear nuestra primera base de datos.
Primero es situarnos en la barra de comandos y escribir el comando:
Create Database [Nombre]
Con dicho comando habremos creado la base de datos y nos aparecerá la ventana
marcada con el número 2
Los archivos se guardarán en nuestra carpeta del programa.
Para abrir la base de datos usamos el comando OPEN [nombre] Si queremos un listado de las bases de datos usamos SHOW DATABASES
1.4. Agregar registros a la base de datos.
Ahora que tenemos lista nuestra base de datos vamos a agregar algunos registros.
Parece ser que el formato del XML lo asignamos nosotros según lo que queramos.
En este caso agregaremos los administradores de Skamasle.com así que nuestro
XML queda así:
<?xml version="1.0" encoding="UTF-8"?> <usuarios>
<user> <id>1</id> <name>Nax</name>
5
<group>Admin</group> </user> <user> <id>2</id> <name>Skamasle</name> <group>Admin</group> </user> <user> <id>3</id> <name>Ubuntera</name> <group>Admin</group> </user> <user> <id>4</id> <name>Alguien</name> <group>User</group> </user>
</usuarios>
Ahora que hemos definido el archivo xml que guardaremos vamos a importarlo.
Lo podemos hacer con el comando ADD.
ADD (AS [nombre]) (TO [database]) [archivo]
Nuestro comando queda de la siguiente forma:
add to usuarios users.xml
Nota: el archivo users.xml tiene que estar en la carpeta basex.
Al importar el archivo nos quedará algo por el estilo:
Otra forma más sencilla hubiera sido desde el menú Database, New… podremos
elegir el fichero donde se encuentran los datos y el nombre de la base de datos.
6
En esta imagen se pueden observar las secciones más importantes de la interfaz
gráfica de BaseX:
• Barra de menús en la parte superior.
• Barra de herramientas (botones) inmediatamente debajo.
• Línea de comandos justo debajo.
• Editor de consultas.
• Diversas visualizaciones de los datos: mapa, texto, árbol.
• Información de las consultas ejecutadas (Query Info).
En la interfaz gráfica de BaseX se permiten ejecutar tres tipos de sentencias:
• Command, son órdenes del sistema gestor: Create DB, OPEN, CREATE
INDEX, CREATE USER, ADD, DELETE, REPLACE…
• Search, permite ejecutar expresiones XPath.
• XQuery, permite ejecutar órdenes de consulta XQuery.
7
1.5. Consultas a la base de datos
Para realizar las consultas utilizaremos Xquery
Lo primero que tenemos que hacer es cambiar la pestaña command por XQuery.
Ahora podemos ejecutar las consultas.
Lo primero que nos interesa es sacar todos los usuarios.
La consulta es:
//usuarios
Si quisiéramos consultar el grupo de admins la query es la siguiente:
//usuarios/user[group="Admin"]
O directamente:
//user[group="Admin"]
Estas dos querys nos devuelven todos los datos de cada Admin.
Si solo nos interesa un campo específico, los nombres por ejemplo, la consulta es
la siguiente:
//user[group="Admin"]/name
1.6. Backups
BaseX también permite realizar backups.
El sistema está bastante bien planteado y es muy simple.
Simplemente vamos a Database > Manage
Seleccionamos la base de datos y apretamos el botón backup.
8
Los archivos del backup se guardarán en la carpeta data dentro del directorio de la
aplicación.
Si queremos exportar el archivo vamos a Database > Export XML y elegimos el
directorio donde queremos exportarlo y el Endociding que queremos usar.
Conclusión
A estas alturas deberíamos ser capaces de:
• Crear Base de Datos y tablas
• Importar Datos
• Realizar consultas simples
• Realizar copias de seguridad y exportaciones
9
2. XPath.
XPath es un lenguaje XML que permite el acceso a información concreta de un
documento XML, haciendo un recorrido a través de los elementos que lo compone. Es
decir, evaluar una expresión XPath consiste en buscar si hay elementos que
satisfagan el recorrido indicado.
Este lenguaje se suele emplear en otras tecnologías o lenguajes y no en solitario. Por
ejemplo, se utiliza en consultas XQuery o en transformaciones XSLT o XSL-FO.
Un documento XML está compuesto por nodos, también llamados elementos, los
cuales se componen de etiquetas, atributos y contenido, siendo este contenido texto y
otros nodos. Los nodos se organizan en forma de árbol, existiendo un único nodo raíz.
A partir de él, todos los nodos pueden o no tener nodos hijos.
XPath considera un documento XML como un árbol de nodos. En Informática, un árbol
es una estructura de datos que equivale a un árbol matemático.
Un árbol dirigido es un árbol en el que las aristas tienen dirección y todos los nodos
menos uno tienen un único padre.
Un documento XML puede representarse como un árbol dirigido, considerando por
ejemplo los elementos como nodos y que un elemento es padre de los elementos que
contiene. Pero en XPath no sólo los elementos son nodos, en realidad hay siete tipos
de nodos:
Raíz, Elemento, Atributo, Texto, Comentario, Instrucción de procesamiento, Espacio
de nombres.
2.1. Direccionamiento o localización
El direccionamiento o localización es una ruta o camino de nodos de un
documento XML que nos permitirán seleccionar un conjunto de ellos.
El direccionamiento puede ser:
• Absoluto: si siempre se incluye el nodo raíz. (empiezan por /)
• Relativo: si se empieza a hacer referencia a los nodos desde un nodo
diferente al nodo raíz, llamado nodo de contexto.
10
Las expresiones que se pueden utilizar en un direccionamiento XPath son:
Nodo Elemento de nombre nodo
/nodo El nodo se encuentra en la raíz del documento
nodo1/nodo2 El nodo2 es hijo directo de nodo1
nodo1//nodo El nodo2 es hijo del nodo1 pero puede haber nodos intermedios
//nodo El nodo está ubicado en cualquier nivel debajo del nodo raíz
@atributo Atributo de nombre atributo
* Cualquier elemento
@* Cualquier atributo
. Nodo actual
.. Nodo padre
espNom:* Todos los elementos en el espacio de nombres de prefijo espNom
@espNom:* Todos los atributos en el espacio de nombres de prefijo espNom
Pongamos algunos ejemplos de su uso.
Vamos a tomar como referencia el siguiente documento XML:
<bib> <book id="1"> <title>TCP/IP Illustrated</title> <author>Stevens</author> <publisher>Addison-Wesley</publisher> <year>2002</year> </book> <book id="2"> <title>Advanced Programming in the Unix Environment</title> <author>Stevens</author> <publisher>Addison-Wesley</publisher> <year>2004</year> </book> <book id="3"> <title>Data on the Web</title> <author>Abiteboul</author> <author>Buneman</author> <author>Suciu</author> <year>2006</year> </book> </bib>
11
Para listar los títulos de los libros de la biblioteca:
/bib/book/author
Para listar los autores sin indicar de qué nodo son hijos:
//author
Para listar los identificadores de los libros:
/bib/book/@id
Para listar todos los atributos de cualquier nodo:
//@*
Acceso a elementos/atributos frente a acceso a su contenido textual, se puede
realizar con las siguientes funciones:
node(): Devuelve el nodo completo. Es el comportamiento por defecto. (sin
colocar)
text(): Devuelve el texto del nodo.
data(): Devuelve el texto de un atributo.
En XPath 2.0 se usa la misma función string() para ambos casos,
Por ejemplo, para listar sólo los títulos de los libros de la biblioteca sin las
etiquetas:
/bib/book/author/text() o /bib/book/author/string()
Para listar todos los atributos de cualquier nodo:
//@*/data() o //@*/string()
2.2. Filtrar el acceso a elementos
El direccionamiento de XPath también permite filtrar el conjunto de nodos o
información a la que se accede mediante la consulta utilizando condiciones en
nodos. El filtro se especifica mediante corchetes [ ] seguidos del nodo al que se le
aplica dicho filtro.
Podemos utilizar los siguientes operadores:
and Y lógico
or O lógico
12
not Negación
= Igual
!= Distinto
< Menor (<)
> Mayor (>)
<= Menor o igual (<=)
>= Mayor o igual (>=)
+ Suma
- Resta
* Multiplicación
div División
mod Resto de la división
| Unión de resultados
2.2.1. Funciones numéricas:
round() Redondeo round(3.14) = 3
abs() Valor absoluto abs(-7) = 7
floor() Redondeo inferior floor(7.3) = 7
ceiling Redondeo superior ceiling(7.3) = 8
2.2.2. Funciones de cadena
substring() Subcadena substring('TicArte', 1, 4) = TicA
starts-with() Cadena comienza por starts-with('XML', 'X') = true
ends-with() Cadena finaliza por ends-with('XML', 'X') = false
contains() Cadena contiene contains('XML', 'ML') = true
normalize-
space()
Espacios normalizados normalize-space(' Doc XML ') =
'Doc XML'
13
translate() Cambia caracteres en una
cadena
translate('Doc XML', 'Doc', 'File') =
'File XML'
string-length() Longitud de una cadena string-length('TicArte') = 7
upper-case() Cadena a mayúsculas upper-case('xml') = 'XML'
lower-case() Cadena a minúsculas lower-case('XML') = 'xml')
2.2.3. Funciones de posición de elementos
position() = n Nodo que se encuentra en la posición 'n'
elemento[n] Nodo en la posición 'n' de los que se llaman nodo
last() El último nodo de un conjunto
last() - i El último menos i nodos
2.2.4. Funciones que devuelven nodos
name() Nombre del nodo actual
root() Elemento raíz
node() Nodos descendientes del actual
comment() Comentarios del nodo
processing-instruction() Instrucciones de procesamiento
exist() Si existe el nodo o no
empty() Si el nodo está vacío o no
2.2.5. Funciones de agregado
count() Contar los nodos
avg() Media del contenido de los nodos
max() Valor máximo del contenido de los nodos
min() Valor mínimo del contenido nodos
sum() Suma del contenido de los nodos
14
A continuación exponemos una serie de ejemplos que ayuden a clarificar el uso
de filtros.
Mostrar todos los autores y publicadores. Utilizaremos el operador unión para
unir los dos conjuntos de nodos:
/bib/book/author|/bib/book/publisher Suponiendo que el documento XML tiene libros y diccionarios, podemos ver
todos los autores:
/bib/(book|dictionary)/author Mostrar el libro número 2:
/bib/book[2] /bib/book[position()=2] Mostrar del libro número 2 al número 5:
/bib/book[2 to 5] Mostrar el último libro:
/bib/book[last()] Mostrar los libros anteriores al año 2003. Los números no necesitan comillas.
/bib/book[year<2003] Mostrar los libros cuyo autor sea Stevens. Las cadenas deben ir siempre entre
comillas. Se muestran diferentes formas de conseguir lo mismo.
/bib/book[author="Stevens"] /bib[book/author="Stevens"]/book //author[.="Stevens"]/.. Mostrar el título de los libros cuyo autor sea Stevens. Hay que fijarse que la
condición va en el nodo book pero luego mostramos el nodo title que contiene.
/bib/book[author="Stevens"]/title Mostrar los títulos de los libros cuyo identificador sea el 2:
/bib/book[@id="2"]/title Mostrar los títulos de los libros de Stevens publicados en el 2002. Podemos
utilizar el operador and.
/bib/book[author="Stevens" and year=2002]/title
15
Mostrar los títulos de los libros de Stevens publicados en el 2002. Podemos
concatenar diferentes condiciones, cada una en sus corchetes, que es el mismo
significado que el operador and.
/bib/book[author="Stevens"][year=2002]/title Mostrar los títulos de los libros que comienzan por 'T':
/bib/book[starts-with(title,"T")] Mostrar los títulos de los libros que tengan una longitud de 20 caracteres:
/bib/book[string-length(title)>20]/title
2.3. Consultas XPath anidadas
Las consultas XPath anidadas consisten en incluir una consulta XPath que
devuelta un cierto valor dentro de la condición de otra consulta XPath.
Por ejemplo, mostrar todos los títulos de los libros del autor que escribió "TCP/IP
Illustrated". Si nos fijamos, en ningún caso nos están diciendo el nombre del autor,
por lo que tendremos que hacer una consulta previa para localizarlo. Los pasos
serían los siguientes:
1) Encontrar primero al autor del libro "TCP/IP Illustrated", pero mostrando sólo
el texto sin las etiquetas. Esta consulta nos devolverá Stevens.
/bib/book[title="TCP/IP Illustrated"]/author/text() 2) A continuación debemos encontrar todos los libros que escribió dicho autor,
en nuestro caso Stevens.
/bib/book[author="Stevens"]/title 3) Pero claro, la consulta anterior no es la correcta, porque no podemos usar el
nombre de Stevens. Tendremos que sustuir la consulta 1 dentro de la consulta 2,
pero eliminando las comillas dobles:
/bib/book[author=/bib/book[title="TCP/IP Illustrated"]/author/text()]/title
2.4. Sintaxis abreviada y compleja
Existen dos sintaxis diferentes a la hora de escribir consultas XPath:
Sintaxis abreviada: más sencilla y fácil de leer. Todos los ejemplos anteriores
corresponden a esta sintaxis.
16
Sintaxis compleja: más larga y compleja de leer. Utiliza los ejes para nombrar los
elementos.
2.5. Ejes
Los ejes son expresiones que permiten acceder a trozos del árbol XML
apoyándose en las relaciones de parentesco entre los nodos. En las siguientes
definiciones, el nodo de contexto se refiere al nodo al que se le está aplicando el eje.
self:: Devuelve el propio nodo de contexto. Equivale a .
child:: Devuelve los nodos hijo del nodo de contexto.
parent:: Devuelve el nodo padre del nodo de contexto. Equivale a ..
ancestor:: Devuelve los nodos antepasados (padre, abuelo, ...) del nodo de
contexto.
ancestor-or-
self::
Devuelve los nodos anteasados (padre, abuelo, ...) además del
propio nodo de contexto.
descendant::
Devuelve los nodos descendientes (hiejo, nieto, ...) del nodo de
contexto.
descendant-or-
self::
Devuelve los nodos descendientes (hijo, nieto, ...) además del
propio nodo de contexto. Equivale a //
following::
Devuelve los nodos que aparezcan después del nodo de contexto
en el documento, excluyendo a los nodos descendientes, los
atributos y los nodos de espacio de nombres.
preceding::
Devuelve los nodos que aparezcan antes del nodo de contexto en
el documento, excluyendo a los nodos ascendientes, los atributos
y los nodos de espacio de nombres.
following-
sibling::
Devuelve los hermanos menores del nodo de contexto.
preceding-
sibling::
Devuelve los hermanos mayores del nodo de contexto.
17
attribute:: Atributos del nodo de contexto.
namespace:: Espacio de nombres del nodo de contexto.
Ejemplos de sintaxis compleja
Para listar todos los títulos de los libros:
/child::bib/child::book/child::title /bib/book/title Para listar los hermanos menores del segundo autor:
/bib/book/author[2]/following-sibling::* Para listar los descendientes de elemento raíz en los que el nodo se llame year:
/bib/descendant::year /bib//year Otro documento XML para trabajar lo anterior formacionProfesional.xml:
<?xml version="1.0" encoding="UTF-8"?> <fp> <ciclos> <ciclo siglas="SMR"> <nombre>Sistemas microinformáticos y redes</nombre> <familiaProfesional>Informática y comunicaciones</familiaProfesional> <duracion unidad="horas">2000</duracion> <grado>Medio</grado> </ciclo> <ciclo siglas="DAM"> <nombre>Desarrollo de aplicaciones multiplataforma</nombre> <familiaProfesional>Informática y comunicaciones</familiaProfesional> <duracion unidad="horas">2000</duracion> <grado>Superior</grado> </ciclo> <ciclo siglas="DAW"> <nombre>Desarrollo de aplicaciones web</nombre> <familiaProfesional>Informática y comunicaciones</familiaProfesional> <duracion unidad="horas">2000</duracion> <grado>Superior</grado> </ciclo> <ciclo siglas="ASIR"> <nombre>Administrador de sistemas informaticos en red</nombre> <familiaProfesional>Informática y comunicaciones</familiaProfesional> <duracion unidad="horas">2000</duracion> <grado>Superior</grado> </ciclo> </ciclos> <modulos> <modulo codigo="0373"> <nombre>Lenguajes de marcas y sistemas de gestión de información</nombre>
18
<duracion unidad="horas">133</duracion> <curso>1</curso> <ciclos> <ciclo siglas="ASIR"/> <ciclo siglas="DAM"/> <ciclo siglas="DAW"/> </ciclos> </modulo> <modulo codigo="0222"> <nombre>Sistemas operativos monopuesto</nombre> <duracion unidad="horas">140</duracion> <curso>1</curso> <ciclos> <ciclo siglas="SMR"/> </ciclos> </modulo> </modulos> </fp>
Realizar las siguientes consultas XPath:
1. Nombre de ciclos formativos.
2. Duración de módulos profesionales.
3. Siglas de los ciclos formativos.
4. Todos los atributos de los módulos.
5. Descendientes de /fp, de nombre ciclo o modulo, que contenga un descendiente
directo nombre, cuyo valor se muestra.
6. Nombre de los ciclos cuyas siglas empiezan por D.
7. Todos los datos de ciclo que ocupa la segunda posición.
8. Todos los datos del último módulo.
9. Todos los nodos del árbol cuyo nombre tenga una longitud de ocho caracteres.
10. Nombre de los módulos que se cursan en tres ciclos.
11. Datos del módulo de código 0373.
12. Nombre de los ciclos de grado medio.
13. Duración de los módulos impartidos en el DAW.
14. Nombre de los ciclos cuyas siglas son ASIR o SMR
15. Datos del segundo módulo de la lista de los cursados en el primer curso.
16. Nombre de los ciclos en los que se cursen módulos de una duración de 135
horas o más.
17. Nombre de los módulos que tengan una duración mayor que la de “Lenguajes
de marcas y sistemas de gestión de información”. Con la función number() se
puede obtener el valor numérico de la duración, de lo contrario se haría la
comparación como cadenas. [number(duracion)]
19
2.6. Ejercicios XPath 2.6.1. Ejercicio 1 - Expresiones simples
Dado el siguiente documento XML, escriba las expresiones XPath que
devuelvan la respuesta deseada. <?xml version="1.0" encoding="UTF-8"?> <ies> <nombre>IES Abastos</nombre> <web>http://www.iesabastos.org</web> <ciclos> <ciclo id="ASIR"> <nombre>Administración de Sistemas Informáticos en Red</nombre> <grado>Superior</grado> <decretoTitulo año="2009" /> </ciclo> <ciclo id="DAW"> <nombre>Desarrollo de Aplicaciones Web</nombre> <grado>Superior</grado> <decretoTitulo año="2010" /> </ciclo> <ciclo id="SMR"> <nombre>Sistemas Microinformáticos y Redes</nombre> <grado>Medio</grado> <decretoTitulo año="2008" /> </ciclo> </ciclos> </ies> 1. Nombre del Instituto:
<nombre>IES Abastos</nombre>
2. Página web del Instituto: http://www.iesabastos.org
3. Nombre de los Ciclos Formativos: Administración de Sistemas Informáticos en Red Desarrollo de Aplicaciones Web Sistemas Microinformáticos y Redes
4. Siglas por las que se conocen los Ciclos Formativos: id="ASIR" id="DAW" id="SMR"
5. Años en los que se publicaron los decretos de título de los Ciclos
Formativos: año="2009" año="2010" año="2008"
20
6. Ciclos Formativos de Grado Medio (se trata de obtener el elemento <ciclo>
completo):
Nota: Resuelva este ejercicio de dos formas distintas, en un único paso de
búsqueda y en dos pasos de búsqueda. <ciclo id="SMR"> <nombre>Sistemas Microinformáticos y Redes</nombre> <grado>Medio</grado> <decretoTitulo año="2008"/> </ciclo>
7. Nombre de los Ciclos Formativos de Grado Superior:
Nota: Resuelva este ejercicio de dos formas distintas, en un único paso de
búsqueda y en dos pasos de búsqueda. <nombre>Administración de Sistemas Informáticos en Red</nombre> <nombre>Desarrollo de Aplicaciones Web</nombre>
8. Nombre de los Ciclos Formativos anteriores a 2010:
Nota: Resuelva este ejercicio de dos formas distintas, en un único paso de
búsqueda y en dos pasos de búsqueda. Administración de Sistemas Informáticos en Red Sistemas Microinformáticos y Redes
9. Nombre de los Ciclos Formativos de 2008 o 2010:
Nota: Resuelva este ejercicio de dos formas distintas, en un único paso de
búsqueda y en dos pasos de búsqueda. Desarrollo de Aplicaciones Web Sistemas Microinformáticos y Redes
2.6.2. Ejercicio 2 – Expresiones simples
Dado el siguiente documento XML, escriba las expresiones XPath que
devuelvan la respuesta deseada. <?xml version="1.0" encoding="UTF-8"?> <ies> <modulos> <modulo id="0228"> <nombre>Aplicaciones web</nombre> <curso>2</curso> <horasSemanales>4</horasSemanales> <ciclo>SMR</ciclo> </modulo> <modulo id="0372"> <nombre>Gestión de bases de datos</nombre> <curso>1</curso> <horasSemanales>5</horasSemanales> <ciclo>ASIR</ciclo>
21
</modulo> <modulo id="0373"> <nombre>Lenguajes de marcas y sistemas de gestión de información</nombre> <curso>1</curso> <horasSemanales>3</horasSemanales> <ciclo>ASIR</ciclo> <ciclo>DAW</ciclo> </modulo> <modulo id="0376"> <nombre>Implantación de aplicaciones web</nombre> <curso>2</curso> <horasSemanales>5</horasSemanales> <ciclo>ASIR</ciclo> </modulo> </modulos> </ies>
1. Nombre de los módulos que se imparten en el Instituto: Aplicaciones web
Gestión de bases de datos
Lenguajes de marcas y sistemas de gestión de información
Implantación de aplicaciones web
2. Nombre de los módulos del ciclo ASIR
Nota: Resuelva este ejercicio de dos formas distintas, en un único paso de
búsqueda y en dos pasos de búsqueda. Gestión de bases de datos
Lenguajes de marcas y sistemas de gestión de información
Implantación de aplicaciones web
3. Nombre de los módulos que se imparten en el segundo curso de cualquier
ciclo:
Nota: Resuelva este ejercicio de dos formas distintas, en un único paso de
búsqueda y en dos pasos de búsqueda. Aplicaciones web
Implantación de aplicaciones web
4. Nombre de los módulos de menos de 5 horas semanales:
Nota: Resuelva este ejercicio de dos formas distintas, en un único paso de
búsqueda y en dos pasos de búsqueda. Aplicaciones web
Lenguajes de marcas y sistemas de gestión de información
5. Nombre de los módulos que se imparten en el primer curso de ASIR:
Nota: Resuelva este ejercicio de dos formas distintas, en un único paso de
búsqueda y en dos pasos de búsqueda.
22
Gestión de bases de datos
Lenguajes de marcas y sistemas de gestión de información
6. Horas semanales de los módulos de más de 3 horas semanales:
Nota: Resuelva este ejercicio de dos formas distintas, en un único paso de
búsqueda y en dos pasos de búsqueda. 4
5
5
2.6.3. Ejercicio 3 – Expresiones anidadas Dado el siguiente documento XML, escriba las expresiones XPath que
devuelvan la respuesta deseada. <?xml version="1.0" encoding="UTF-8"?> <ies> <nombre>IES Abastos</nombre> <web>http://www.iesabastos.org</web> <ciclos> <ciclo id="ASIR"> <nombre>Administración de Sistemas Informáticos en Red</nombre> <grado>Superior</grado> <decretoTitulo año="2009" /> </ciclo> <ciclo id="DAW"> <nombre>Desarrollo de Aplicaciones Web</nombre> <grado>Superior</grado> <decretoTitulo año="2010" /> </ciclo> <ciclo id="SMR"> <nombre>Sistemas Microinformáticos y Redes</nombre> <grado>Medio</grado> <decretoTitulo año="2008" /> </ciclo> </ciclos> <modulos> <modulo id="0228"> <nombre>Aplicaciones web</nombre> <curso>2</curso> <horasSemanales>4</horasSemanales> <ciclo>SMR</ciclo> </modulo> <modulo id="0372"> <nombre>Gestión de bases de datos</nombre> <curso>1</curso> <horasSemanales>5</horasSemanales> <ciclo>ASIR</ciclo> </modulo> <modulo id="0373"> <nombre>Lenguajes de marcas y sistemas de gestión de información</nombre> <curso>1</curso>
23
<horasSemanales>3</horasSemanales> <ciclo>ASIR</ciclo> <ciclo>DAW</ciclo> </modulo> <modulo id="0376"> <nombre>Implantación de aplicaciones web</nombre> <curso>2</curso> <horasSemanales>5</horasSemanales> <ciclo>ASIR</ciclo> </modulo> </modulos> </ies> 1. Nombre de los módulos del ciclo "Sistemas Microinformáticos y Redes".
Nota: en la expresión final no deben aparecer las siglas SMR: Aplicaciones web
2. Nombre de los ciclos que incluyen el módulo "Lenguajes de marcas y
sistemas de gestión de información": Administración de Sistemas Informáticos en Red
Desarrollo de Aplicaciones Web
3. Nombre de los módulos de ciclos de Grado Superior: Gestión de bases de datos
Lenguajes de marcas y sistemas de gestión de información
Implantación de aplicaciones web
4. Nombre de los módulos de ciclos cuyo título se aprobó en 2008: Aplicaciones web
5. Grado de los ciclos con módulos de primer curso: Superior
Superior
24
3. XQuery.
3.1. Introducción
Se puede decir que XQuery es a XML lo mismo que SQL a las bases de datos
relacionales.
XQuery se basa en el lenguaje XPath para el acceso a los nodos XML, pudiendo
utilizar todos sus operadores y funciones. Se puede considerar a XQuery como
un súper conjunto de de XPath, ya que toda expresión XPath es una expresión
XQuery válida.
Se trata de una recomendación del W3C.
El lenguaje XQuery es muy amplio y complejo. Aquí sólo pretendemos hacer una
introducción a su uso para hacernos una idea de su potencial junto a
documentos XML.
Para todos los ejemplos siguientes vamos a tomar como referencia el siguiente
documento XML:
<?xml version="1.0" encoding="UTF-8"?> <bib> <book id="1"> <title>TCP/IP Illustrated</title> <author>Stevens</author> <publisher>Addison-Wesley</publisher> <year>2002</year> </book> <book id="2"> <title>Advanced Programming in the Unix Environment</title> <author>Stevens</author> <publisher>Addison-Wesley</publisher> <year>2004</year> </book> <book id="3"> <title>Data on the Web</title> <author>Abiteboul</author> <author>Buneman</author> <author>Suciu</author> <year>2006</year> </book> </bib>
3.2. Consultas FLWOR Las consultas XQuery se componen de cinco cláusulas, que debido a sus
iniciales se las conoce como FLWOR. Definimos cada una de ellas:
25
• FOR: Indica qué nodos se van a seleccionar desde la base de datos XML
o desde un documento XML.
• LET: Permite declarar variables a las que se le asignan valores.
• WHERE: Permite introducir condiciones que deben cumplir los nodos
seleccionados por la cláusula "for".
• ORDER BY: Permite ordenar los nodos antes de su visualización.
• RETURN: Devuelve los resultados. Es la única cláusula obligatoria.
3.2.1. Cláusula "for" y "return" Con la cláusula "for" recuperaremos una serie de nodos mediante una
consulta XPath y los introduciremos en una variable para poder utilizarla en
la cláusula "return". Hay que señalar que la cláusula "return" se ejecutará una
vez por cada nodo que devuelva la cláusula "for". for $book in /bib/book return $book/title En este caso el nodo "title" se imprime junto con las etiquetas: <title>TCP/IP Illustrated</title> <title>Advanced Programming in the Unix Environment</title> <title>Data on the Web</title>
Como no hemos indicado ningún documento tras "in" la consulta se lanzará
contra la base de datos que tengamos abierta en nuestro programa. El resto
de ejemplos del manual se realizarán de esta manera, pero si quisiéramos
lanzar la consulta contra un documento XML que no es una base de datos
podemos hacerlo usando "doc": for $book in doc("bib.xml")/bib/book return $book/title Si queremos imprimir nuestras propias etiquetas en la cláusula "return",
tendremos que encerrar la variable entre llaves { }: for $book in /bib/book return <titulo>{$book/title/text()}</titulo>
Obteniendo como resultado: <titulo>TCP/IP Illustrated</titulo> <titulo>Advanced Programming in the Unix Environment</titulo> <titulo>Data on the Web</titulo>
Podemos utilizar "at" dentro de la cláusula "for" para obtener una variable con
la numeración de los nodos que se van a recorrer:
26
for $book at $i in /bib/book return <titulo>({$i}) {$book/title/text()}</titulo>
Lo hemos utilizado para incluirlo dentro de la etiqueta "titulo": <titulo>(1) TCP/IP Illustrated</titulo> <titulo>(2) Advanced Programming in the Unix Environment</titulo> <titulo>(3) Data on the Web</titulo>
Si quisiéramos englobar todas las etiquetas anteriores en una superior,
tendríamos que encerrar la consulta completa entre llaves { } como vemos en
este ejemplo: <biblioteca> { for $book in /bib/book return <titulo>{$book/title/text()}</titulo> } </biblioteca>
Obteniendo la salida: <biblioteca> <titulo>TCP/IP Illustrated</titulo> <titulo>Advanced Programming in the Unix Environment</titulo> <titulo>Data on the Web</titulo> </biblioteca>
3.2.2. Cláusula "let"
La cláusula "let" nos va a permitir crear variables con cierto contenido. La
diferencia con "for" es que ésta sólo se ejecutaría una sola vez con la
cláusula "return". let $x := 7, $y :=3 return 10*$x*$y let $x := 7 let $y :=3 return 10*$x*$y
Ambas expresiones se evalúan a 210
La cláusula "let" asigna las variables mediante los caracteres ":=". Si el
ejemplo anterior lo realizáramos con "let": let $book := /bib/book return <titulo>{$book/title}</titulo>
Podemos observar como la etiqueta "titulo" sólo aparece una vez, es decir,
no se repite para cada nodo como en el caso de la cláusula "for". <titulo> <title>TCP/IP Illustrated</title> <title>Advanced Programming in the Unix Environment</title> <title>Data on the Web</title> </titulo>
27
La clasula "let" nos va a permitir utilizar funciones de agrupación, como
calcular la media, la suma, contar, etc. Estas son las mismas funciones que
las que se utilizan en el leguaje XPath y que podéis repasar aquí. Podemos
por ejemplo buscar el año más alto que exista mediante la función "max"
para ver el último libro que se ha escrito: let $book := /bib/book return <last_year>{max($book/year)}</last_year>
Y la salida sería: <last_year>2006</last_year>
3.2.3. Cláusula "for" y "let" Podemos combinar las cláusulas "for" y "let". De esta manera conseguimos
que la clasula "let" se ejecute una vez por cada nodo, al igual que hace la
clasula "return". Por ejemplo, si queremos contar el número de autores que
tiene cada libro podemos utilizar la siguiente consulta: for $book in /bib/book let $autores := count($book/author) return <libro> <titulo>{$book/title/text()}</titulo> <autores>{$autores}</autores> </libro>
Lo que conseguimos es que para cada nodo que pasa por la cláusula "for"
utilicemos "let" para incluir en la variable "$autores" la cuenta de nodos
"author" de dicho libro que tenemos en la variable "$book", consiguiendo el
siguiente resultado: <libro> <titulo>TCP/IP Illustrated</titulo> <autores>1</autores> </libro> <libro> <titulo>Advanced Programming in the Unix Environment</titulo> <autores>1</autores> </libro> <libro> <titulo>Data on the Web</titulo> <autores>3</autores> </libro>
Aunque este mismo caso también lo podríamos realizar sin utilizar la cláusula
"let": for $book in /bib/book return
28
<libro> <titulo>{$book/title/text()}</titulo> <autores>{count($book/author)}</autores> </libro>
3.2.4. Cláusula "where" Con la cláusula "where" podemos filtrar los nodos que se seleccionan en la
cláusula "for", para ello también podemos utilizar los mismos operadores y
funciones que en el leguaje XPath. MUY IMPORTANTE, la cláusula "where"
NO filtraría los nodos si los estamos obteniendo con "let". Por ejemplo
podemos buscar los títulos de un determinado autor: for $book in /bib/book where $book/author = "Stevens" return $book/title
Y el resultado sería: <title>TCP/IP Illustrated</title> <title>Advanced Programming in the Unix Environment</title>
La misma consulta anterior se podría realizar de igual manera filtrando los
nodos en la consulta XPath sin tener que utilizar la cláusula "where": for $book in /bib/book[author = "Stevens"] return $book/title
Un ejemplo más con la cláusula "where" utilizando una función: for $book in /bib/book where starts-with($book/title, "T") return $book/author
3.2.5. Cláusula "order by" Con la cláusula "order by" podemos ordenar los nodos antes de que empiece
a ejecutarse la cláusula "return", ya que como sabemos, la salida será la
misma que el orden que tengan los nodos en el documento o base de datos
XML: for $book in /bib/book order by $book/title return $book/title
Obteniendo la salida: <title>Advanced Programming in the Unix Environment</title> <title>Data on the Web</title> <title>TCP/IP Illustrated</title>
3.2.6. Otros ejemplos de funciones y operadores
29
La función "distinct-values" nos permite dentro de la cláusula "for" o "let"
seleccionar sólo los nodos que tengan valores diferentes. Pero hay que tener
en cuenta que los devuelve sin sus etiquetas, como si usáramos "/text()": for $autor in distinct-values(/bib/book/author) return $autor
El operador "except" nos permite eliminar nodos de la salida de la consulta,
pero para ello es obligatorio utilizar "/*" en el nodo donde vayamos a utilizarlo
como vemos en el ejemplo. En este caso también se devuelve el libro sin
etiquetas, de ahí que le hayamos incluido nosotros nuestras propias
etiquetas en el "return": for $book in /bib/book return <libro>{$book/* except $book/year except $book/author}</libro>
3.3. Ejercicios 3.3.1. Bloque de consultas XQuery 1
Dado el siguiente documento XML realiza las siguientes consultas con XQuery
(se eliminan las tildes para evitar problemas de compatibilidad de caracteres): <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book> <book category="WEB"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore>
30
1. Mostrar los títulos de los libros con la etiqueta "titulo".
2. Mostrar los libros cuyo precio sea menor o igual a 30. Primero incluyendo la
condición en la cláusula "where" y luego en la ruta del XPath.
3. Mostrar sólo el título de los libros cuyo precio sea menor o igual a 30.
4. Mostrar sólo el título sin atributos de los libros cuyo precio sea menor o igual
a 30.
5. Mostrar el título y el autor de los libros del año 2005, y etiquetar cada uno de
ellos con "lib2005".
6. Mostrar los años de publicación, primero con "for" y luego con "let" para
comprobar la diferencia entre ellos. Etiquetar la salida con "publicacion".
7. Mostrar los libros ordenados primero por "category" y luego por "title" en una
sola consulta.
8. Mostrar cuántos libros hay, y etiquetarlo con "total".
9. Mostrar los títulos de los libros y al final una etiqueta con el número total de
libros.
10. Mostrar el precio mínimo y máximo de los libros.
11. Mostrar el título del libro, su precio y su precio con el IVA incluido, cada uno
con su propia etiqueta. Ordénalos por precio con IVA.
12. Mostrar la suma total de los precios de los libros con la etiqueta "total".
13. Mostrar cada uno de los precios de los libros, y al final una nueva etiqueta
con la suma de los precios.
14. Mostrar el título y el número de autores que tiene cada título en etiquetas
diferentes.
15. Mostrar en la misma etiqueta el título y entre paréntesis el número de autores
que tiene ese título.
16. Mostrar los libros escritos en años que terminen en "3".
31
17. Mostrar los libros cuya categoría empiece por "C".
18. Mostrar los libros que tengan una "X" mayúscula o minúscula en el título.
19. Mostrar el título y el número de caracteres que tiene cada título, cada uno
con su propia etiqueta.
20. Mostrar todos los años en los que se ha publicado un libro eliminando los
repetidos. Etiquétalos con "año".
21. Mostrar todos los autores eliminando los que se repiten y ordenados por el
número de caracteres que tiene cada autor.
Soluciones:
1. Mostrar los títulos de los libros con la etiqueta "titulo". for $titulo in /bookstore/book/title/text() return <titulo>{$titulo}</titulo>
2. Mostrar los libros cuyo precio sea menor o igual a 30. Primero incluyendo
la condición en la cláusula "where" y luego en la ruta del XPath. for $libro in /bookstore/book where $libro/price <= 30 return $libro
for $libro in /bookstore/book[price<=30] return $libro
3. Mostrar sólo el título de los libros cuyo precio sea menor o igual a 30. for $libro in /bookstore/book where $libro/price <= 30 return $libro/title
for $libro in /bookstore/book[price<=30] return $libro/title
4. Mostrar sólo el título sin atributos de los libros cuyo precio sea menor o
igual a 30. for $libro in /bookstore/book[price<=30] return <title>{$libro/title/text()}</title>
5. Mostrar el título y el autor de los libros del año 2005, y etiquetar cada uno
de ellos con "lib2005". for $libro in /bookstore/book where $libro/year=2005
32
return <lib2005>{$libro/title,$libro/author}</lib2005> for $libro in /bookstore/book where $libro/year=2005 return <lib2005>{$libro/title}{$libro/author}</lib2005> 6. Mostrar los años de publicación, primero con "for" y luego con "let" para
comprobar la diferencia entre ellos. Etiquetar la salida con "publicacion". for $year in /bookstore/book/year return <publicacion>{$year}</publicacion> let $year := /bookstore/book/year return <publicacion>{$year}</publicacion> 7. Mostrar los libros ordenados primero por "category" y luego por "title" en
una sola consulta. for $libro in /bookstore/book order by $libro/@category,$libro/title return $libro
8. Mostrar cuántos libros hay, y etiquetarlo con "total". let $num_libro := count(/bookstore/book) return <total>{$num_libro}</total>
9. Mostrar los títulos de los libros y al final una etiqueta con el número total
de libros. let $total := count (/bookstore/book), $titulos := ( for $libro in /bookstore/book/title return <titulo>{$libro/text()}</titulo>) return <resultado> {$titulos} <total_libros>{$total}</total_libros> </resultado>
10. Mostrar el precio mínimo y máximo de los libros. let $max := max(/bookstore/book/price), $min := min(/bookstore/book/price) return <resultado> <max>{$max}</max> <min>{$min}</min> </resultado>
11. Mostrar el título del libro, su precio y su precio con el IVA incluido, cada
uno con su propia etiqueta. Ordénalos por precio con IVA. for $libro in /bookstore/book let $precio_iva := ($libro/price * 1.21) order by $precio_iva return
33
<libro> <titulo>{$libro/title/text()}</titulo> <precio>{$libro/price/text()} €</precio> <precio_iva>{$precio_iva} €</precio_iva> </libro> for $libro in /bookstore/book order by $libro/price * 1.21 return <libro> <titulo>{$libro/title/text()}</titulo> <precio>{$libro/price/text()} €</precio> <precio_iva>{$libro/price * 1.21} €</precio_iva> </libro>
12. Mostrar la suma total de los precios de los libros con la etiqueta "total". let $libros := /bookstore/book return <total>{sum($libros/price)}</total>
13. Mostrar cada uno de los precios de los libros, y al final una nueva etiqueta
con la suma de los precios. <libros> { for $libros in /bookstore/book return $libros/price } { let $libros := /bookstore/book return <total>{sum($libros/price)}</total> } </libros> 14. Mostrar el título y el número de autores que tiene cada título en etiquetas
diferentes. for $libros in /bookstore/book return <libro> {$libros/title} <autores>{count($libros/author)}</autores> </libro>
15. Mostrar en la misma etiqueta el título y entre paréntesis el número de
autores que tiene ese título. for $libros in /bookstore/book return <libro>{$libros/title/text()} ({count($libros/author)})</libro>
16. Mostrar los libros escritos en años que terminen en "3". for $libros in /bookstore/book where ends-with($libros/year, "3") return $libros for $libros in /bookstore/book[ends-with(year, "3")] return $libros
34
17. Mostrar los libros cuya categoría empiece por "C". for $libros in /bookstore/book where starts-with($libros/@category, "C") return $libros
for $libros in /bookstore/book[starts-with(@category, "C")] return $libros 18. Mostrar los libros que tengan una "X" mayúscula o minúscula en el título. for $libros in /bookstore/book where contains(lower-case($libros/title), "t") return $libros for $libros in /bookstore/book[contains(lower-case(title), "x")] return $libros 19. Mostrar el título y el número de caracteres que tiene cada título, cada uno
con su propia etiqueta. for $libros in /bookstore/book return <libro> {$libros/title} <length>{string-length($libros/title)}</length> </libro>
20. Mostrar todos los años en los que se ha publicado un libro eliminando los
repetidos. Etiquétalos con "año". for $años in distinct-values(/bookstore/book/year) return <año>{$años}</año>
21. Mostrar todos los autores eliminando los que se repiten y ordenados por
el número de caracteres que tiene cada autor. for $autores in distinct-values(/bookstore/book/author) order by string-length($autores) return <autor>{$autores}</autor> Mostrar los títulos en una tabla de HTML. <table> { for $libros in /bookstore/book return <tr> <td>{$libros/title/text()}</td> </tr> } </table>
3.3.2. Bloque de consultas XQuery 2 Dado el siguiente documento XML realiza las siguientes consultas con XQuery
(se eliminan las tildes para evitar problemas de compatibilidad de caracteres):
35
<?xml version="1.0" encoding="UTF-8"?> <bailes> <baile id="1"> <nombre>Tango</nombre> <precio cuota="mensual" moneda="euro">27</precio> <plazas>20</plazas> <comienzo>1/1/2011</comienzo> <fin>1/12/2011</fin> <profesor>Roberto Garcia</profesor> <sala>1</sala> </baile> <baile id="2"> <nombre>Cha-cha-cha</nombre> <precio cuota="trimestral" moneda="euro">80</precio> <plazas>18</plazas> <comienzo>1/2/2011</comienzo> <fin>31/7/2011</fin> <profesor>Miriam Gutierrez</profesor> <sala>1</sala> </baile> <baile id="3"> <nombre>Rock</nombre> <precio cuota="mensual" moneda="euro">30</precio> <plazas>15</plazas> <comienzo>1/3/2011</comienzo> <fin>1/12/2011</fin> <profesor>Laura Mendiola</profesor> <sala>1</sala> </baile> <baile id="4"> <nombre>Merengue</nombre> <precio cuota="trimestral" moneda="dolares">75</precio> <plazas>12</plazas> <comienzo>1/1/2011</comienzo> <fin>1/12/2011</fin> <profesor>Jesus Lozano</profesor> <sala>2</sala> </baile> <baile id="5"> <nombre>Salsa</nombre> <precio cuota="mensual" moneda="euro">32</precio> <plazas>10</plazas> <comienzo>1/5/2011</comienzo> <fin>1/12/2011</fin> <profesor>Jesus Lozano</profesor> <sala>2</sala> </baile> <baile id="6"> <nombre>Pasodoble</nombre> <precio cuota="anual" moneda="euro">320</precio> <plazas>8</plazas> <comienzo>1/1/2011</comienzo> <fin>31/12/2011</fin> <profesor>Miriam Gutierrez</profesor> <sala>1</sala> </baile>
36
</bailes> 1. Mostrar cada uno de los nombres de los bailes con la etiqueta "losbailes".
2. Mostrar los nombres de los bailes seguidos con el número de plazas entre
paréntesis, ambos dentro de la misma etiqueta "losbailes".
3. Mostrar los nombres de los bailes cuyo precio sea mayor de 30.
4. Mostrar los nombres de los bailes cuyo precio sea mayor de 30 y la moneda
"euro".
5. Mostrar los nombres y la fecha de comienzo de los bailes que comiencen el
mes de enero (utiliza para buscarlo la cadena de texto "/1/").
6. Mostrar los nombres de los profesores y la sala en la que dan clase,
ordénalos por sala.
7. Mostrar los nombres de los profesores eliminando los repetidos y acampañar
cada nombre con todas las salas en la que da clase, ordénalos por nombre.
8. Mostrar la media de los precios de todos los bailes.
9. Mostrar la suma de los precios de los bailes de la sala 1.
10. Mostrar cuántas plazas en total oferta el profesor "Jesus Lozano".
11. Mostrar el dinero que ganaría la profesora "Laura Mendiola" si se
completaran todas las plazas de su baile, sabiendo que sólo tiene un baile.
12. Mostrar el dinero que ganaría el profesor "Jesus Lozano" si se completaran
todas las plazas de su baile, pero mostrando el beneficio de cada baile por
separado.
13. Mostrar el dinero que ganaría la profesora "Laura" (no conocemos su
apellido) si se completaran todas las plazas de su baile.
14. Mostrar el nombre del baile, su precio y el precio con un descuento del 15%
para familias numerosas. Ordenar por el nombre del baile
15. Mostrar todos los datos de cada baile excepto la fecha de comienzo y de fin.
37
16. Mostrar en una tabla de HTML los nombres de los bailes y su profesor, cada
uno en una fila. Soluciones: 1. Mostrar cada uno de los nombres de los bailes con la etiqueta "losbailes". for $baile in /bailes/baile return <losbailes>{$baile/nombre/text()}</losbailes>
2. Mostrar los nombres de los bailes seguidos con el número de plazas entre
paréntesis, ambos dentro de la misma etiqueta "losbailes". for $baile in /bailes/baile return <losbailes>{$baile/nombre/text()} ({$baile/plazas/text()})</losbailes>
3. Mostrar los nombres de los bailes cuyo precio sea mayor de 30. for $baile in /bailes/baile where $baile/precio > 30 return $baile/nombre for $baile in /bailes/baile[precio > 30] return $baile/nombre
4. Mostrar los nombres de los bailes cuyo precio sea mayor de 30 y la
moneda "euro". for $baile in /bailes/baile where $baile/precio > 30 and $baile/precio/@moneda = "euro" return $baile/nombre for $baile in /bailes/baile[precio > 30 and precio/@moneda = "euro"] return $baile/nombre
5. Mostrar los nombres y la fecha de comienzo de los bailes que comiencen
el mes de enero (utiliza para buscarlo la cadena de texto "/1/"). for $baile in /bailes/baile where contains($baile/comienzo, "/1/") return <baile> {$baile/profesor} {$baile/comienzo} </baile>
6. Mostrar los nombres de los profesores y la sala en la que dan clase,
ordénalos por sala. for $baile in /bailes/baile order by $baile/sala return <baile> {$baile/profesor} {$baile/sala} </baile>
38
7. Mostrar los nombres de los profesores eliminando los repetidos y
acampañar cada nombre con todas las salas en la que da clase,
ordénalos por nombre. for $profesor in distinct-values(/bailes/baile/profesor) let $salas := /bailes/baile[profesor=$profesor]/sala order by $profesor return <profesores> <nombre>{$profesor}</nombre> {$salas} </profesores>
8. Mostrar la media de los precios de todos los bailes. let $baile := /bailes/baile return <media>{avg($baile/precio)}</media>
9. Mostrar la suma de los precios de los bailes de la sala 1. let $baile := /bailes/baile[sala=1] return <total_sala_1>{sum($baile/precio)}</total_sala_1>
10. Mostrar cuántas plazas en total oferta el profesor "Jesus Lozano". let $baile := /bailes/baile[profesor = "Jesus Lozano"] return <plazas>{sum($baile/plazas)}</plazas>
11. Mostrar el dinero que ganaría la profesora "Laura Mendiola" si se
completaran todas las plazas de su baile, sabiendo que sólo tiene un
baile. let $baile := /bailes/baile[profesor = "Laura Mendiola"] return $baile/plazas * $baile/precio
12. Mostrar el dinero que ganaría el profesor "Jesus Lozano" si se
completaran todas las plazas de su baile, pero mostrando el beneficio de
cada baile por separado. for $baile in /bailes/baile where $baile/profesor = "Jesus Lozano" return <beneficio>{$baile/plazas * $baile/precio}</beneficio>
13. Mostrar el dinero que ganaría la profesora "Laura" (no conocemos su
apellido) si se completaran todas las plazas de su baile. for $baile in /bailes/baile where starts-with($baile/profesor, "Laura") return <beneficio>{$baile/plazas * $baile/precio}</beneficio> for $baile in /bailes/baile[starts-with(profesor, "Laura")] return <beneficio>{$baile/plazas * $baile/precio}</beneficio>
39
14. Mostrar el nombre del baile, su precio y el precio con un descuento del
15% para familias numerosas. Ordenar por el nombre del baile for $baile in /bailes/baile order by $baile/nombre return <baile> {$baile/nombre} <precio>{$baile/precio/text()}</precio> <fam_numerosa>{$baile/precio * 0.85}</fam_numerosa> </baile>
15. Mostrar todos los datos de cada baile excepto la fecha de comienzo y de
fin. for $baile in /bailes/baile return <baile>{$baile/* except $baile/comienzo except $baile/fin}</baile>
16. Mostrar en una tabla de HTML los nombres de los bailes y su profesor,
cada uno en una fila. <table> { for $baile in /bailes/baile return <tr><td>{$baile/nombre/text()}</td><td>{$baile/profesor/text()}</td></tr> } </table>
40
4. Bibliografía • Rafa Morales, educación, ciclos formativos, Lenguaje de marcas y sistemas de
gestión de la información. ". Licencia CC BY-CN-SA. http://www.ticarte.com/
• w3schools.com, “XPath Tutorial, XQuery Tutorial”.
http://www.w3schools.com/xsl/default.asp
• Castro Ramos, Juan Manuel y Rodríguez Sánchez, José Ramón. “Lenguajes de
Marcas y Sistemas de Gestión de Información”. Editorial Garceta. Madrid 2012.
ISBN 978-84-1545-217-1
• Sintes Marco, Bartolomé. "Qué es el XML" y "XPath" del curso "XML: Lenguaje de
Marcas Extensible Licencia". Licencia CC BY-CN-SA. http://www.mclibre.org/
41