XML

Introduzione

Quando venne progettato, l'XML fu pensato per raggiungere i seguenti obiettivi:

  • Facile da elaborare attraverso delle applicazioni
  • Documenti leggibili anche senza l'ausilio di applicazioni, e ragionevolmente chiari
  • Di facile utilizzo
  • Documenti che possono essere creati velocemente

XML è l'acronimo di eXtensible Markup Language. Come tale, un documento XML è costituito da uno o più elementi contenenti i dati.

Lo standard XML non specifica il nome e l'uso degli elementi. In questo modo, chiunque può utilizzare gli elementi che desidera e strutturarli liberamente per la rappresentazione dei dati. Tuttavia, questa enorme flessibilità nell'utilizzo degli elementi può far sorgere problematiche nella standardizzazione di un tipo di documento. Per questo motivo, un documento XML può essere dichiarato come appartenente ad un certo tipo di documento. Questa appartenenza si traduce in una serie di regole che indicano il tipo di elementi e come essi devono essere utilizzati.
Un documento XML quindi può avere due livelli di correttezza: una correttezza sintattica e una correttezza semantica. La prima garantisce che il documento rispetti la sintassi XML, e la seconda garantisce che il significato attribuito agli elementi, ovvero i dati che rappresentano e la strutturazione del documento, è coerente con un determinato modello di documento.

Un documento XML che non viola alcuna regola della sintassi è chiamato documento ben formato. Se il contenuto di un documento XML non viola le regole specificate nella definizione del tipo di documento a cui la dichiarazione di tipo fa riferimento, allora è detto documento valido. I requisiti per la validità di un documento XML sono più restrittivi rispetto a quelli richiesti per essere un documento ben formato. Infatti un documento è valido se e solo se è ben formato e non viola le regole contenute nella definizione del tipo di documento. Un documento valido è sicuramente ben formato, ma non viceversa.

  • Documento sintatticamente corretto: Documento ben formato
  • Documento semanticamente corretto: Documento valido

La validità sintattica permette di utilizzare XML come un formato di scambio universale dei dati, che può essere letto da qualunque parser XML. La validità semantica permette di scambiare dati tra due computer in modo coerente, poiché è possibile elaborare i dati contenuti negli elementi con la certezza che essi abbiano un dato significato.

Documenti ben formati

Elementi

Un elemento contiene:

  • un nome, che viene indicato nel tag
  • un contenuto, che viene indicato dal testo compreso tra i tag

Un tag è una sequenza di caratteri del tipo:
<nome_tag>
un elemento è racchiuso tra due tag, detti tag di apertura e tag di chiusura seguenti:
<nome_tag> (tag di apertura)
</nome_tag> (tag di chiusura)
Gli elementi possono contenere dei contenuti, che sono rappresentati dalle stringhe di caratteri racchiuse tra i tag. <nome>contenuto</nome>
Il nome di un elemento, contenuto nel tag, deve iniziare per una lettera o per i caratteri underscore (_) o due punti (:), e può contenere lettere, cifre, e i caratteri (.) (-) (_) (:). In particolare, il nome di un elemento non può contenere spazi. Viene raccomandato di non utilizzare i due punti (:), poiché nel caso vengano utilizzati i namespace, potrebbero portare errori. Tuttavia, lo standard non li proibisce.
Il nome di un elemento non può iniziare con la stringa xml, poiché tali nomi sono riservati.

Sbagliato Corretto
<5tag> … contenuto … </5tag> <tag5> … contenuto … </tag5>
<-my-tag> … contenuto … </-my-tag> <my-tag> … contenuto … </my-tag>
<my tag> … contenuto … </my tag> <my_tag> … contenuto … </my_tag>

Il nome nel tag di chiusura di un elemento deve corrispondere esattamente al nome indicato nel tag di apertura. Il nome dell'elemento è case-sensitive.

Sbagliato Corretto
<nome> … contenuto … </Nome> <nome> … contenuto … </nome>

Un elemento può non avere contenuto, nel qual caso si dice che l'elemento è vuoto, come il seguente:
<nome></nome>
Per evitare di scrivere il tag di apertura e quello di chiusura è possibile indicare un elemento vuoto nella seguente forma:
<nome/>
che permette una scrittura più veloce.

