Ejercicio de DTD - Factura
Escribir un documento XML con una DTD interna que represente la información contenida en la siguiente factura ficticia:
DATOS EMISOR: |
DATOS CLIENTE: |
||||
Librería Pérez |
Biblioteca Txantrea |
||||
CIF: 44555666B |
CIF: 33111222A |
||||
Teléfono: 777888999 |
Teléfono: 333999444 |
||||
DETALLE FACTURA: |
|||||
CÓDIGO-ARTÍCULO |
TIPO |
DESCRIPCIÓN |
CANTIDAD |
OFERTA |
PVP |
AW7 |
Libro |
Analítica Web 2.0 |
1 |
SI |
25€ |
CP5 |
DVD |
Curso de HTML |
2 |
NO |
30€ |
IMPORTE: |
85€ |
Consideraciones respecto a la DTD:
- Hay que guardar los datos del emisor de la factura agrupados. A continuación, los datos del cliente, también agrupados. Y finalmente, los datos de detalle donde se escriben (en líneas) los datos de cada artículo, así como, el importe total.
- Obsérvese que en cada línea se indica el código de un artículo, el tipo al que pertenece, su descripción, la cantidad facturada, si está de oferta o no, y el PVP (Precio de Venta al Público). Ahora bien, de los datos que aparecen en cada línea, sólo el código del artículo y el tipo deben representarse mediante atributos en la DTD.
- Se tiene que indicar que el código del artículo ha de ser único y obligatorio para cada artículo.
- Los posibles tipos de un artículo son Libro, DVD o Varios, no permitiéndose otro valor. Ahora bien, este atributo debe indicarse que es opcional.
- El importe también debe representarse por medio de un atributo, que debe ser obligatorio.
- En la DTD debe indicarse que al menos tiene que aparecer una línea de detalle y, para cada una de ellas, se tiene que guardar la información en el mismo orden en el que aparece en la factura.
- Para indicar si un artículo está de oferta, se debe utilizar un elemento vacío que, respecto a cada artículo, podrá aparecer (en el caso de sí estar de oferta) o no aparecer (en el caso contrario).
- Respecto al número de la factura y su fecha de emisión, deben representarse mediante atributos obligatorios donde se estime más apropiado.
Solución:
"factura.xml"
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE factura [
<!ELEMENT factura (datos-emisor, datos-cliente, detalle-factura)>
<!ATTLIST factura numero CDATA #REQUIRED>
<!ATTLIST factura fecha CDATA #REQUIRED>
<!ELEMENT datos-emisor (nombre, cif, telefono)>
<!ELEMENT datos-cliente (nombre, cif, telefono)>
<!ELEMENT nombre (#PCDATA)>
<!ELEMENT cif (#PCDATA)>
<!ELEMENT telefono (#PCDATA)>
<!ELEMENT detalle-factura (linea+)>
<!ATTLIST detalle-factura importe CDATA #REQUIRED>
<!ELEMENT linea (descripcion, cantidad, oferta?, pvp)>
<!ATTLIST linea codigo-articulo ID #REQUIRED>
<!ATTLIST linea tipo (Libro|DVD|Varios) #IMPLIED>
<!ELEMENT descripcion (#PCDATA)>
<!ELEMENT cantidad (#PCDATA)>
<!ELEMENT pvp (#PCDATA)>
<!ELEMENT oferta EMPTY>
]>
<factura numero="27" fecha="18/12/2013">
<datos-emisor>
<nombre>Librería Pérez</nombre>
<cif>44555666B</cif>
<telefono>777888999</telefono>
</datos-emisor>
<datos-cliente>
<nombre>Biblioteca Txantrea</nombre>
<cif>33111222A</cif>
<telefono>333999444</telefono>
</datos-cliente>
<detalle-factura importe="300">
<linea codigo-articulo="AW7" tipo="Libro">
<descripcion>Analítica Web 2.0</descripcion>
<cantidad>1</cantidad>
<oferta />
<pvp>25</pvp>
</linea>
<linea codigo-articulo="CP5" tipo="DVD">
<descripcion>Curso de HTML</descripcion>
<cantidad>2</cantidad>
<pvp>30</pvp>
</linea>
</detalle-factura>
</factura>