41
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

Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

Embed Size (px)

Citation preview

Page 1: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 2: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 3: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 4: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 5: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 6: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

<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

Page 7: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 8: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 9: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 10: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 11: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 12: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 13: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

not Negación

= Igual

!= Distinto

< Menor (&lt;)

> Mayor (&gt;)

<= Menor o igual (&lt;=)

>= Mayor o igual (&gt;=)

+ 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

Page 14: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 15: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 16: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 17: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 18: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 19: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

<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

Page 20: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 21: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 22: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

</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

Page 23: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 24: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

<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

Page 25: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 26: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

• 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

Page 27: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 28: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 29: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

<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

Page 30: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 31: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 32: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 33: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 34: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

<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

Page 35: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 36: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

<?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

Page 37: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

</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

Page 38: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 39: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 40: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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

Page 41: Ciclo Formativo de Grado Superior en Administración y … · Ciclo Formativo de Grado Superior en Administración y de Sistemas Informáticos en Red . IES Valle del Cidacos – Calahorra

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