Come è noto, la X di XHTML sta per eXtensible. Ciò indica che questo linguaggio di markup è stato progettato per poter essere esteso, cioè per consentire l'aggiunta di nuovi elementi o attributi... in maniera legale!
L'estensibilità di XHTML è derivata dal fatto di essere stato definito basandosi su XML e pertanto possiamo estenderlo sfruttando proprio i meccanismi di XML. Ma vediamo in pratica come possiamo ottenere un'estensione di XHTML.
I DTD di XHTML
Come ogni linguaggio basato su XML, anche XHTML ha la sua grammatica. Il W3C ha definito la grammatica di XHTML in una serie di Document Type Definition (DTD) pubblicamente reperibili sul sito del consorzio.
Esiste un DTD per ciascun livello di strictness di un documento XHTML, come è riassunto dalla seguente tabella:
Tipo di documento | URL del DTD |
---|---|
XHTML Strict | http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd |
XHTML Transitional | http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd |
XHTML Frameset | http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd |
Il tipo di documento utilizzato ed il riferimento al relativo DTD devono essere specificati all'interno del documento XHTML tramite la direttiva <!DOCTYPE>
. Ad esempio, se in un documento XHTML vogliamo utilizzare "XHTML Strict" dobbiamo inserire la seguente direttiva in cima al documento stesso:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
In questo modo indichiamo al browser, o comunque allo User Agent che accede al documento, che stiamo utilizzando un linguaggio la cui grammatica si trova all'indirizzo specificato.
Aggiungiamo un nuovo elemento
Una volta chiarito come funziona il legame tra XHTML e la sua grammatica, vediamo come fare ad estendere XHTML per aggiungere un nuovo elemento. Supponiamo, ad esempio, di voler aggiungere un elemento <warning>
che, nelle nostre intenzioni, ha lo scopo di contenere informazioni che devono attirare l'attenzione dell'utente.
La definizione di questo elemento in un DTD può essere ottenuto tramite la seguenta istruzione:
<!ELEMENT warning (#PCDATA)>
Un primo approccio per fare in modo che l'elemento faccia parte di XHTML (o meglio di una versione modificata di XHTML) consiste nello scaricare il DTD originale di XHTML ed aggiungere la definizione dell'elemento <warning>
.
È anche necessario indicare all'interno di quali elementi esistenti di XHTML si vuole che possa comparire il nostro elemento. Possiamo scegliere, ad esempio, che il nostro elemento potrà trovarsi allo stesso livello degli elementi <pre>
, <hr>
, <blockquote>
, ecc.
A questo scopo occorre individuare all'interno del DTD di XHTML il punto in cui questo viene definito. Analizzando il codice del DTD, vediamo che la posizione degli elementi standard citati prima viene definita appoggiandosi ad una entità %blocktext;
:
<!ENTITY % blocktext "pre | hr | blockquote | address ">
Quindi, per specificare la posizione del nostro elemento è sufficiente aggiungerlo nella definizione dell'entità:
<!ENTITY % blocktext "pre | hr | blockquote | address | warning">
A questo punto salviamo il DTD modificato e lo mettiamo in una posizione pubblicamente raggiungibile. Supponendo che la locazione del DTD sia https://www.html.it/DTD/myXHTML.dtd
, ciascun documento che farà uso del nostro elemento
<!DOCTYPE html SYSTEM "https://www.html.it/DTD/myXHTML.dtd">
In questo modo, qualsiasi User Agent che accede al nostro documento troverà il riferimento alla grammatica per convalidare il nostro codice.
Un approccio alternativo
Andare a modificare direttamente il DTD di XHTML può risultare complesso e dispersivo, soprattutto se le nostre modifiche comportano il ritocco di diversi punti del DTD originale.
Un modo alternativo per ottenere lo stesso risultato descritto prima, ma senza modificare direttamente il DTD originale di XHTML, consiste nel creare un nostro DTD includendo il DTD di XHTML.
Per includere un DTD all'interno di un altro sfrutteremo il concetto di entità, cioè di un nome che definisce un'espressione il cui valore verrà sostituito in fase di interpretazione del DTD. Ma andiamo per ordine.
Il nostro DTD finale che aggiunge l'elemento
Listato X. DESCRIZIONE
<!ELEMENT warning (#PCDATA)>
<!ENTITY % blocktext "pre | hr | blockquote | address | warning">
<!ENTITY % XHTMLdtd PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
%XHTMLdtd;
Analizziamo il codice per comprendere quello che è stato dichiarato.
Così come avevamo visto anche nel precedente approccio, la prima riga definisce il nuovo elemento <warning>
, mentre la seconda riga indica dove potrà trovarsi il nuovo elemento all'interno di un documento XHTML.
La terza riga definisce una entità %XHTMLdtd; facendola corrispondere al DTD standard di XHTML.
La quarta riga è costituita dall'entità appena dichiarata; il parser, quando incontrerà questa entità la sostituirà con il contenuto del DTD standard di XHTML. In altre parole, la terza e quarta riga corrispondono all'importazione del DTD di XHTML.
Con questo espediente abbiamo introdotto un nuovo elemento senza modificare il DTD originale.
Qualche osservazione
Prima di chiudere questo articolo voglio soffermarmi su alcune osservazioni.
L'estensione di XHTML non è una cosa semplicissima e non può prescindere da una certa dimestichezza con l'uso dei DTD ed dall'analisi del DTD standard di XHTML. Va quindi affrontata con estrema attenzione e, preferibilmente, in maniera incrementale, aggiungendo cioè un elemento alla volta e verificando di volta il volta il risultato ottenuto.
Inoltre, l'aggiunta di un elemento o di un attributo non implica che il browser che accederà al nostro documento XHTML esteso sarà automaticamente in grado di interpretarlo. Esso sarà in grado di verificare che il documento è corretto secondo la grammatica che abbiamo fornito, ma dare indicazioni su come comportarsi per interpretare il nuovo elemento o il nuovo attributo sarà compito nostro.
In altre parole, dobbiamo fornire la semantica alla nostra estensione. Ciò può essere fatto con fogli di stile CSS, tramite del codice JavaScript o con un apposito plug-in, in base al significato che intendiamo attribuire ai nuovi elementi introdotti dalla nostra grammatica.
Un'ultima osservazione riguarda la validazione di un documento esteso utilizzando il servizio di validazione online del W3C. È probabile che l'esito della validazione indichi che il documento non è valido secondo la grammatica fornita ma non vengano evidenziati errori. In questo caso il problema potrebbe dipendere dal fatto che non è stata specificata una codifica dei caratteri all'interno del documento e/o non è stato specificato un tipo MIME corretto per il documento. Infatti, per i documenti XHTML il tipo MIME corretto dovrebbe essere application/xhtml+xml e non text/html come avviene per le pagine HTML.