| |
 |
 |
| 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.
|
|