3 Riguardo a SGML e HTML

Argomenti

  1. Introduzione a SGML
  2. Costrutti SGML usati in HTML
    1. Elementi
    2. Attributi
    3. Referenze al carattere
    4. Commenti
  3. Come leggere la DTD HTML
    1. Commenti nella DTD
    2. Definizioni delle entità parametro
    3. Dichiarazioni degli elementi
    4. Dichiarazioni degli attributi

Questa sezione del documento introduce SGML e descrive la sua relazione con HTML. Per una discussione completa di SGML si rimanda allo standard (si veda [ISO8879] ).

3.1 Introduzione a SGML

SGML è un sistema per definire linguaggi di marcatura. Gli autori marcano i loro documenti rappresentando informazioni riguardanti struttura, presentazione e semantica accanto al contenuto. Ecco un esempio di documento HTML:

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

Un documento HTML è suddiviso in una intestazione (qui, tra <HEAD> e </HEAD>) e un corpo (qui, tra <BODY> e </BODY>). Il titolo del documento appare nell'intestazione (assieme ad altre informazioni relative al documento), e il contenuto del documento appare nel corpo. Il corpo in questo esempio contiene un solo paragrafo, marcato con <P>.

Ogni linguaggio di marcatura definito in SGML è chiamato 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 referenze al carattere mediante entità carattere.
  3. Le specifiche che descrivono la semantica da assegnare alla marcatura. Queste specifiche impongono anche restrizioni sintattiche che non possono essere espresse all'interno della DTD.
  4. Istanze di documenti contenenti dati (contenuto) e marcatura. Ciascuna istanza contiene un riferimento alla DTD da utilizzare per la sua interpretazione.

Le Specifiche HTML 4.0 includono una dichiarazione SGML, tre definizioni del tipo di documento (si veda la sezione relativa alle informazioni sulla versione di HTML per una loro descrizione), e un elenco di referenze al carattere.

3.2 Costrutti SGML usati in HTML

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

L'appendice elenca alcune caratteristiche SGML che non sono ampiamente supportate da strumenti e interpreti HTML e che dovrebbero essere evitate.

3.2.1 Elementi

Una definizione del tipo di documento SGML dichiara i tipi di elementi che rappresentano strutture o comportamenti desiderati. HTML include tipi di elementi che rappresentano paragrafi, collegamenti ipertestuali, elenchi, tabelle, immagini, ecc.

Ciascuna dichiarazione del tipo di elemento presenta generalmente tre parti: un tag di inizio, il contenuto, e un tag di fine.

Il nome dell'elemento appare nel tag di inizio (scritto <nome-elemento>) e nel tag di fine (scritto </nome-elemento>); si noti il carattere barra ("/") prima del nome dell'elemento nel tag di fine. Per esempio, i tag di inizio e di fine 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 elementi HTML permettono agli autori di omettere i tag di fine (ad es., i tipi di elementi P e LI). Un numero ridotto di tipi di elementi permette anche di omettere i tag di inizio; per esempio, HEAD e BODY. La DTD HTML indica per ciscun tipo di elemento se il tag di inizio ed il tag di fine sono obbligatori.

Alcuni tipi di elementi HTML non hanno contenuto. Per esempio, l'elemento interruzione di riga BR non ha contenuto; il suo unico compito è quello di terminare una riga di testo. Tali elementi vuoti non hanno mai tag di fine. La definizione del tipo di documento e il testo delle Specifiche indicano se un tipo di elemento è vuoto (non ha contenuto) o, nel caso possa avere contenuto, quale contenuto è considerato legale.

I nomi di elemento sono sempre insensibili alla forma maiuscola/minuscola delle lettere che li specificano.

Si consulti lo standard SGML per informazioni sulle regole che governano gli elementi (ad es., gli elementi devono essere annidati appropriatamente, un tag di fine chiude, a ritroso fino al tag di inizio corrispondente (sezione 7.5.1), tutti i tag di inizio interposti non chiusi con tag di fine omessi, ecc.).

Per esempio, il seguente paragrafo:

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

può essere riscritto senza il suo tag di fine:

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

poichè il tag di inizio <P> è chiuso dal successivo elemento a livello del blocco. Similmente, se un paragrafo è racchiuso da un elemento a livello del blocco, come in:

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

