Questa sezione del documento introduce SGML e discute le sue relazioni con HTML. Una discussione completa su SGML è lasciata allo standard (si veda [ISO8879]).
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:
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.
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.
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.
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 (") ed apici singoli ('). In luogo dei doppi apici gli autori possono utilizzare anche il riferimento ad entità carattere ".
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.
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.
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.
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.
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.
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).
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:
In questo esempio:
<!ELEMENT UL - - (LI)+>
Quest'esempio illustra la dichiarazione di un tipo di elemento vuoto:
<!ELEMENT IMG - O EMPTY>
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.
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 & -- 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)>
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}.
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:
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".
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.
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.