Saltar al contenido principal

Ejercicio 404

Consideremos el siguiente documento XML:

<factura id="876">
<emision>2012-02-28T08:25:02</emision>
<vendedor id="12">
<nombre>Felipe Cuesta Pérez</nombre>
</vendedor>
<cliente id="9878">
<nombre>Raquel Rengo Suárez</nombre>
<direccion>
<via>Calle Alonso Cano, 2, 3º A</via>
<cp>41700</cp>
<localidad>Dos Hermanas</localidad>
<provincia>Sevilla</provincia>
</direccion>
<telefono num="666111666"/>
<telefono num="954666111"/>
</cliente>
<articulo id="121" iva="18">
<denominacion>Silla giratoria modelo C-121</denominacion>
<precio>98.23</precio>
<cantidad>1</cantidad>
</articulo>
<articulo id="9341" iva="18">
<denominacion>Mesa estudio 120x80 haya modelo A2-456-X</denominacion>
<precio>193.23</precio>
<cantidad>1</cantidad>
</articulo>
<articulo id="1124" iva="18">
<denominacion>Lámpara mesa con pantalla naranja modelo AK-987</denominacion>
<precio>23.12</precio>
<cantidad>2</cantidad>
</articulo>
<descuento>20</descuento>
</factura>

Elabora un documento DTD que permita validar la estructura del documento XML anterior, teniendo en cuenta los siguientes aspectos:

  • Toda factura tiene un identificador obligatorio.
  • Los elementos emision, vendedor, cliente y articulo son obligatorios, mientras que descuento es opcional.
  • El elemento articulo puede aparecer varias veces. Los demás sólo una vez.
  • vendedor tiene el atributo obligatorio id y debe contener obligatoriamente un elemento nombre.
  • cliente tiene el atributo obligatorio id y contiene los elementos nombre, direccion y teléfono.
  • nombre y direccion son obligatorios, mientras que telefono es opcional y además puede aparecer más de una vez.
  • Cada articulo tiene los atributos obligatorios id e iva y los elementos obligatorios denominacion, precio y cantidad.
Solución
XML
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE factura SYSTEM "404.dtd">
<factura id="876">
<emision>2012-02-28T08:25:02</emision>
<vendedor id="12">
<nombre>Felipe Cuesta Pérez</nombre>
</vendedor>
<cliente id="9878">
<nombre>Raquel Rengo Suárez</nombre>
<direccion>
<via>Calle Alonso Cano, 2, 3º A</via>
<cp>41700</cp>
<localidad>Dos Hermanas</localidad>
<provincia>Sevilla</provincia>
</direccion>
<telefono num="666111666"/>
<telefono num="954666111"/>
</cliente>
<articulo id="121" iva="18">
<denominacion>Silla giratoria modelo C-121</denominacion>
<precio>98.23</precio>
<cantidad>1</cantidad>
</articulo>
<articulo id="9341" iva="18">
<denominacion>Mesa estudio 120x80 haya modelo A2-456-X</denominacion>
<precio>193.23</precio>
<cantidad>1</cantidad>
</articulo>
<articulo id="1124" iva="18">
<denominacion>Lámpara mesa con pantalla naranja modelo AK-987</denominacion>
<precio>23.12</precio>
<cantidad>2</cantidad>
</articulo>
<descuento>20</descuento>
</factura>
404.dtd
<!ELEMENT factura (emision, vendedor, cliente, articulo+, descuento?)>
<!ATTLIST factura id CDATA #REQUIRED>
<!ELEMENT emision (#PCDATA)>
<!ELEMENT vendedor (nombre)>
<!ATTLIST vendedor id CDATA #REQUIRED>
<!ELEMENT nombre (#PCDATA)>
<!ATTLIST cliente id CDATA #REQUIRED>
<!ELEMENT cliente (nombre, direccion, telefono*)>
<!ELEMENT direccion (via, cp, localidad, provincia)>
<!ELEMENT via (#PCDATA)>
<!ELEMENT cp (#PCDATA)>
<!ELEMENT localidad (#PCDATA)>
<!ELEMENT provincia (#PCDATA)>
<!ELEMENT telefono (#PCDATA)>
<!ATTLIST telefono num CDATA #REQUIRED>
<!ATTLIST articulo id CDATA #REQUIRED>
<!ATTLIST articulo iva CDATA #REQUIRED>
<!ELEMENT articulo (denominacion, precio, cantidad)>
<!ELEMENT denominacion (#PCDATA)>
<!ELEMENT precio (#PCDATA)>
<!ELEMENT cantidad (#PCDATA)>
<!ELEMENT descuento (#PCDATA)>