3 A proposito di SGML e HTML

Sommario

  1. Introduzione a SGML
  2. Costrutti SGML usati in HTML
    1. Elementi
    2. Attributi
    3. Riferimenti a caratteri
    4. Commenti
  3. Come leggere la DTD HTML
    1. Commenti nella DTD
    2. Definizioni delle entità parametro
    3. Dichiarazioni di elemento
    4. Dichiarazioni di attributo

Questa sezione del documento introduce SGML e discute le sue relazioni con HTML. Una discussione completa su SGML è lasciata allo standard (si veda [ISO8879]).

3.1 Introduzione a SGML

SGML è un sistema per definire i linguaggi di marcatura. Gli autori marcano i loro documenti rappresentando accanto al contenuto informazioni strutturali, di presentazione e semantiche. L'HTML è un esempio di linguaggio di marcatura. Ecco un esempio di documento HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
   <HEAD>
      <TITLE>Il mio primo documento HTML</TITLE>
   </HEAD>
   <BODY>
      <P>Ciao mondo!
   </BODY>
</HTML>

Un documento HTML si divide in una sezione d'intestazione (qui tra <HEAD> e </HEAD>) ed in un corpo (qui tra <BODY> e </BODY>). Il titolo del documento appare nell'intestazione (insieme con altre informazioni sul documento), mentre il contenuto del documento appare nel corpo. Il corpo in questo esempio contiene un unico paragrafo, marcato con <P>.

Ogni linguaggio di marcatura definito in SGML è chiamato un'applicazione SGML. Un'applicazione SGML è generalmente caratterizzata da:

  1. Una dichiarazione SGML. La dichiarazione SGML specifica quali caratteri e delimitatori possono apparire nell'applicazione.
  2. Una definizione del tipo di documento (DTD). La DTD definisce la sintassi dei costrutti di marcatura. La DTD può includere definizioni aggiuntive quali i riferimenti ad entità carattere.
  3. Delle specifiche che descrivono i significati da attribuire al codice di marcatura. Queste specifiche impongono anche restrizioni di tipo sintattico che non possono essere espresse all'interno della DTD.
  4. Istanze di documento contenenti dati (il contenuto) e codice di marcatura. Ogni istanza contiene un riferimento alla DTD da utilizzare per la sua interpretazione.

Queste specifiche comprendono una dichiarazione SGML, tre definizioni del tipo di documento (si veda la sezione relativa a informazioni sulla versione di HTML per una descrizione delle tre) e un elenco di riferimenti a caratteri.

3.2 Costrutti SGML usati in HTML

Le seguenti sezioni introducono dei costrutti SGML che sono usati in HTML.

L'appendice elenca alcune caratteristiche di SGML che non sono supportate in modo adeguato da strumenti e programmi utente e che non dovrebbero essere adoperate.

3.2.1 Elementi

Una definizione del tipo di documento SGML dichiara i tipi di elemento che rappresentano strutture o un comportamento desiderato. L'HTML include tipi di elemento che rappresentano paragrafi, collegamenti ipertestuali, elenchi, tabelle, immagini, ecc.

Ogni dichiarazione del tipo di elemento descrive in genere tre parti: un marcatore iniziale, il contenuto ed un marcatore finale.

Il nome dell'elemento compare all'interno del marcatore iniziale (scritto <nome-elemento>) e del marcatore finale (scritto </nome-elemento>); si noti la barra obliqua prima del nome dell'elemento all'interno del marcatore finale. Ad esempio, i marcatori iniziale e finale del tipo di elemento UL delimitano le voci di un elenco:

<UL>
<LI><P>...voce 1 dell'elenco...
<LI><P>...voce 2 dell'elenco...
</UL>

Alcuni tipi di elemento HTML consentono agli autori di omettere il marcatore finale (es., i tipi di elemento P e LI). Alcuni tipi di elemento permettono anche che sia omesso il marcatore iniziale; ad esempio, HEAD e BODY. La DTD HTML indica per ciascun tipo di elemento se il marcatore iniziale ed il marcatore finale sono richiesti.

