Logos Home Page
   Lista Tutorial
DTD
DTD (Document Type Definition)
I DTD sono scritti secondo una sintassi formale che descrive con precisione quali elementi ed entità possono apparire all'interno di un documento e quali possano essere i contenuti e gli attributi di tali elementi.
Un DTD non fornisce mai informazioi sulla lunghezza, sulla struttura, sul significato, sui valori permessi o su altri aspetti simili del contenuto testuale del documento.
Se prendessimo ad esempio un DTD per un documento contenente informazioni su delle persone, questo si limiterebbe a specificare che un elemento person contiene un elemento figlio name e zero o più elementi figli profession.
Specificheerebbe poi che l'elemento name contiene un elemento first_name e uno last_name ed infine affermerebbe che first_name, last_name e profession contengono del testo.
Ecco la dichiarazione di documento per l'esempio appena citato:

<!ELEMENT person (name, profession*)>
<!ELEMENT name (first_name, last_name)>
<!ELEMENT first_name (#PCDATA)>
<!ELEMENT last_name (#PCDATA)>
<!ELEMENT profession (#PCDATA)>

Ogni riga dell'esempio appena citato rappresenta una dichiarazione di elemento.
L'asterisco che segue "profession" significa "zero o più".
Quindi ogni persona deve avere un nome e può avere o non avere una o più professioni.

Inoltre il nome deve essere specificato prima di qualunque professione.
#PCDATA significa che i dati contenuti nell'elemento sono dati di tipo carattere non sottoposti a parsing.


La Dichiarazione del tipo di Documento
Un documento a cui deve essere applicata una validazione deve includere un riferimento al DTD con il quale dele essere messo in confronto.
Ad esempio:

<! DOCTYPE person SYSTEM "http://www.miosito.com/xml/dtd/person.dtd">

Questa dichiarazione afferma che l'elemento radice del documento è person.


Sottoinsiemi Interni
Spesso può risultare utile mantenere il DTD all'interno dello stesso file. In tal caso il DTD va messo tra parentesi quadre.

<! DOCTYPE person[
<! ELEMENT first_name (#PCDATA)>
...
]>

Il sottoinsieme interno e quello esterno formano il DTC completo.
La regola generale prevede che i 2 insiemi debbano essere compatibilie quindi nessuno dei due deve definire un elemento o un attributo fornito dall'altro.
Ma analizziamo più da vicino la dichiarazione di un elemento;


Dichiarazione di Elementi
<! ELEMENT nome_elemento (modelo_di_contenuto)>

Il nome dell'elemento può essere qualsiasi nome XML legale, mentre il modello di contenuto specifica quali figli possa o debba avere e in che ordine.

#PCDATA
L'elemento può contenere solo dati di tipo carattere, ma non elementi figli.

<!ELEMENT telefono (#PCDATA)>

ELEMENTI FIGLI
Contiene il nome dell'elemento figlio

<!ELEMENT dati_personali (telefono)>

Ovviamene è prevista, tramite l'utilizzo di "," come separatore, l'immissione di una sequenza:

<!ELEMENT dati_personali (nome, cognome, telefono)>

Altro fattore importante da specificare è in numero dei figli possibili per ciascun elemento;
? permette la presenza di zero o un'istanza di elemento;
* permette zero, una o più istanza di elemento;
+ permette una o più istanze di elemento;

Talvolta può capitare la necessità che in'istanza di un elemento possa contenere un certo tipo di elemento figlio, mentre un'altra istanza dello stesso elemento utilizzi un'elemento figlio diverso.
Per rispondere a questa esigenza si usa la barra verticale "|", che permette di effettuare una scelta tra uno degli elementi presenti, ma non entrambi.

<!ELEMENT digita (uno | due | tre | quattro | cinque)>

Le scelte e le sequenze possono essere poi combinate e racchiuse tra parentesi per creare combinazioni più elaborate:

<! ELEMENT cerchio (centro, (raggio | diametro))>

E' inoltre possibile combinare elementi e dati di tipo carattere in contenuti misti.

<! ELEMENT descrizione (#PCDATA | note)*>

Si not che l'elemento #PCDATA deve essere dichiarato come primo della lista.
In questo caso viene specificato che l'elemento descrizione può contenere dati di tipo carattere o un elemento figlio note senza però specificare in che oridine questi debbano apparire, come non è possibile specificare che descrizone deve contenere esattamente un figlio note assieme a dati di tipo carattere, o che i dati debbano trovarsi dopo l'elemento note.
L'unica cosa che si va a specificare è che un elemento contiene qualsiasi numero di elementi tra quelli elencati in una lista, in qualsiasi ordine, insieme a dati di tipo carattere inseriti in qualunque posizione.
Infine, citiamo i casi in cui ci potrebbe esserci la necessità di dichiarare un elemento vuoto, contenente solo attributi.
In tal caso dovremmo usare la parola EMPTY, <!ELEMENT image EMPTY>; e il caso in cui decidiamo di dichiarare l'esistenza di un elemento senza definire il tipo di dati ad esso assiciati.
Con ANY dichiariamo che il nosrtro elemento può contenere qualsiasi tipo di dato.