Anexo: Ejercicios DTDs

Peso simple

Crear una DTD que compruebe simplemente que el elemento raíz es peso y con un atributo «unidad» (el atributo es obligatorio). Es decir, la DTD debería validar este fichero:

<peso unidad="kg">20</peso>

La solución puede ser algo así:

<!ELEMENT peso  (#PCDATA)>
<!ATTLIST peso unidad CDATA #REQUIRED>

Lista de productos

Se desea controlar un formato como el siguiente:

  • El elemento raíz se llama «listaarticulos».

  • El elemento raíz puede llevar un atributo fecha.

  • Dentro de listaarticulos hay 0 o muchos articulos.

  • Todo artículo debe llevar un atributo id.

  • Los artículos no se desglosan más, solo son texto.

Comprobar con un fichero como el siguiente:

<listaarticulos fecha="29-01-2021">
    <articulo id="00A"> PC    </articulo>
    <articulo id="00A"> Ratón </articulo>
</listaarticulos>

Catálogo de productos

En una empresa desean almacenar su catálogo de productos en XML. Se ha definido este fichero canónico.

<catalogo>
    <!--El catalogo lleva uno o más elementos producto-->
    <producto> <!--Producto puede tener un atributo codigo-->
        <nombre>Caja con autocierre</nombre>
        <!--La descripción es optativa-->
        <descripcion>Caja de seguridad...</descripcion>
    </producto>
    <producto codigo="jjjjj">
        <nombre>Caja llaves</nombre>
    </producto>
</catalogo>

La solución:

<!ELEMENT catalogo    (producto)+>
<!ELEMENT producto    (nombre, descripcion?)>
<!ATTLIST producto    codigo CDATA #IMPLIED>
<!ELEMENT nombre      (#PCDATA)>
<!ELEMENT descripcion (#PCDATA)>

Catalogo (versión v2)

En una empresa desean almacenar su catálogo de productos en XML. Se ha definido este fichero canónico.

<catalogo>
    <!--El catalogo lleva uno o más elementos producto-->
    <producto> <!--Producto puede tener un atributo codigo-->
        <nombre>Caja con autocierre</nombre>
        <!--La descripción es optativa-->
        <descripcion>Caja de seguridad...</descripcion>
        <origen>Alemania</origen>
    </producto>
    <producto aaabbbccc="jjjjj">
        <nombre>Caja llaves</nombre>
        <!-- Despues de la descripcion debe haber
        uno de estos dos elementos :
          a) origen
          b) pais -->
        <pais>Francia</pais>
    </producto>
</catalogo>

Solución:

<!ELEMENT catalogo     (producto)+>
<!ELEMENT producto     (nombre, descripcion?, (origen|pais))>
<!ATTLIST producto     codigo CDATA #IMPLIED>
<!ELEMENT nombre       (#PCDATA)>
<!ELEMENT descripcion  (#PCDATA)>
<!ELEMENT origen       (#PCDATA)>
<!ELEMENT pais         (#PCDATA)>