Un elemento E è detto figlio di un altro elemento P se il contenuto di P include anche E:
<P> … <E> … </E> … </P>
In genere, per migliorare la leggibilità degli elementi, si indentano i tag in questo modo:
<P>
<E> … </E>
</P>

L'elemento contenuto viene detto elemento figlio e quello contenitore elemento padre. Un documento ben formato deve avere gli elementi correttamente annidati, quindi l'elemento figlio deve essere contenuto completamente nel suo contenitore padre.

Sbagliato Corretto
<A>
<B>
<C> … </C>
</A>

</B>
<A>
<B>
<C> … </C>
</B>
</A>

Attributi

Un elemento può contenere altre informazioni contenute in eventuali attributi. Essi sono costituiti da una coppia nome-valore (o chiave-valore) e posizionati all'interno del tag di apertura, oppure nel tag vuoto:
<nome_elemento attributo1="valore1" attributo2="valore2" … attributo="valore n">contenuto</nome_elemento>
<nome_elemento attributo1="valore1" attributo2="valore2" … attributo="valore n"/>
Il valore dell'attributo può essere racchiuso tra virgolette (") oppure apici (').

Il nome di un attributo non deve comparire più di una volta.

Sbagliato Corretto
<film titolo="Fanteria dello spazio" anno="1997" titolo="Starship Troopers" > … contenuto … </film> <film titolo_it="Fanteria dello spazio" anno="1997" titolo_en="Starship Troopers" > … contenuto … </film>


