Come abbiamo visto all'inizio di queste dispense, l'HTML deriva dall'SGML che è un linguaggio a marcatori molto più potente e complesso, disponibile da molti anni in varie forme e per vari scopi.
L'SGML specifica degli identificatori di contenuto con i quali formattare il testo in modo coerente per permettere ai sistemi di gestione dei documenti di reperire facilmente le informazioni; si presta bene per la gestione di grandi quantità di dati con struttura omogenea come cataloghi, manuali tabelle statistiche.
Siccome usa marcatori basati sul contenuto e non sul formato, è possibile cambiare agevolmente le regole di formattazione per inviare il documento a dispositivi di memorizzazione o di visualizzazione di tipo diverso.
Nonostante questi pregi l'SGML è utilizzato solo da organizzazioni di una certa mole, come l'IBM o alcuni enti statali americani, in quanto è notevolmente complesso e difficile da usare in modo corretto.
Il grande pregio dell'SGML è di non essere solo un linguaggio di formattazione o di contrassegno ma un «metalinguaggio» con il quale si possono definire linguaggi di contrassegno per oggetti molto diversi: formule matematiche, spartiti musicali, formule chimiche, ipertesti (questo è il caso dell'HTML).
In questo capitolo ci occupiamo di uno di tali linguaggi, l'XML (eXtensible Markup Language), che ha ultimamente assunto un ruolo molto importante in numerosi ambiti della gestione e della comunicazione dei dati.
L'HTML conserva traccia delle sue origini soprattutto nella sintassi dei marcatori ma è indubbiamente molto più semplice e molto più limitato nelle funzionalità rispetto a SGML.
Malgrado questo ha svolto un ruolo importante contribuendo in modo decisivo alla diffusione e al successo delle pagine Web presso il grande pubblico.
I limiti più evidenti dell'HTML sono:
la rigidità, in quanto ha un numero finito di tag;
la scarsa coerenza, in quanto prevede sia tag che indicano la natura di un elemento, come <title>, sia tag che indicano la sua rappresentazione, come <font>, sia, ancora, tag ibridi, come <p align="center"> o <TABLE> usato per migliorare il layout del documento.
E' utile soffermarsi a questo punto sulle caratteristiche che ogni elemento di un documento possiede:
sintassi: cioè come è scritto;
semantica: cosa significa, cosa rappresenta, in che relazione sta con gli altri elementi;
rappresentazione: come appare sullo schermo o in stampa;
comportamento: come reagisce all'interazione con l'utente (vale per gli elementi dinamici).
La maggior parte dei tag dell'HTML ha sintassi, semantica, rappresentazione e comportamento predefiniti e quindi i programmi di navigazione dovrebbero essere in grado di trattarli uniformemente; il condizionale dipende dal fatto, più volte evidenziato, che spesso i browser non rispettano gli standard.
Come abbia o già osservato, con il passare degli anni e con la sempre maggiore diffusione, l'HTML si è via via discostato dalla sua natura iniziale di strumento per la definizione della struttura dei documenti, per divenire un linguaggio di formattazione, spostando quindi l'accento dalla semantica alla rappresentazione degli elementi.
Questo è avvenuto malgrado l'introduzione dei CSS che permettono di definire la formattazione della pagina, liberando da questo onere i tag HTML e restituendoli alla loro funzione originale di descrittori del contenuto.
Abbiamo quindi, da una parte un linguaggio ricco di potenzialità, molto rigoroso e versatile ma eccessivamente complesso come l'SGML, dall'altra un linguaggio molto semplice e di larga diffusione ma molto rigido e incoerente come l'HTML; in questo contesto si inserisce il linguaggio XML.
XML è un linguaggio a marcatori derivato dall'SGML con lo scopo dichiarato di conservarne l'80% delle potenzialità con solo il 20% della complessità.
E' stato creato da un gruppo di lavoro del W3C coordinato da Tim Berners Lee e si propone come base per gli sviluppi futuri del Web.
Con XML è possibile definire nuovi marcatori (questo è il motivo del termine extensible) e specificare separatamente sintassi, semantica, rappresentazione e comportamento di ogni tag.
Grazie alla possibilità di definire nuovi marcatori si può affermare che anche l'XML, come l'SGML è un metalinguaggio attraverso il quale definire linguaggi da usare in vari ambiti; ad esempio già esistono:
CML (Chemical Markup Language) per la chimica;
MathML (Mathematical Markup Language) per la matematica;
WML (Wireless Markup Language) per le navigazione con i telefonini.
La differenza sostanziale tra HTML e XML è che quest'ultimo si usa per descrivere il significato dei dati e non il loro aspetto; questo è un grosso passo avanti che, insieme alla flessibilità e versatilità del linguaggio, apre prospettive di utilizzo al di là della rappresentazione dei dati nelle reti e nel Web.
L'XML si propone infatti come possibile formato universale per la rappresentazione dei dati superando i cronici problemi di incompatibilità tra formati generati con applicazioni diverse.
Si noti che il nuovo standard per i documenti di ufficio, ODF (Open Document Format) e anche il formato proprietario (non standard) di Microsoft OOXML (Office Open XML) si basano su XML, e sono solo due delle numerose tecnologie informatiche che si appoggiano a tale linguaggio.
Si deve infine notare come l'XML non sia stato concepito per sostituire HTML, ma per integrarlo ed estenderlo, tanto è vero che quest'ultimo può essere reinterpretato nell'architettura XML dando origine ad un nuovo linguaggio: l'XHTML (eXtensible HTML).
Un documento XML è un semplice file di testo, realizzabile quindi con un qualsiasi editor, contenente testo e marcatori; questi ultimi sono racchiusi fra i simboli «<» e «>» come in HTML ma con regole sintattiche molto più rigide:
ogni tag deve essere necessariamente chiuso con il relativo tag di chiusura;
non è possibile avere annidamenti con tag sovrapposti; ciò significa che la seguente porzione di codice:
|
che in HTML è accettata, anche se scorretta, in XML (o meglio in XHTML, dato il contesto) è del tutto vietata;
i valori degli attributi devono essere sempre racchiusi tra virgolette;
deve essere sempre presente almeno un elemento e fra gli elementi uno ed uno solo ha un ruolo speciale ed è chiamato radice;
gli altri elementi sono tutti «figli», «nipoti» e comunque discendenti della radice secondo una struttura gerarchica.
Un documento che rispetti queste regole si dice «ben formato» o «conforme». |
Vediamo un primo esempio di documento XML (biblioteca.xml
) in cui si definiscono dati relativi ad una biblioteca usando dei tag definiti liberamente a questo scopo:
|
L'indentatura, come al solito, serve solo ad aumentare la leggibilità del sorgente.
Si deve notare che il linguaggio è case sensitive, quindi <LIBRO> e <libro> sono tag diversi. |
Nel caso di elementi vuoti si può usare la notazione abbreviata:
|
può essere sostituito con
|
Nell'esempio l'elemento radice è <biblioteca> mentre la prima riga è un po' particolare in quanto rappresenta una istruzione di elaborazione XML; tali istruzioni iniziano con i caratteri «<?» e terminano con «?>».
Questa istruzione presenta due attributi: version il cui ruolo è ovvio e standalone il cui significato verrà chiarito più avanti.
Le regole elencate in precedenza forniscono solo un primo livello di validazione; un secondo livello si ottiene grazie alla DTD (Document Type Definition) che è un testo che descrive le regole sintattiche per il documento XML e può essere contenuto in quest'ultimo oppure, più frequentemente, risiedere in un file autonomo.
La seconda alternativa è ovviamente da preferire in caso di più documenti definiti con una stessa DTD in quanto permette di scrivere quest'ultima una volta sola.
Un documento che rispetti le regole sintattiche di una DTD si dice «valido». |
Il file biblioteca.xml
deve essere così modificato nella parte iniziale:
|
La DTD può essere esterna e residente, ad esempio, nel file biblioteca.dtd
seguente:
|
Allora il documento biblioteca.xml
assumerebbe questo aspetto:
|
A questo punto dovrebbe essere chiaro il significato dell'attributo standalone: vale "no" quando almeno una definizione DTD è esterna al documento.
La parola chiave SYSTEM si usa per DTD definite localmente; in certi casi è utile usare DTD pubbliche già definite con questa sintassi:
|
Le linee contenute nella DTD si chiamano «dichiarative», iniziano con i simboli «<!», seguiti dal tipo di dichiarativa e terminano con «>».
Il nome scritto nella dichiarativa !DOCTYPE (che ricordo essere presente anche nei sorgenti HTML) deve coincidere con la radice del documento XML a cui la DTD si riferisce; tra le parentesi quadrate è racchiusa la definizione del documento.
Il tipo !ELEMENT permette di specificare il tipo di elemento; la sua sintassi è:
|
Nel nostro esempio il primo elemento ha nome biblioteca e contiene uno o più di uno (questo è il significato del simbolo«+») elementi libro.
A sua volta libro contiene una sequenza di elementi (la sequenza si indica elencando gli oggetti separati da virgola) titolo, autore, casaed, argomento, annoed.
Se invece si dovesse avere la scelta tra una lista di elementi, la sintassi da usare sarebbe: (el1 | el2 | el3 ....).
autore è opzionale e può esserci una o più volte (è il significato del simbolo «*»); PREZZO può esserci zero o una volta (è il significato del simbolo«?»).
Gli altri elementi devono tutti comparire una ed una sola volta.
La parola chiave #PCDATA indica che quell'elemento è un elemento di testo.
Un altro tipo di dichiarativa è !ATTLIST che permette di indicare gli attributi di un elemento, con questa sintassi:
|
dove «terna» è composta da nome-attributo tipo-attributo valore-default;
ad esempio:
|
ID indica l'identificativo del tag e permette di identificarlo univocamente nel documento, CDATA una stringa di testo, #REQUIRED impone che l'attributo sia specificato, #IMPLIED indica che l'attributo non è obbligatorio.
Un altro valore possibile è #FIXED che indica un attributo con valore fisso.
Il terzo tipo di dichiarativa è quello per le entità, !ENTITY che può essere di due tipi: generale o di parametro.
Le entità generali sono definite nelle DTD ma si usano poi nei documenti XML; la loro sintassi è:
|
ad esempio per definire il carattere «&» si usa:
|
oppure per definire un'entità associata ad un testo ripetitivo da inserire più volte in un documento:
|
Il riferimento alle entità si effettua anteponendo il simbolo «&» e posponendo il simbolo «;».
Quindi se in un documento si vuole inserire il testo dell'esempio sopra illustrato si scrive:
|
Le entità di parametro si usano esclusivamente nelle DTD esterne; la loro sintassi è:
|
Queste entità vengono di solito usate per fare riferimento a definizioni di dati contenute in file esterni.
Non approfondiamo ulteriormente questi argomenti; maggiori dettagli sulle DTD si possono reperire liberamente sul sito del consorzio W3C: <http://www.w3.org>.
Come abbiamo visto un documento XML contiene solo la definizione di un insieme di dati ottenuta grazie ad un set arbitrario di marcatori; sorgono a questo punto due problemi:
il documento deve essere analizzato e validato;
i dati devono in qualche modo essere gestiti (ad esempio visualizzati con un browser).
Gli stessi problemi in verità esistono anche per i documenti HTML che però contengono tag appartenenti ad un insieme rigido e prefissato; quindi è bastato costruire in modo opportuno i programmi di navigazione, istruendoli su come interpretare e gestire i vari tag ed i problemi sono stati risolti.
Nel caso dell'XML le cose sono un po' più complicate; la questione della validazione viene affrontata dai parser XML che svolgono le seguenti operazioni:
analizzano il documento verificando che sia conforme e, nel caso sia specificata una DTD, valido;
lo suddividono nelle sue componenti generando una qualche forma di output specifico per la piattaforma di esecuzione.
Esistono due tipi di parser:
i parser DOM, che forniscono in output una struttura gerarchica ad albero che rispecchia la struttura del documento XML; tale struttura è indipendente dalla piattaforma ed è adatta per applicazioni interattive perché viene sempre mantenuta interamente in memoria centrale;
i parser SAX (Simple Api for XML), che leggono il documento XML e generano eventi corrispondenti alla sua struttura; richiedono un uso più limitato della memoria ma impediscono di tornare indietro nell'analisi degli elementi XML; sono preferiti nel caso di filtraggio dei dati o di applicazioni lato servente nelle quali non sia richiesta la rappresentazione in memoria dei dati.
Attualmente tutti i browser più recenti sono in grado di effettuare il parsing di un documento XML.
Il problema della gestione dei dati viene invece affrontato dalle applicazioni XML che si occupano di manipolare le informazioni ricevute dal parser trasformandole in elementi di varia natura adatti ad essere visualizzati, stampati, memorizzati o inviati ad altri dispositivi di output.
Nel caso il documento XML debba essere solo visualizzato con un programma di navigazione è possibile ricorrere semplicemente ai CSS, a patto che il browser sia almeno in grado di fare il parsing.
Riprendendo l'esempio biblioteca.xml
vediamo un possibile foglio di stile, biblioteca.css
, che permette la sua visualizzazione con Firefox:
|
Per usarlo occorre aggiungere a biblioteca.xml
, come seconda linea:
|
Il risultato che si ottiene aprendo biblioteca.xml
con Firefox è quello mostrato nella figura 9.19.
Con i fogli CSS si può comunque solo modificare il formato degli elementi XML ed agire solo sui singoli elementi; se si vuole invece manipolare in modo più consistente un documento XML, ad esempio riordinando gli elementi o nascondendone alcuni, si deve ricorrere ai fogli XSL.
L'XSL (eXtensible Style Language) comprende sia un linguaggio di trasformazione, l'XSLT (XSL Transformation), che uno di formattazione, l'XSL:FO (XSL: Formatting Object), entrambi definiti usando XML.
La trattazione sull'uso di questi linguaggi nonché dei linguaggi XLink e XPointer per il collegamento tra documenti XML e anche dell'XMLSchema definito anch'esso in XML e alternativo alle DTD, esula dagli scopi di queste dispense; si rimanda, come al solito, all'ampia letteratura disponibile sull'argomento.