Alcuni tipi di elemento HTML non hanno contenuto. Per esempio l'elemento interruzione di linea BR non ha contenuto; la sua unica funzione è di concludere una riga di testo. Simili elementi vuoti non hanno mai il marcatore finale. La definizione del tipo di documento e il testo delle specifiche indicano se un tipo di elemento è vuoto (non ha contenuto) o, se può avere un contenuto, quale contenuto è considerato legale.

I nomi di elemento sono sempre maiuscolo-indifferenti.

Si consulti lo standard SGML per informazioni circa le regole che governano gli elementi (ad esempio essi devono essere correttamente annidati, un marcatore finale chiude, risalendo all'indietro fino al corrispondente marcatore iniziale, tutti i marcatori iniziali interposti e non chiusi per l'omissione dei corrispondenti marcatori finali (section 7.5.1), ecc.).

Per esempio il seguente paragrafo:

<P>Questo è il primo paragrafo.</P>
...un elemento a livello di blocco...

può essere riscritto senza il suo marcatore finale:

<P>Questo è il primo paragrafo.
...un elemento a livello di blocco...

dal momento che il marcatore iniziale <P> è chiuso dall'elemento seguente a livello di blocco. In modo analogo, se un paragrafo è racchiuso da un elemento a livello di blocco, come in:

<DIV>
<P>Questo è un paragrafo.
</DIV>

il marcatore finale dell'elemento a livello di blocco che circonda (qui, </DIV>) sottintende il marcatore finale corrispondente al marcatore iniziale <P> aperto.

Elementi e marcatori [tag] non sono la stessa cosa. Alcuni si riferiscono agli elementi chiamandoli tag (es.: "il tag P"). Si ricordi che l'elemento è una cosa, il marcatore (sia esso iniziale o finale) un'altra. Si consideri il caso dell'elemento HEAD che è sempre presente, anche se entrambi i marcatori HEAD iniziale e finale possono essere omessi nel codice di marcatura.

Tutti i tipi di elemento dichiarati in queste specifiche sono elencati nell'indice degli elementi.

3.2.2 Attributi

Gli elementi possono essere associati a proprietà, chiamate attributi, che possono avere dei valori (predefiniti o impostati dagli autori o da script). Le coppie attributo/valore appaiono prima del ">" di chiusura del marcatore iniziale di un elemento. Un qualsiasi numero di coppie (legali) attributo/valore, separate da spazi, possono apparire all'interno del marcatore iniziale di un elemento. Esse possono comparire in un qualsiasi ordine.

In questo esempio l'attributo id è impostato per un elemento H1:

<H1 id="sezione1">
Questa è un'intestazione riconoscibile grazie all'attributo id
</H1> 

Lo SGML richiede in modo predefinito che tutti i valori di attributo siano delimitati usando apici doppi (decimale ASCII 34) o singoli (decimale ASCII 39). Gli apici singoli possono essere inclusi all'interno del valore di un attributo quando il valore è delimitato da apici doppi, e viceversa. Gli autori possono adoperare anche riferimenti numerici a caratteri per rappresentare apici doppi (&#34;) ed apici singoli (&#39;). In luogo dei doppi apici gli autori possono utilizzare anche il riferimento ad entità carattere &quot;.

In taluni casi gli autori possono specificare il valore di un attributo senza usare gli apici. Il valore di un attributo può contenere soltanto lettere (a-z e A-Z), cifre (0-9), trattini d'unione (decimale ASCII 45), punti (decimale ASCII 46), trattini di sottolineatura (decimale ASCII 95) e i due punti (decimale ASCII 58). Si raccomanda di utilizzare gli apici anche quando è possibile eliminarli.

I nomi di attributo sono sempre maiuscolo-indifferenti.

I valori di attributo sono in generale maiuscolo-indifferenti. La definizione di ciascun attributo nel manuale di riferimento indica se il suo valore è maiuscolo-indifferente.

Tutti gli attributi definiti da queste specifiche sono elencati nell'indice degli attributi.

3.2.3 Riferimenti a caratteri