Per evitare ambiguità, il valore degli attributi non può contenere direttamente le virgolette (") se è racchiuso tra virgolette, oppure gli apici (') se è racchiuso tra apici.

Sbagliato Corretto
<album titolo="R.E.M "Live""> <album titolo="R.E.M 'Live'">
<film titolo='Dante's peak'> <film titolo="Dante's peak">

Entità

Un'entità è un "puntatore" a dei dati che vengono dichiarati altrove. Essa infatti associa un nome ad un valore, a cui può essere fatto riferimento tramite il nome all'interno del documento. Esistono due tipi di entità: le entità generiche e le entità parametro. A differenza delle prime, le seconde sono utilizzate solo nella definizione del tipo di documento (DTD).

Entità generiche

Nella dichiarazione di una entità generica viene specificato il nome e il valore associato in questo modo:
<!ENTITY nome "valore dell'entità">
In tutti i casi, il riferimento ad una entità generica avviene attraverso la sintassi &nome;. Nel documento il riferimento viene sostituito dal valore dell'entità. Queste entità generiche, il cui valore è definito all'interno del documento stesso, sono dette entità generiche interne.

Le entità generiche possono essere esterne, ovvero definite all'esterno del documento. In questo caso la dichiarazione specifica il nome e un URI che fa riferimento al valore dell'entità. Queste entità possono essere personalizzate e dedicate ad un gruppo di documenti XML oppure possono essere di ampio utilizzo. Nel primo caso l'entità generica esterna è di tipo privato, mentre nel secondo caso è di tipo pubblico. Un entità generica esterna pubblica viene dichiarata in questo modo:
<!ENTITY nome PUBLIC "ID entità" "URI entità">
mentre se è privata viene definita in questo modo:
<!ENTITY nome SYSTEM "URI entità">

Infine, le entità generiche esterne possono contenere dati, anche non testuali, che non vengono analizzati dall'applicazione XML che elabora il documento. In questo caso si dice che l'entità è unparsed viene dichiarata in questo modo:
<!ENTITY nome PUBLIC "ID entità" "URI entità" NDATA nome_tipo_dati>
<!ENTITY nome SYSTEM "URI entità" NDATA nome>
a seconda che sia pubblica o privata, rispettivamente.

Nei riferimenti devono essere indicati solo nomi di entità parsed. I nomi di entità unparsed possono invece essere inseriti solo nei valori degli attributi di tipo ENTITY o ENTITIES.
In pratica le entità non parsed sono quelle esterne, quindi solo in quel caso non è possibile fare riferimento ad esse. È importante notare che nel caso di entità esterne non parsed, esse sono contenute nel valore di un attributo di tipo ENTITY o ENTITIES come nome e non come attributo.

@!ENTITY int "internal entity"> <!-- entità interna parsed --@
@!ENTITY ext SYSTEM "doc.dtd"> <!-- entità esterna parsed definita nel file "doc.dtd" --@
@!ENTITY image SYSTEM "image.png" NDATA png> <!-- entità esterna unparsed --@

Sbagliato: &image; è un riferimento ad una entità esterna unparsed Corretto: il riferimento è ad una entità esterna parsed Corretto: le entità interne sono sempre parsed
<A> &image; </A> <A> &ext;</A> <A> &int;</A>

@!ATTLIST A attr ENTITY #REQUIRED @

Sbagliato: l'entità esterna non può essere inserita come riferimento Corretto: il nome dell'entità esterna è presente in un attributo di tipo ENTITY
<A attr="&image;"> </A> <A attr="image"> </A>

Il valore di una entità può contenere riferimenti ad altre entità.

Esempio:
@!ENTITY author "Alessio"@
@!ENTITY copy "Il documento è stato scritto da &author;"@
Il riferimento &doc; verrà sostituito dal testo Il documento è stato scritto da Alessio.

Un'entità parsed non deve contenere riferimenti ricorsivi a se stessa, ne direttamente, ne indirettamente.

Sbagliato: riferimento ricorsivo diretto Sbagliato: riferimento ricorsivo indiretto, &copy; contiene un riferimento a &doc; che a sua volta contiene un riferimento a &copy; Corretto: nessun riferimento ricorsivo
<!ENTITY copy "Copyright: &copy;"> <!ENTITY author "Alessio">
<!ENTITY copy "Copyright: &doc;">
<!ENTITY doc "Note: &copy;">
<!ENTITY author "Alessio">
<!ENTITY copy "Documento scritto da &author;">
<!ENTITY doc "Note: &copy;">

Il testo di una entità utilizzata nel valore di un attributo non può contenere il carattere "<".

Sbagliato: viene utilizzato direttamente il carattere < Corretto: viene utilizzata l'entità &lt;
<!ENTITY transitive "se a < b e b < c allora a < c">
<property text="&transitive;" />
<!ENTITY transitive "se a &lt; b e b &lt; c allora a &lt; c">
<property text="&transitive;" />

I valori degli attributi non possono contenere riferimenti diretti o indiretti ad entità esterne
@!ENTITY int "internal entity"> <!-- entità interna parsed --@
@!ENTITY ext SYSTEM "doc.dtd"> <!-- entità esterna parsed definita nel file "doc.dtd" --@
@!ENTITY image SYSTEM "image.png" NDATA png> <!-- entità esterna unparsed --@

Sbagliato: &image; è esterna unparsed Sbagliato: &ext è esterna Corretto: &int; è interna
<A value="&image;" /> <A value="&ext;" /> <A value="&int;" />

Entità parametro

Le entità parametro sono utilizzate solo all'interno delle definizioni di tipo di un documento. Esse possono essere dichiarate all'interno del DTD del documento XML, nel qual caso sono dette entità parametro interne oppure possono avere un valore specificato all'esterno del documento XML. Le entità parametro interne sono sempre di tipo parsed, ovvero sono sempre elaborate dall'applicazione XML. Le entità parametro interne sono dichiarate così:
@!ENTITY % nome "valore entità"@
se sono esterne invece sono dichiarate nel seguente modo:
@!ENTITY % nome SYSTEM "URI entità"@
@!ENTITY % nome PUBLIC "ID entità" "URI entità"@

Un riferimento ad una entità parametro è del tipo: %nome;

Si suppone di possedere un file mydoc.dtd che contiene due definizioni di entità:
@!ENTITY test "This is the first test"@
@!ENTITY test2 "This is the second test"@
in un documento xml possono essere incluse con dei riferimenti parametro in questo modo:

<? xml version="1.0" ?>
<!DOCTYPE doc [
<!ENTITY % ext SYSTEM "mydoc.dtd" >
%ext;
]>

I riferimenti a entità parametro non possono apparire all'esterno della definizione di tipo

Nelle definizioni DTD interne, i riferimenti ad entità parametro non possono essere contenuti nelle dichiarazioni di markup, mentre in quelle esterne si.

Il testo sostitutivo di un riferimento ad una entità parametro deve essere ben formato

Il riferimento ad una entità che non appare in un DTD esterno o in una entità parametro deve avere un nome che corrisponde ad una dichiarazione di entità, non contenuta in una DTD esterna o in un'entità parametro. I documenti XML hanno già predefinite le seguenti entità generiche, che non devono essere dichiarate: &gt; (>) &lt; (<) &amp; (&) &apos; (') &quot; (").

Documenti validi

Un documento XML è formato da una dichiarazione xml e da un elemento radice che contiene tutti gli altri elementi del documento. La dichiarazione xml è del tipo:
@? xml version=[numero versione] encoding=[codifica usata] standalone=[yes/no] ?@
La dichiarazione è un elemento particolare, distinto dagli altri dalla presenza di due caratteri "?". Dei tre attributi previsti, uno è obbligatorio, mentre gli altri due sono opzionali. L'attributo version indica la versione di xml a cui si riferisce il documento e può avere i valori "1.0" e "1.1", le due versioni attualmente disponibili. L'attributo encoding indica il set di caratteri utilizzato, ad esempio uno dei seguenti: "UTF-8", "ISO-8859-1", ecc. L'attributo standalone infine può assumere solo i valori "yes" e "no" e indica se il documento può essere interpretato singolarmente oppure vi sono contenuti riferimenti ad altri documenti o dati esterni.

Gli elementi che sono scritti nella forma:
@? nome elemento ?@
contengono istruzioni di elaborazione che vengono lette ed eseguite dall'applicazione che analizza il documento XML.

Un tipico esempio di dichiarazione xml per un documento xml che utilizza la versione 1.0, codificato in UTF-8 ed singolo è il seguente:
<? xml version="1.0" encoding="UTF-8" standalone="yes" ?>

DTD

Il documento XML può contenere una dichiarazione DTD. La dichiarazione contiene le regole a cui deve conformarsi il documento XML per essere valido. Le regole possono essere contenute direttamente nella dichiarazione oppure può essere presente un riferimento ad un file .dtd che contiene le definizioni. Un documento XML deve possedere una dichiarazione DTD

L'acronimo DTD può avere due significati:

  • Document Type Declaration: Dichiarazione del tipo di documento
  • Document Type Definition: Definizione del tipo di documento

Mentre un documento XML contiene una dichiarazione di tipo, essa fa riferimento ad una definizione di tipo. La definizione può essere locale al documento oppure esterna ad esso. Nel primo caso si dice che la definizione è interna, ed è costituita da varie defininzioni che sono presenti nel documento stesso. Questa soluzione, anche se è semplice e pratica, presenta degli svantaggi nel caso vengano creati diversi documenti dello stesso tipo, poiché in ognuno di essi dovranno essere presenti le stesse definizioni.
Una dichiarazione di DTD interna è del tipo:
@!DOCTYPE nome [ (definizioni interne) ] @
Una soluzione più comoda consiste nell'inserire le definizioni in un documento esterno, e indicare l'URI del documento. In questo caso si dice che la dichiarazione del tipo di documento è esterna ed è del tipo:
@!DOCTYPE nome SYSTEM "URI delle definizioni" @
Alcune esigenze impongono di disporre di definizioni standard, che possono essere utilizzate da chiunque per produrre documenti conformi. Ad esempio, il World Wide Web Consortium ha pubblicato le definizioni di alcuni tipi standard di documenti XML, come i formati XHTML, SVG, ecc.

Le DTD contenute in un file esterno sono dette private, mentre quelle aderenti a standard condivisi sono dette pubbliche. Le definizioni pubbliche vengono dichiarate in questo modo:
@!DOCTYPE nome PUBLIC "ID delle definizioni" "URI delle definizioni" @
Il nome specificato nella dichiarazione del tipo di documento deve corrispondere al nome dell'elemento radice.

Sbagliato: il nome mydoc non è il nome dell'elemento radice Corretto: il nome mydoc corrisponde al nome dell'elemento radice
<!DOCTYPE mydoc [

]>
<doc>

</doc>
<!DOCTYPE mydoc [

]>
<mydoc>

</mydoc>


Un documento deve dichiararsi non a se stante, con l'inserimento dell'attributo standalone = "no" nella dichiarazione xml se:

La dichiarazione del presente documento è la seguente:
@!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"@
che è la dichiarazione relativa ad un documento XHTML 1.1. L'ID è -//W3C//DTD XHTML 1.1//EN mentre l'URI è http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd.

Definizioni

All'interno di una Document Type Definition sono presenti delle definizioni che indicano i vincoli a cui devono attenersi gli elementi e gli attributi.

Elementi

Un elemento viene definito tramite la sintassi seguente:
@!ELEMENT nome_elemento specifiche@
Dove nome_elemento è il nome dell'elemento che viene definito e specifiche sono un insieme di vincoli. Essi riguardano il contenuto dell'elemento, ovvero di ciò che è contenuto all'interno dei tag di apertura e di chiusura.

Un elemento non può essere definito più di una volta

Il contenuto può essere di quattro tipi distinti:

  • Elemento vuoto
  • Elemento contenente elementi
  • Elemento a contenuto misto
  • Elemento a contenuto libero

Un elemento vuoto non ha contenuto, e viene definito così:
@!ELEMENT nome_elemento EMPTY@
Ad esempio un elemento A che deve essere privo di contenuto viene definito così:
<!ELEMENT A EMPTY>

Sbagliato Sbagliato Corretto Corretto
<A>dati testuali</A> <A>
<B>…</B>
</A>
<A></A> <A/>

Un elemento contenente elementi contiene altri elementi figli. È possibile specificare gli elementi figli e le loro quantità. In particolare, è possibile indicare se un elemento figlio o un gruppo di elementi figlio:

  • deve essere presente almeno una volta
  • può essere o non essere presente
  • può non essere presente o presente una volta sola

Per indicare che un elemento A deve contenere esattamente un solo elemento B figlio si usa la sintassi seguente:
<!ELEMENT A (B)>

Sbagliato: l'elemento A non contiene elementi B Sbagliato: l'elemento A contiene più di un elemento B Corretto: l'elemento A contiene un elemento B
<A>
</A>
<A>
<B>…</B>
<B>…</B>
<B>…</B>
</A>
<A>
<B>…</B>
</A>

Per indicare che un elemento A deve contenere una sequenza precisa di elementi si utilizza la virgola (,) in questo modo:
@!ELEMENT A (B, C, D)@

Sbagliato: non è presente l'elemento C Sbagliato: gli elementi figlio devono essere in ordine Corretto: gli elementi figlio sono in ordine
<A>
<B>…</B>
<D>…</D>
</A>
<A>
<B>…</B>
<D>…</D>
<C>…</C>
</A>
<A>
<B>…</B>
<C>…</C>
<D>…</D>
</A>

Se un elemento A deve contenere esattamente un elemento figlio B oppure esattamente un elemento figlio C allora si utilizza il simbolo (|) per indicare le alternative:
<!ELEMENT A (B | C)>

Sbagliato: l'elemento A non contiene più di un elemento B Sbagliato: l'elemento A contiene un elemento B e un elemento C Corretto: l'elemento A contiene un elemento C Corretto: l'elemento A contiene un elemento B
<A>
<B>…</B>
<B>…</B>
</A>
<A>
<B>…</B>
<C>…</C>
</A>
<A>
<C>…</C>
</A>
<A>
<B>…</B>
</A>

Si possono indicare molte alternative, come nell'esempio seguente:
@!ELEMENT A (B | C | D | E)@
Per indicare che un elemento può essere presente una volta oppure non essere presente si utilizza il simbolo (?). Un elemento A che può contenere un elemento figlio B oppure non contenerlo viene definito così:
<!ELEMENT A (B?)>

Sbagliato: l'elemento A contiene più di un elemento B Corretto: l'elemento A contiene un elemento B Corretto: l'elemento A non contiene elementi B
<A>
<B>…</B>
<B>…</B>
<B>…</B>
</A>
<A>
<B>…</B>
</A>
<A>
</A>

Per indicare invece che un elemento deve essere presente almeno una volta si usa il simbolo (+). Un elemento A che deve contenere almeno un elemento figlio B viene definito in questo modo:
@!ELEMENT A (B+)@

Corretto: l'elemento A contiene più di un elemento B Corretto: l'elemento A contiene un elemento B Sbagliato: l'elemento A non contiene elementi B
<A>
<B>…</B>
<B>…</B>
<B>…</B>
</A>
<A>
<B>…</B>
</A>
<A>
</A>

Se un elemento può essere presente un numero qualunque di volte oppure non essere presente si usa il simbolo (*). Un elemento A che può contenere un qualunque numero di elementi figlio B, oppure non contenerne nessuno viene definito come segue:
@!ELEMENT A (B*)@

Corretto: l'elemento A contiene più di un elemento B Corretto: l'elemento A contiene un elemento B Corretto: l'elemento A non contiene elementi B
<A>
<B>…</B>
<B>…</B>
<B>…</B>
</A>
<A>
<B>…</B>
</A>
<A>
</A>

I simboli che riguardano la molteplicità (ovvero *,+,?) possono essere applicati anche alle combinazioni di elementi. In particolare:
@!ELEMENT A (B | C*)@
Indica che l'elemento A può avere esattamente un elemento B oppure zero o un qualunque numero di elementi C.

Sbagliato: non possono essere presenti più elementi B Corretto: l'elemento A contiene un elemento B Corretto: l'elemento A non contiene elementi Corretto: l'elemento A contiene più di un elemento C
<A>
<B>…</B>
<B>…</B>
<B>…</B>
</A>
<A>
<B>…</B>
</A>
<A>
</A>
<A>
<C>…</C>
<C>…</C>
<C>…</C>
</A>

Inoltre possono essere applicati anche ad un gruppo di elementi. Ad esempio:
@!ELEMENT A (B | C)?@
il modificatore (?) si applica a (B | C), quindi significa che può comparire nessuna o al massimo una volta l'elemento B oppure l'elemento C. In altre parole l'elemento A non ha elementi figli oppure ha una istanza della combinazione di elementi (B | C), ovvero un elemento B o un elemento C.

Corretto: l'elemento A non contiene elementi Corretto: l'elemento A contiene un elemento B Corretto: l'elemento A contiene un elemento C Sbagliato: non possono comparire assieme
<A>
</A>
<A>
<B>…</B>
</A>
<A>
<C>…</C>
</A>
<A>
<B>…</B>
<C>…</C>
</A>

Analogamente si può estendere il significato dei modificatori (*) e (+) a gruppi di elementi. In particolare, la definizione seguente:
@!ELEMENT A (B | C)*@
Indica che l'elemento A può non avere elementi figli oppure può avere un qualunque numero di elementi B oppure elementi C. Mentre:
@!ELEMENT A (B | C)+@
In questo caso l'elemento A deve avere almeno un elemento B o un elemento C.

Se un elemento non contiene elementi figlio ma solo dati testuali, esso viene definito tramite la parola chiave #PCDATA
@!ELEMENT A (#PCDATA)@

Un elemento a contenuto misto può contenere sia elementi che dati testuali. Non si può vincolare il numero di elementi figlio, ma solo il loro tipo, quindi le definizioni possono essere:
@!ELEMENT A (#PCDATA | B)*@
@!ELEMENT A (#PCDATA | B | C)*@
Per questo motivo non possono essere utilizzati i modificatori (+) e (?), ma è obbligatorio utilizzare (*), che non impone vincoli. Nel primo esempio l'elemento A può contenere dati testuali ed elementi figlio B, mentre nel secondo caso anche elementi figlio C.

Un elemento a contenuto misto non può contenere un nome di un elemento più di una volta

Un elemento a contenuto libero non ha vincoli sul suo contenuto, e viene definito attraverso la parola chiave ANY.
@!ELEMENT A ANY@

Attributi

Gli attributi di un elemento sono definiti in questo modo:
@!ATTLIST nome_elemento specifiche@
dove nome_elemento è l'elemento che contiene gli attributi, mentre specifiche sono una serie di vincoli sui suoi attributi, come il loro nome e i loro valori possibili. In particolare, una specifica di un attributo è una terna di valori:
nome_attributo tipo_attributo opzioni
che rappresenta, rispettivamente: il nome dell'attributo, il tipo di valore e alcune opzioni. Il tipo di attributo può essere:

  • di tipo stringa, il cui valore è una sequenza di caratteri
  • di tipo enumerazione, il cui valore appartiene ad un insieme di valori possibili
  • di tipo TOKEN

Un attributo di tipo stringa viene identificato con il tipo CDATA.
@!ATTLIST nome_elemento nome_attributo CDATA@
Un attributo di tipo enumerazione può assumere un valore tra un insieme di valori specificati tramite l'uso del simbolo (|).
@!ATTLIST nome_elemento nome_attributo (valore1 | valore2 | valore3 | ...)@

Il valore di un attributo di tipo enumerazione deve corrispondere ad un valore specificato nella definizione dell'attributo.
I valori specificati devono essere unici, ovvero un valore non può comparire più di una volta.

Un attributo di tipo token invece viene utilizzato per scopi specifici. In particolare l'attributo può avere un valore che ricade nelle seguenti categorie:

Il tipo ID indica che il valore dell'attributo contiene un valore univoco, che segue le stesse regole dei nomi degli elementi. Solo un attributo di un elemento può essere di tipo ID.
Il tipo IDREF indica che il valore contiene un valore di tipo ID che è stato utilizzato nel documento. Il tipo IDREFS è simile a IDREF, ma contiene un elenco di valori di tipo ID separati da spazio.
Un valore di tipo NMTOKEN corrisponde ad una sequenza di caratteri vincolata a requisiti simili alle stringhe che costituiscono i nomi degli elementi. In particolare possono essere utilizzate lettere, numeri e i caratteri (.), (-), (_), (:). Anche i nomi degli elementi possono contenere questi tipi di caratteri, ma non possono iniziare con i caratteri (.), (-) o con delle cifre. Il valore di tipo NMTOKENS è costituito da uno o più stringhe di tipo NMTOKEN separate dallo spazio.
Un valore di tipo ENTITY è costituito dal nome di un riferimento ad una entità esterna, e il tipo ENTITIES rappresenta vari riferimenti a entità esterne separate da spazio.
Un valore di tipo NOTATION viene utilizzato per far riferimento ad una notazione.

Il valore di un attributo di tipo NOTATION deve corrispondere ad un nome di notazione definita nel DTD.
Non è possibile per un elemento possedere più di un attributo di tipo NOTATION.

Dopo il tipo dell'attributo si deve specificare un valore di default, oppure utilizzare le opzioni seguenti:

  • #REQUIRED: indica che l'attributo deve essere presente in tutti gli elementi a cui appartiene.
  • #IMPLIED: indica che l'attributo può anche non essere presente
  • #FIXED valore_default: indica che l'attributo deve avere sempre il valore di default specificato

@!ATTLIST A b tipo_attributo #REQUIRED@
Ogni elemento A deve avere un attributo b che corrisponde al tipo specificato in tipo_attributo, poiché è presente l'opzione #REQUIRED.
@!ATTLIST A b tipo_attributo #IMPLIED@
Un elemento A può o non può avere un attributo b, perché è presente l'opzione #IMPLIED. Se è presente, deve corrispondere al tipo specificato in tipo_attributo.
@!ATTLIST A b tipo_attributo "valore_default"@
Un elemento A può avere un attributo b di tipo tipo_attributo, e nel caso non lo abbia, è automaticamente incluso con valore di default indicato in valore_default.
@!ATTLIST A b tipo_attributo #FIXED "valore_default"@
Un elemento A può avere un attributo b di tipo tipo_attributo, ma il suo valore deve essere valore_default. Non può avere valori diversi.
Se il tipo_attributo dell'attributo b è ID allora possono essere specificate solo le opzioni #REQUIRED o #IMPLIED.

<!ATTLIST A attr CDATA #REQUIRED>

Sbagliato: l'attributo è necessario Corretto: l'elemento contiene l'attributo con nome attr
<A>

</A>
<A attr="prova">

</A>

<!ATTLIST A attr CDATA #IMPLIED>

Corretto: l'attributo è opzionale Corretto: l'elemento contiene l'attributo
<A>

</A>
<A attr="prova">

</A>

<!ATTLIST A attr CDATA #FIXED "valore_default">

Corretto: l'elemento non contiene attributi Sbagliato: l'attributo non ha il valore fissato Corretto: l'attributo ha esattamente il valore fissato
<A>

</A>
<A attr="prova">

</A>
<A attr="valore_default">

</A>

<!ATTLIST A attr CDATA "valore_default">

Corretto: l'elemento non contiene l'attributo che viene inserito
automaticamente con il valore di default specificato
Corretto: l'elemento contiene l'attributo con nome attr
<A>

</A>
<A attr="prova">

</A>

<!ATTLIST A attr (alto|medio|basso) "medio">

Corretto: l'elemento non contiene attributi Corretto: il valore è compreso tra i valori previsti Sbagliato: il valore dell'attributo non è compreso tra i valori previsti
<A>

</A>
<A attr="alto">

</A>
<A attr="prova">

</A>

Utilizzo di attributi di tipo token:

Nella definizione degli attributi di un elemento non può essere contenuto più di un attributo di tipo ID.
Nel documento, il valore di un attributo ID non può comparire più di una volta, ovvero deve essere univoco.
Un attributo di tipo ID deve possedere solo il modificatore #IMPLIED o solo il modificatore #REQUIRED.

Un attributo di tipo IDREF deve far riferimento a un valore di un attributo di tipo ID in un elemento del documento. Se è di tipo IDREFS, ogni identificatore contenuto deve essere presente nel documento.

@!ATTLIST A code ID #REQUIRED ref IDREF #IMPLIED@

L'elemento A contiene due attributi: il primo ha nome code, è di tipo ID ed è necessario mentre il secondo è opzionale ed è un riferimento ad un valore ID.

Corretto: è stato inserito l'attributo code Sbagliato: l'attributo code deve essere univoco Sbagliato: l'attributo ref deve far riferimento all'attributo code di un altro elemento Corretto
<A code="a001">

</A>
<A code="a001">

</A>
<A code="a001">

</A>
<A code="a001" ref="a001">

</A>
<A code="a001">

</A>
<A code="a002" ref="a001">

</A>

Con le seguenti istruzioni, viene definita un'entità esterna unparsed di nome image, un'entità interna di nome txt e un attributo di nome b appartenente ad un elemento di tipo A il cui valore deve essere di tipo ENTITY.

Il valore di un attributo di tipo ENTITY deve corrispondere al valore di una entità esterna non parsed definita nel DTD
@!ENTITY image SYSTEM "immagine.png" NDATA png@
@!ENTITY txt "This is a text"@
@!ATTLIST A b ENTITY #IMPLIED@

Corretto: image è il nome di un'entità esterna unparsed Sbagliato: txt è il nome di un'entità interna parsed
<A b="image">

</A>
<A b="txt">

</A>

Notazioni

Una notazione indica delle informazioni associate ad una entità esterna non parsed, e può essere interna ed esterna. Una notazione interna viene definita come:
@!NOTATION nome_notazione PUBLIC id @
mentre una notazione di tipo esterno può essere pubblica o privata, come le dichiarazioni DOCTYPE oppure ENTITY:
@!NOTATION nome_notazione SYSTEM "URI notazione" @
@!NOTATION nome_notazione PUBLIC "id" "URI notazione" @
Il nome di una notazione deve comparire dopo la parola chiave NDATA nella definizione di un'entità esterna unparsed, in questo modo:
@!ENTITY nome SYSTEM "URI entità" NDATA nome@

In una dichiarazione di entità esterna unparsed, il nome specificato dopo la parola chiave NDATA deve corrispondere ad una notazione dichiarata.

Il nome di una notazione non può essere definito più di una volta.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License