il tag di fine dell'elemento a livello del blocco che lo racchiude sottintende il tag di fine del tag di inizio <P> aperto.

Gli elementi non sono tag. Alcune persone si riferiscono agli elementi come a tag (ad es., "il tag P"). Si ricordi che l'elemento è una cosa, e il tag (che sia di inizio o di fine) un'altra. Per esempio, l'elemento HEAD è sempre presente, anche se i tag HEAD di inizio e di fine possono entrambi mancare nella marcatura.

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

3.2.2 Attributi

Gli elementi possono avere proprietà associate, chiamate attributi, che possono avere valori (predefiniti, oppure impostati da autori o script). Le coppie attributo/valore appaiono prima del ">" finale del tag di inizio di un elemento. Può apparire un qualunque numero di coppie (legali) attributo valore, separate da spazi, nel tag di inizio di un elemento. Le coppie possono apparire in un ordine qualsiasi.

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

<H1 id="sezione 1">
Questa è una intitolazione identificabile 
grazie all'attributo id
</H1> 

Per predefinizione, SGML richiede che tutti i valori di attributo siano delimitati usando o doppi apici (ASCII decimale 34) o apici semplici (ASCII decimale 39). Gli apici semplici possono essere inclusi dentro il valore di attributo quando il valore è delimitato da doppi apici, e viceversa. Gli autori possono usare anche referenze al carattere numeriche per rappresentare doppi apici (&#34;) e apici semplici (&#39;). Per i doppi apici gli autori possono usare anche la referenza di entità carattere &quot;.

In certi casi, gli autori possono specificare il valore di un attributo senza utilizzare alcun apice. Il valore dell'attributo può contenere solo lettere (a-z e A-Z), cifre (0-9), trattini (ASCII decimale 45), e punti (ASCII decimale 46). Si raccomanda di utilizzare gli apici anche quando è possibile eliminarli.

I nomi di attributo sono sempre insensibili alla forma maiuscola/minuscola delle lettere che li specificano.

I valori degli attributi sono generalmente insensibili alla forma maiuscola/minuscola delle lettere che li specificano. La definizione di ogni attributo nel manuale di riferimento indica se il valore è insensibile alla forma maiuscola/minuscola delle lettere.

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

3.2.3 Referenze al carattere

Le referenze al carattere sono nomi numerici o simbolici per i caratteri che possono essere inclusi in un documento HTML. Sono utili per riferirsi a caratteri raramente usati, o a quelli che risulta difficile o impossibile inserire tramite gli strumenti di creazione. Si vedranno referenze al carattere dal principio alla fine di questo documento; esse cominciano con un segno "&" e terminano con un punto e virgola (;). Alcuni esempi comuni includono:

Si discuteranno le referenze al carattere HTML in dettaglio più avanti nella sezione sull'insieme di caratteri del documento HTML . Le Specifiche contengono anche un'elenco di referenze ai caratteri che possono apparire nei documenti HTML 4.0.

3.2.4 Commenti

I commenti HTML hanno la seguente sintassi:

<!-- questo è un commento -->
<!-- anche questo è un commento,
    che occupa più di una riga -->

Lo spazio bianco non è permesso tra il delimitatore di apertura della dichiarazione di marcatura ("<!") e il delimitatore di apertura del commento ("--"), ma è permesso tra il delimitatore di chiusura del commento ("--") e il delimitatore di chiusura della dichiarazione di marcatura (">"). Un errore comune è l'inclusione di una stringa di trattini ("---") dentro un commento. Gli autori dovrebbero evitare di porre due o più trattini adiacenti nei commenti.

L'informazione che appare in mezzo ai commenti non ha significato speciale (ad es., le referenze al carattere non sono interpretate come tali).

3.3 Come leggere la DTD HTML

Ciascuna dichiarazione di elemento e di attributo in queste Specifiche è accompagnata dal suo frammento di definizione del tipo di documento. Si è scelto di includere i frammenti DTD nelle Specifiche piuttosto che ricorrere a un mezzo più facile, ma più lungo e meno preciso, per descrivere le proprietà di un elemento. La seguente guida dovrebbe permettere ai lettori non familiari con SGML di leggere la DTD e comprendere i dettagli tecnici delle Specifiche HTML.

3.3.1 Commenti nella DTD

Nelle DTD, i commenti possono estendersi su una o più righe. Nella DTD, i commenti sono delimitati da una coppia di interpunzioni "--", ad es.

<!ELEMENT PARAM - O EMPTY       -- valore di proprietà 
                                   con nome assegnato -->
Qui, il commento "valore di proprietà con nome assegnato" spiega l'uso del tipo di elemento PARAM. I commenti nella DTD sono solo informativi.

3.3.2 Definizioni delle entità parametro

La DTD HTML incomincia con una serie di definizioni di entità parametro. Una definizione di entità parametro definisce un tipo di macro che può essere richiamata ed espansa altrove nella DTD. Queste macro non possono apparire nei documenti HTML, solo nella DTD. Altri tipi di macro, chiamate referenze al carattere, possono essere usate nel testo di un documento HTML o dentro i valori di attributo.

Quando l'entità parametro viene riferita per nome nella DTD, essa viene espansa in una stringa.

Una definizione di entità parametro inizia con la parola chiave <!ENTITY % seguita dal nome dell'entità, la stringa tra apici in cui l'entità si espande, e infine un > di chiusura. Le instanze di entità parametro in una DTD iniziano con "%", proseguono con il nome dell'entità parametro, e terminano con un ";" opzionale.

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 ricorsivamente. Nell'esempio seguente si definisce l'entità parametro"%inline;" per raggruppare le entità parametro "%fontstyle;", "%phrase;", "%special;" e "%formctrl;".

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

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

3.3.3 Dichiarazioni degli elementi

La maggior parte della DTD HTML è composta dalle dichiarazioni dei tipi di elementi e dei loro attributi. La parola chiave <!ELEMENT inizia una dichiarazione e il carattere > la termina. In mezzo a questi vengono specificati:

  1. Il nome dell'elemento.
  2. Se i tag dell'elemento sono opzionali. Due trattini che appaiono dopo il nome dell'elemento significano che i tag di inizio e di fine sono obbligatori. Un trattino seguito dalla lettera "O" indica che il tag di fine può essere omesso. Una coppia di lettere "O" indica che entrambi i tag di inizio e di fine possono essere omessi.
  3. Il contenuto dell'elemento, se presente. Il contenuto ammissibile di un elemento è chiamato modello di contenuto. I tipi di elementi che sono destinati a non avere contenuto sono chiamati elementi vuoti. Il modello di contenuto per tali tipi di elementi è dichiarato usando la parola chiave "EMPTY".

In questo esempio:

    <!ELEMENT UL - - (LI)+>

Questo esempio illustra la dichiarazione di un tipo di elemento vuoto:

    <!ELEMENT IMG - O EMPTY>

Definizioni dei modelli di contenuto  

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

Il modello di contenuto di un elemento è specificato tramite la seguente sintassi:

( ... )
Delimita un gruppo.
A | B
Sono presenti o A o B, ma non entrambi.
A , B
Sono presenti A e B, in questo ordine.
A & B
Sono presenti A e B, in un ordine qualsiasi.
A?
A è presente zero o una volta.
A*
A è presente zero o più volte.
A+
A è presente una o più volte.

Ecco alcuni esempi 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à, quali &amp; -- questo è indicato dal tipo di dato SGML #PCDATA.

Qualche tipo di elemento HTML usa una caratteristica addizionale di SGML per escludere elementi dal proprio modello di contenuto. Gli elementi esclusi sono preceduti da un trattino. Le esclusioni esplicite prevalgono sugli elementi permessi.

In questo esempio, -(A) significa che l'elemento A non può apparire in un altro elemento A (ovverosia, le ancore non possono essere annidate).

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

Si noti che il tipo di elemento A è parte dell'entità parametro DTD "%inline;", ma è esplicitamente escluso a causa della presenza di -(A).

Analogamente, la seguente dichiarazione del tipo di elemento FORM proibisce forme annidate:

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

3.3.4 Dichiarazioni degli attributi

La parola chiave <!ATTLIST inizia la dichiarazione degli attributi che un elemento può avere. È seguita dal nome dell'elemento in questione, una lista di definizioni di attributo, e un > di chiusura. Ciascuna definizione di attributo è una tripla che definisce:

In questo esempio viene definito l'attributo nome per l'elemento MAP. L'attributo è opzionale per questo elemento.

<!ATTLIST MAP
  name        CDATA     #IMPLIED
  >

Il tipo di valori permessi per l'attributo è specificato come CDATA, un tipo di dato SGML. CDATA è testo che può contenere referenze ai caratteri.

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

Gli esempi seguenti illustrano diverse definizioni di attibuto:

rowspan     NUMBER     1         -- numero di righe occupate da una cella --
http-equiv  NAME       #IMPLIED  -- nome dell'intestazione HTTP di risposta --
id          ID         #IMPLIED  -- identificatore unico nell'ambito del documento -- 
valign      (top|middle|bottom|baseline) #IMPLIED

L'attributo rowspan richiede valori di tipo NUMBER. Il valore predefinito è specificato esplicitamente come "1". L'attributo opzionale http-equiv richiede valori di tipo NAME. L'attributo opzionale id richiede valori di tipo ID. Il valore opzionale valign è obbligato ad assumere valori nell'insieme {top, middle, bottom, baseline}.

Entità DTD nelle definizioni degli attributi  

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

In questo esempio si vede che l'elenco delle definizioni di attributo per l'elemento LINK inizia con l'entità parametro "%attrs;".

<!ELEMENT LINK - O EMPTY               -- collegamento indipendente dai media -->
<!ATTLIST LINK
  %attrs;                              -- entità %coreattrs, %i18n, %events --
  charset     %Charset;      #IMPLIED  -- codifica dei caratteri della risorsa collegata --
  href        %URI;          #IMPLIED  -- URI della risorsa collegata --
  hreflang    %LanguageCode; #IMPLIED  -- codice di lingua --
  type        %ContentType;  #IMPLIED  -- tipo di contenuto con funzione guida --
  rel         %LinkTypes;    #IMPLIED  -- tipi di collegamento diretti --
  rev         %LinkTypes;    #IMPLIED  -- tipi di collegamenti inversi --
  media       %MediaDesc;    #IMPLIED  -- per la riproduzione su questi media --
  >

Tag di inizio: obbligatorio, Tag di fine: proibito

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

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

L'entità parametro "%coreattrs;" nella definizione"%attrs;" si espande come segue:

<!ENTITY % coreattrs
 "id          ID             #IMPLIED  -- identificatore unico nell'ambito del documento --
  class       CDATA          #IMPLIED  -- elenco di classi separate da spazi --
  style       %StyleSheet;   #IMPLIED  -- informazioni di stile associate --
  title       %Text;         #IMPLIED  -- titolo/espansione con funzione guida --"
  >

L'entità parametro "%attrs;" è stata definita per convenienza poichè questi attributi sono definiti per la maggior parte dei tipi di elementi HTML.

Analogamente, la DTD definisce l'entità parametro "%URI;" come entità che si espande nella stringa "CDATA".

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

Come questo esempio illustra, l'entità parametro"%URI;" fornisce ai lettori della DTD maggiori informazioni circa il tipo di dato aspettato per un attributo. Entità analoghe sono state definite per "%Color;", "%Charset;", "%Length;", "%Pixels;", ecc.

Attributi booleani 

Alcuni attributi giocano il ruolo di variabili booleane (ad es., l'attributo selected per l'elemento OPTION). La loro apparizione nel tag di inizio di un elemento implica che il valore dell'attributo è "vero". La loro assenza implica un valore pari a "falso".

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

Questo esempio definisce l'attributo selected come un attributo booleano.

selected     (selected)  #IMPLIED  -- spaziatura ridotta tra le voci --
(n.d.t.: il commento "spaziatura ridotta tra le voci" è errato: è relativo all'attributo booleano "compact" )

L'attributo è impostato a "vero" dato che appare nel tag di inizio dell'elemento:

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

In HTML, gli attributi booleani possono apparire in forma minimizzata -- il valore dell'attributo appare da solo nel tag di inizio dell'elemento. Quindi, selected può essere impostato scrivendo:

<OPTION selected>

invece di:

<OPTION selected="selected">

Gli autori dovrebbero essere consapevoli che molti interpreti HTML riconoscono solo la forma minimizzata degli attributi booleani e non la forma completa.