I riferimenti a caratteri sono nomi numerici o simbolici che stanno in luogo di caratteri che possono essere inclusi in un documento HTML. Essi sono utili come rimandi a caratteri usati raramente o a caratteri che gli strumenti autoriali rendono difficile o impossibile inserire. I riferimenti a caratteri saranno visibili attraverso l'intero documento; essi cominciano con il simbolo "&" e terminano con un punto e virgola (;). Alcuni esempi comuni comprendono:

I riferimenti a caratteri in HTML saranno discussi in dettaglio nella sezione sull'insieme dei caratteri di un documento HTML. Le specifiche contengono anche un elenco dei riferimenti a caratteri che possono comparire all'interno di documenti HTML 4.

3.2.4 Commenti

I commenti in HTML hanno la seguente sintassi:

<!-- questo è un commento -->
<!-- e così è il commento
    che occupa più di una riga -->

Non sono permessi spazi bianchi tra il delimitatore di apertura della dichiarazione di marcatura ("<!") e il delimitatore di apertura del commento ("--"), ma sono permessi tra il delimitatore di chiusura del commento ("--") e il delimitatore di chiusura della dichiarazione di marcatura (">"). Un errore comune consiste nell'includere in un commento una stringa di trattini d'unione ("---"). Gli autori dovrebbero evitare di inserire due o più trattini adiacenti all'interno dei commenti.

Le informazioni che appaiono all'interno di commenti non hanno alcun significato particolare (ad esempio i riferimenti a caratteri non sono interpretati come tali).

Si noti che i commenti appartengono al codice di marcatura.

3.3 Come leggere la DTD HTML

Ogni dichiarazione di elemento e di attributo in queste specifiche è accompagnata dal suo frammento di definizione del tipo di documento. Abbiamo scelto di includere i frammenti di DTD nelle specifiche piuttosto che cercare un sistema più accessibile, ma più lungo e meno preciso di descrivere le proprietà di un elemento. La seguente guida dovrebbe consentire ai lettori che non hanno familiarità con SGML di leggere la DTD e di comprendere i dettagli tecnici delle specifiche HTML.

3.3.1 Commenti nella DTD

In DTD i commenti possono estendersi su uno o più righe. I commenti nelle DTD sono delimitati da una coppia di segni "--", ad esempio

<!ELEMENT PARAM - O EMPTY       -- valore di proprietà denominata -->

Qui il commento "valore di proprietà denominata" spiega l'uso del tipo di elemento PARAM. I commenti nella DTD sono soltanto informativi.

3.3.2 Definizioni delle entità parametro

La DTD HTML comincia con una serie di definizioni di entità parametro. Una definizione di entità parametro definisce un tipo di macroistruzione che può essere richiamato e sviluppato in un altro luogo della DTD. Altri tipi di macro, chiamati riferimenti a carattere, possono essere usati nel testo di un documento HTML o all'interno di valori di attributo.

Quando l'entità parametro è richiamata da un nome nella DTD, essa viene espansa in una stringa.

Una definizione di entità parametro comincia con la parola chiave <!ENTITY % seguita dal nome dell'entità, dalla stringa tra apici nella quale l'entità si espande ed infine da un > di chiusura. Le istanze di entità parametro in una DTD cominciano con "%" seguito dal nome dell'entità parametro e terminano con un ";" facoltativo.

L'esempio seguente definisce la stringa in cui l'entità "%fontstyle;" si espanderà.

<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">

La stringa in cui l'entità parametro si espande può contenere altri nomi di entità parametro. Questi nomi sono espansi in modo ricorsivo. Nell'esempio che segue l'entità parametro "%inline;" è definita in modo da includere le entità parametro "%fontstyle;", "%phrase;", "%special;" e "%formctrl;".

<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

Nella DTD HTML si incontreranno frequentemente due entità DTD: "%block;" e "%inline;". Esse sono usate quando il modello di contenuto include rispettivamente elementi a livello di blocco ed in riga (definiti nella sezione sulla struttura globale di un documento HTML).

3.3.3 Dichiarazioni di elemento

