En esta entrada recopilamos una serie de actividades completas para practicar a fondo XML, DTD, XPath y XSLT. Están pensadas para ciclos formativos de informática y se pueden trabajar tanto en el aula como en casa, de forma individual o en parejas.
La idea es que el alumnado se acostumbre a:
- Diseñar y validar documentos XML con DTD externo.
- Formular consultas XPath algo más elaboradas.
- Construir transformaciones XSLT que generen salidas legibles (HTML o XML).
1. Fichero de músicos y obras clásicas
1.1. Documento XML base
Se propone un documento musicos.xml con la siguiente estructura general:
<?xml version="1.0" encoding="UTF-8"?>
<musica>
<musico id="Beethoven" pais="Alemania">
Ludwig van Beethoven
<nacido>1770</nacido>
<fallecido>1827</fallecido>
</musico>
<musico id="Verdi" pais="Italia">
Giuseppe Verdi
<nacido>1813</nacido>
<fallecido>1901</fallecido>
</musico>
<!-- Más músicos -->
<obra autor="Vivaldi" genero="concierto">Las cuatro estaciones</obra>
<obra autor="Bach" genero="oratorio">Pasión según San Mateo</obra>
<obra autor="Mozart" genero="ópera">La flauta mágica</obra>
<obra autor="Mozart" genero="concierto">Concierto para piano nº 27</obra>
<obra autor="Beethoven" genero="sinfonía">Novena sinfonía</obra>
<obra autor="Verdi" genero="ópera">La Traviata</obra>
<obra autor="Beethoven" genero="concierto">Concierto para piano nº 5</obra>
</musica>
Se puede ampliar con más autores, países y obras.
1.2. Diseño de DTD externo
Actividad sugerida: crear un DTD externo (musicos.dtd) que garantice, entre otras cosas:
- El elemento raíz será siempre
<musica>. - Dentro de
<musica>deben aparecer, en este orden, uno o más elementos<musico>y a continuación uno o más elementos<obra>. - Cada
<musico>contendrá:- Un identificador obligatorio y único (
id). - Un atributo
paisobligatorio. - Opcionalmente, un atributo
codigopara el país. - Contenido mixto con el nombre del músico y los elementos hijos
<nacido>y<fallecido>(la fecha de nacimiento es obligatoria; la de fallecimiento puede ser opcional o permitir que esté vacía si sigue vivo).
- Un identificador obligatorio y único (
- Las obras tendrán:
- Atributo
autorobligatorio, que coincidirá con algúnidde los músicos. - Atributo
generoopcional, cuyos valores válidos serán:oratorio,ópera,sinfoníaoconcierto. Si no se indica, se asumirá que esconcierto. - El contenido de
<obra>será el título de la pieza.
- Atributo
Ejemplo de esqueleto de DTD:
<!ELEMENT musica (musico+, obra+)>
<!ELEMENT musico (#PCDATA, nacido, fallecido?)>
<!ATTLIST musico
id ID #REQUIRED
pais CDATA #REQUIRED
codigo CDATA #IMPLIED>
<!ELEMENT nacido (#PCDATA)>
<!ELEMENT fallecido (#PCDATA)>
<!ELEMENT obra (#PCDATA)>
<!ATTLIST obra
autor IDREF #REQUIRED
genero (oratorio | ópera | sinfonía | concierto) "concierto">
Se puede pedir al alumnado que valide el XML con herramientas como xmllint o cualquier editor que soporte validación DTD.
1.3. Consultas XPath sugeridas
Con el mismo XML de músicos y obras, se pueden plantear consultas XPath como las siguientes:
- Obtener cuántas obras hay con el título “La Traviata”.
- Averiguar el año de fallecimiento del autor de la última obra que aparece en el documento.
- Listar el nombre (contenido textual) de las obras cuyos autores sean de Alemania.
- Mostrar las fechas de nacimiento de los músicos que tengan alguna obra de género concierto en la que se use el piano (se puede suponer que el título contiene la palabra “piano”).
Ejemplos de expresiones XPath orientativas:
//obra[text()="La Traviata"]
//obra[last()]/@autor
//musico[@pais="Alemania"]
//musico[ @id = //obra[contains(., "piano") and @genero="concierto"]/@autor ]/nacido
El objetivo es que el alumnado razone cómo combinar condiciones, filtros por atributos y funciones como last() o contains().
1.4. Transformación XSLT (biografías breves)
Se propone un documento XSLT que genere un listado sencillo de biografías de los músicos. La salida podría ser HTML o un XML intermedio, por ejemplo:
<?xml version="1.0" encoding="UTF-8"?>
<biografias>
<p>Antonio Vivaldi nació en Italia en 1678 y murió en 1741.</p>
<p>Johann Sebastian Bach nació en Alemania en 1685 y murió en 1750.</p>
<p>Wolfgang Amadeus Mozart nació en Austria en 1756 y murió en 1791.</p>
<p>Ludwig van Beethoven nació en Alemania en 1770 y murió en 1827.</p>
<p>Giuseppe Verdi nació en Italia en 1813 y murió en 1901.</p>
</biografias>
Pautas para el alumnado:
- Crear una plantilla raíz que recorra todos los
<musico>. - Usar los valores de
@pais,<nacido>y<fallecido>para construir las frases. - Controlar el formato del texto con
xsl:textyxsl:value-of.
2. Tienda de discos en XML
2.1. Escenario propuesto
Se plantea un segundo documento XML, por ejemplo tiendadiscos.xml, con esta idea general:
- La tienda contiene artistas, discográficas y cds.
- Estos elementos pueden aparecer en cualquier orden dentro del elemento raíz.
- Tiene que existir al menos un artista y al menos una discográfica.
Esquema orientativo:
<?xml version="1.0" encoding="UTF-8"?>
<musica>
<discos>
<disco titulo="Bad Jean" precio="15" año="2000">
<autor>A-1</autor>
<discografica>D-2</discografica>
</disco>
<disco titulo="Rock and Ríos" precio="12" año="1982">
<autor>A-2</autor>
<discografica>D-3</discografica>
</disco>
<disco titulo="Malamarsimo" precio="10.90" año="2008">
<autor>A-3</autor>
<discografica>D-3</discografica>
</disco>
<!-- Más discos -->
</discos>
<cantantes>
<artista id="A-1" nombre="Carlos Jean" nacionalidad="España"/>
<artista id="A-2" nombre="Miguel Ríos" nacionalidad="España"/>
<artista id="A-3" nombre="La Mala" nacionalidad="España"/>
<artista id="A-4" nombre="Etta James" nacionalidad="USA"/>
</cantantes>
<discograficas>
<discografica id="D-1" nombre="Sello Uno" nacionalidad="España"/>
<discografica id="D-2" nombre="Sello Dos" nacionalidad="USA"/>
<discografica id="D-3" nombre="Sello Tres" nacionalidad="España"/>
</discograficas>
</musica>
Este modelo se puede modificar para adaptarlo al nivel del grupo.
2.2. Definición de DTD
Actividad sugerida: construir un DTD externo que cumpla los siguientes requisitos:
- Debe existir al menos un
<artista>y al menos una<discografica>. idde artistas y discográficas es obligatorio y único.- Nombre y nacionalidad de artistas y discográficas son obligatorios.
- Los
<disco>tendrán:tituloobligatorio.precioyañoobligatorios.- Un elemento
<autor>cuyo valor haga referencia a un artista. - Una
<discografica>cuyo valor haga referencia a una discográfica.
- El precio podría tener un atributo opcional
monedacon valores (euro,dólar,libra).
Con esta actividad se refuerzan los tipos de contenido, los atributos, el uso de ID/IDREF y la obligatoriedad u opcionalidad.
2.3. Consultas XPath sobre la tienda de discos
Algunas consultas posibles:
- Nombres de los artistas que tengan algún CD posterior al año 2001.
- Nombre de la discográfica que edita el CD titulado “Malamarsimo”.
- Títulos de los CDs que no tengan autor de nacionalidad española.
- Nombres de las discográficas con las que ha publicado algún CD el autor “Miguel Ríos”.
Ejemplos orientativos de XPath (a adaptar al XML definitivo):
//artista[@id = //disco[@año > 2001]/autor]/@nombre
//discograficas/discografica[@id = //disco[@titulo="Malamarsimo"]/discografica]/@nombre
//disco[not(autor = //artista[@nacionalidad="España"]/@id)]/@titulo
//discograficas/discografica[@id = //disco[autor = //artista[@nombre="Miguel Ríos"]/@id]/discografica]/@nombre
El objetivo es fomentar el pensamiento relacional entre distintas ramas del árbol XML.
2.4. Transformación XSLT (catálogo de discos)
Propuesta de transformación XSLT para generar un catálogo de discos a partir del XML:
Salida esperada (en XML sencillo):
<?xml version="1.0" encoding="UTF-8"?>
<catalogo>
<disco>
<titulo>Bad Jean</titulo>
<precio>15</precio>
<año>2000</año>
<autor>Carlos Jean</autor>
<discografica>Sello Dos</discografica>
</disco>
<!-- resto de discos -->
</catalogo>
Aspectos clave para el alumnado:
- Recorrer cada
<disco>y recuperar el nombre del artista y de la discográfica mediante XPath desde XSLT. - Practicar el uso de variables (
<xsl:variable>) para almacenar temporalmente el identificador del autor o de la discográfica. - Decidir si la salida será XML (como en el ejemplo) o directamente HTML para mostrar el catálogo en una tabla.
Contenido restringido
Comments are closed