COMPARTE ESTE ARTÍCULO

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 pais obligatorio.
    • Opcionalmente, un atributo codigo para 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).
  • Las obras tendrán:
    • Atributo autor obligatorio, que coincidirá con algún id de los músicos.
    • Atributo genero opcional, cuyos valores válidos serán: oratorio, ópera, sinfonía o concierto. Si no se indica, se asumirá que es concierto.
    • El contenido de <obra> será el título de la pieza.

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:

  1. Obtener cuántas obras hay con el título “La Traviata”.
  2. Averiguar el año de fallecimiento del autor de la última obra que aparece en el documento.
  3. Listar el nombre (contenido textual) de las obras cuyos autores sean de Alemania.
  4. 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:text y xsl: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>.
  • id de artistas y discográficas es obligatorio y único.
  • Nombre y nacionalidad de artistas y discográficas son obligatorios.
  • Los <disco> tendrán:
    • titulo obligatorio.
    • precio y año obligatorios.
    • 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 moneda con 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:

  1. Nombres de los artistas que tengan algún CD posterior al año 2001.
  2. Nombre de la discográfica que edita el CD titulado “Malamarsimo”.
  3. Títulos de los CDs que no tengan autor de nacionalidad española.
  4. 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

Acceso de usuarios existentes
   
Registro de un nuevo usuario
*Campo necesario

Categories:

Tags:

Comments are closed

Estado de acceso
ESTADO DE ACCESO
TRADUCTORES
COMPARTENOS
Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert
error: CONTENIDO PROTEGIDO