La maggior parte della DTD HTML è costituita dalle dichiarazioni dei tipi di elemento e dei loro attributi. La parola chiave <!ELEMENT comincia una dichiarazione e il carattere > la conclude. Nel mezzo sono specificati:

  1. Il nome dell'elemento.
  2. Se i marcatori dell'elemento sono facoltativi. Due trattini posti dopo il nome dell'elemento indicano che i marcatori di apertura e di chiusura sono obbligatori. Un solo trattino seguito dalla lettera "O" significa che il marcatore di chiusura può essere omesso. Una coppia di lettere "O" indica che entrambi i marcatori, iniziale e finale, possono essere omessi.
  3. Il contenuto dell'elemento, se ammesso. Il contenuto legale di un elemento è definito il suo modello di contenuto. I tipi di elemento che sono progettati per non avere contenuto sono chiamati elementi vuoti. Il modello di contenuto per tali tipi di elemento è dichiarato usando la parola chiave "EMPTY".

In questo esempio:

    <!ELEMENT UL - - (LI)+>

Quest'esempio illustra la dichiarazione di un tipo di elemento vuoto:

    <!ELEMENT IMG - O EMPTY>

Definizioni del modello di contenuto 

Il modello di contenuto descrive che cosa può essere contenuto da un'istanza di un tipo di elemento. Le definizioni del modello di contenuto possono comprendere:

Il modello di contenuto di un elemento è specificato per mezzo della seguente sintassi. Si tenga presente che l'elenco seguente è una semplificazione delle regole della sintassi completa di SGML e non tratta, ad es., le precedenze.

( ... )
Delimita un gruppo.
A
A deve essere presente un'unica volta.
A+
A deve essere presente una o più volte.
A?
A deve essere presente zero o più volte.
A*
A può essere presente zero o più volte.
+(A)
A può essere presente.
-(A)
A non deve essere presente.
A | B
Devono essere presenti A o B, ma non insieme.
A , B
Sia A sia B devono essere presenti, nell'ordine dato.
A & B
Sia A sia B devono essere presenti, in un qualsiasi ordine.

Ecco alcuni esempi tratti dalla DTD HTML:

   <!ELEMENT UL - - (LI)+>

L'elemento UL deve contenere uno o più elementi LI.

   <!ELEMENT DL    - - (DT|DD)+>

L'elemento DL deve contenere uno o più elementi DT o DD in un ordine qualsiasi.

   <!ELEMENT OPTION - O (#PCDATA)>

L'elemento OPTION può contenere solo testo ed entità come &amp; -- ciò è rappresentato dal tipo di dato SGML #PCDATA.

Alcuni elementi HTML usano una caratteristica aggiuntiva di SGML per escludere degli elementi dal proprio modello di contenuto. Gli elementi esclusi sono preceduti da un trattino. Le esclusioni esplicite hanno la priorità sugli elementi permessi.

In questo esempio -(A) significa che l'elemento A non può apparire all'interno di un altro elemento A (cioè le ancore non possono essere annidate).

   <!ELEMENT A - - (%inline;)* -(A)>

Si noti che il tipo di elemento A fa parte dell'entità parametro DTD "%inline;", ma esso è escluso esplicitamente per mezzo di -(A).

In modo analogo, la seguente dichiarazione del tipo di elemento per FORM proibisce moduli annidati:

   <!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>

3.3.4 Dichiarazioni di attributo

La parola chiave <!ATTLIST segna l'inizio della dichiarazione di attributi che un elemento può prendere. Essa è seguita dal nome dell'elemento in questione, da un elenco di definizioni di attributo e da un > di chiusura. Ogni definizione di attributo è una tripletta che definisce:

In questo esempio viene definito l'attributo name dell'elemento MAP. L'attributo è facoltativo per questo elemento.

<!ATTLIST MAP
  name        CDATA     #IMPLIED
  >

Il tipo di valori permessi per quest'attributo è determinato come CDATA, un tipo di dati SGML. CDATA rappresenta testo che può contenere riferimenti a caratteri.

Per maggiori informazioni su "CDATA", "NAME", "ID" e altri tipi di dati, si consulti la sezione sui tipi di dati HTML.

I seguenti esempi illustrano una serie di definizioni di attributo:

rowspan     NUMBER     1         -- numero di righe su cui si estende una cella --
http-equiv  NAME       #IMPLIED  -- nome dell'intestazione HTTP di risposta --
id          ID         #IMPLIED  -- id unico all'interno del documento -- 
valign      (top|middle|bottom|baseline) #IMPLIED

L'attributo rowspan richiede valori di tipo NUMBER. "1" è dato esplicitamente come il valore predefinito. L'attributo facoltativo http-equiv richiede valori di tipo NAME. L'attributo facoltativo id richiede valori di tipo ID. L'attributo facoltativo valign è vincolato a prendere valori dall'insieme {top, middle, bottom, baseline}.

Entità DTD nelle definizioni di attributo

Le definizioni di attributo possono contenere anche riferimenti ad entità parametro.

In questo esempio possiamo vedere che l'elenco di definizioni di attributo per l'elemento LINK comincia con l'entità parametro "%attrs;".

<!ELEMENT LINK - O EMPTY               -- un collegamento indipendente dal mezzo -->
<!ATTLIST LINK
  %attrs;                              -- %coreattrs, %i18n, %events --
  charset     %Charset;      #IMPLIED  -- codifica del carattere di risorsa collegata --
  href        %URI;          #IMPLIED  -- URI di una risorsa collegata --
  hreflang    %LanguageCode; #IMPLIED  -- codice di lingua --
  type        %ContentType;  #IMPLIED  -- tipo di contenuto per la consultazione --
  rel         %LinkTypes;    #IMPLIED  -- tipi di collegamento in avanti --
  rev         %LinkTypes;    #IMPLIED  -- tipi di collegamento all'indietro --
  media       %MediaDesc;    #IMPLIED  -- per la riproduzione su questi media --
  >

Marcatore iniziale: obbligatorio, marcatore finale: proibito

L'entità parametro "%attrs;" è definita come segue:

<!ENTITY % attrs "%coreattrs; %i18n; %events;">

L'entità parametro "%coreattrs;", presente nella definizione di "%attrs;", si espande nel modo che segue:

<!ENTITY % coreattrs
 "id          ID             #IMPLIED  -- id unico all'interno del documento --
  class       CDATA          #IMPLIED  -- elenco di classi separate da spazi --
  style       %StyleSheet;   #IMPLIED  -- info sullo stile associato --
  title       %Text;         #IMPLIED  -- titolo per la consultazione --"
  >

Per convenienza è stata definita l'entità parametro "%attrs;", dal momento che questi attributi sono definiti per la maggior parte dei tipi di elemento HTML.

In modo analogo, la DTD definisce l'entità parametro "%URI;" come espandentesi nella stringa "CDATA".

<!ENTITY % URI "CDATA"
    -- un Identificatore Uniforme di Risorsa,
       si veda [URI]
    -->

Come chiarisce questo esempio, l'entità parametro "%URI;" fornisce ai lettori della DTD maggiori informazioni circa il tipo di dati atteso per un attributo. Sono definite in modo similare le entità "%Color;", "%Charset;", "%Length;", "%Pixels;", ecc.

Attributi booleani

Alcuni attributi svolgono il ruolo di variabili booleane (ad es. l'attributo selected per l'elemento OPTION). Il loro apparire nel marcatore di apertura di un elemento sottintende che il valore dell'elemento è "true" ["vero"]. La loro assenza sottintende il valore "false" ["falso"].

Gli attributi booleani possono prendere legalmente un unico valore: il nome dell'attributo stesso (es., selected="selected").

L'esempio che segue definisce l'attributo selected come un attributo booleano.

selected     (selected)  #IMPLIED  -- l'opzione è preselezionata --

L'attributo è impostato a "true" per il fatto che compare nel marcatore iniziale dell'elemento:

<OPTION selected="selected">
...contenuti...
</OPTION>

In HTML gli attributi booleani possono apparire in forma minimizzata -- il valore dell'attributo compare da solo nel marcatore iniziale dell'elemento. Pertanto selected può essere impostato scrivendo:

<OPTION selected>

invece di:

<OPTION selected="selected">

Gli autori dovrebbero essere informati del fatto che molti programmi utente riconoscono soltanto la forma minimizzata degli attributi booleani e non la loro forma completa.