3 Riguardo SGML e HTML

Argomenti

  1. Introduzione a SGML
  2. Costrutti SGML usati in HTML
    1. Elementi
    2. Attributi
    3. Riferimenti ai caratteri
    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 illustra la sua relazione con HTML. Per una discussione completa di SGML si rimanda allo standard (vedere [ISO8879] ).

3.1 Introduzione a SGML

SGML è un sistema per definire linguaggi di marcatura (markup). Gli autori marcano i loro documenti rappresentando informazione strutturale, di visualizzazione e semantica accanto al contenuto. Questo è 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 HTML</TITLE>
   </HEAD>
   <BODY>
      <P>Ciao mondo!
   </BODY>
</HTML>

Un documento HTML è diviso in una sezione di testa (qui, tra <HEAD> e </HEAD>) e un corpo (qui, tra <BODY> e </BODY>). Il titolo del documento appare nella sezione di testa (assieme ad altre informazioni relative al documento), ed 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. Una 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 denominazioni di entità carattere.
  3. Una specifica che descrive la semantica da assegnare alla marcatura. Questa specifica impone anche restrizioni sintattiche che non possono essere espresse nella DTD.
  4. Istanze di documento contenenti dati (contenuto) e marcatura. Ciascuna istanza contiene un riferimento alla DTD usata per interpretarla.

La specifica HTML 4.0 include una dichiarazione SGML, tre definizioni di tipo di documento (per una loro descrizione si veda la sezione relativa alla informazione sulla versione dell'HTML), e una lista di denominazioni di caratteri.

3.2 Costrutti SGML usati in HTML

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

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

3.2.1 Elementi

Una definizione del tipo di documento SGML dichiara i tipi di elemento che rappresentano strutture o comportamenti desiderati. HTML include tipi di elemento che rappresentano paragrafi, collegamenti ad ipertesti, liste, tabelle, immagini, ecc.

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

Il nome dell'elemento appare nel tag iniziale (scritto <nome-elemento>) e nel etichetta di fine (scritto </nome-elemento>); si noti il carattere barra ("/") che precede il nome dell'elemento nel tag finale. Per esempio, i tag iniziali e finali del tipo di elemento UL delimitano i componenti di una lista:

<UL>
<LI><P>...componente 1 della lista...
<LI><P>...componente 2 della lista...
</UL>

Alcuni tipi di elemento HTML permettono agli autori di omettere i tag finali (ad es. i tipi di elemento P e LI). Alcuni tipi di elemento permettono anche di omettere i tag iniziali ; per esempio, HEAD e BODY. La DTD HTML indica per ciscun tipo di elemento se il tag iniziale ed il tag finale sono richiesti.

Alcuni tipi di elemento 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. Questi elementi vuoti non hanno mai tags di fine. La definizione del tipo di documento e il testo della specifica 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 indifferenti alla distinzione delle maiuscole.

Si rimanda allo standard SGML per informazioni sulle regole che governano gli elementi (ad es. gli elementi devono essere annidati appropriatamente, un tag finale chiude, a ritroso fino al tag iniziale corrispondente, tutti i tag iniziali omessi (paragrafo 7.5.1), ecc.).

Per esempio, il seguente paragrafo:

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

può essere riscritto senza il suo tag finale:

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

poichè il tag iniziale <P> è chiuso dall'elemento "a blocco" seguente. Similmente, se un paragrafo è racchiuso da un elemento "a blocco", come in:

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

il tag finale dell'elemento "a blocco" che lo racchiude sottointende il tag finale del tag iniziale aperto <P>.

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 entrambi i tag HEAD iniziali e finali possono mancare nella marcatura.

Tutti i tipi di elemento dichiarati in questa specifica sono listati 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). Coppie attributi/valore appaiono prima del ">" finale del tag iniziale di un elemento. Un qualunque numero di coppie (legali) attributo valore, separate da spazi, possono apparire, nel tag di inizio di un elemento. Esse possono apparire in un ordine qualsiasi.

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

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

Per impostazione predefinita, SGML richiede che tutti i valori di attributo siano delimitati usando o doppi apici (ASCII decimale 34) o apici semplici (ASCII decimale 39). Apici semplici possono essere inclusi all'interno del valore dell'attributo quando il valore è delimitato da doppi apici, e viceversa. Gli autori possono usare anche riferimenti numerici ai caratteri per rappresentare doppi apici (&#34;) e apici semplici (&#39;). Per i doppi apici gli autori possono usare anche il riferimento ad entità di carattere &quot;.

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

I nomi di attributo sono sempre indifferenti alla distinzione delle maiuscole.

I valori degli attributi sono generalmente indifferenti alle maiuscole. La definizione di ciascun attributo nel manuale di riferimento indica se il valore è maiuscolo indifferente.

Tutti gli attributi definiti in questa specifica sono elencati nell'indice degli attributi.

3.2.3 Riferimenti ai caratteri

I riferimenti ai caratteri sono nomi numerici o simbolici associati a caratteri che possono essere inclusi in un documento HTML. Sono utili per riferirsi a caratteri raramente usati, o a quelli che risultano difficili o impossibili da inserire con gli strumenti di creazione dei documenti. Si vedranno denominazioni di caratteri da un capo all'altro di questo documento; esse iniziano con un segno"&" e terminano con un punto e virgola (;). Alcuni esempi frequenti sono:

I riferimenti ai carattere nell'HTML sono presentate in dettaglio più avanti nella sezione riguardante l'insieme di caratteri nel documento HTML . Anche la specifica contiene un'elenco di riferimenti 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 linea -->

Lo spazio bianco non è permesso tra l'indicatore di apertura di dichiarazione di marcatura ("<!") e l'indicatore di apertura di commento ("--"), ma è permesso tra l'indicatore di chiusura di commento ("--") e l'indicatore di chiusura di dichiarazione di marcatura (">"). Un errore comune è l'includere una stringa di trattini ("---") in un commento. Gli autori dovrebbero evitare di mettere due o più trattini adiacenti all'interno di un commento.

L'informazione che appare tra commenti non ha significato speciale (ad es. i riferimenti ai caratteri non sono interpretati come tali).

3.3 Come leggere la DTD HTML

Ciascuna dichiarazione di elemento e di attributo in questa specifica è accompagnata dal suo frammento di definizione di tipo di documento. Abbiamo scelto di includere i frammenti DTD nella specifica piuttosto che cercare un mezzo più facile, ma più lungo e meno preciso per descrivere le proprietà di un elemento. La seguente presentazione introduttiva dovrebbe permettere ai lettori non familiari con SGML di leggere la DTD e comprendere i dettagli tecnici della specifica HTML.

3.3.1 Commenti nella DTD

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

<!ELEMENT PARAM - O EMPTY       -- valore di proprietà designato -->
Qui, il commento "valore di proprietà designato" 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 riferita ed espansa altrove nella DTD. Queste macro possono non apparire nei documenti HTML, solo nella DTD. Altri tipi di macro, chiamati riferimenti ai caratteri, possono essere usati nel testo di un documento HTML o nei valori di attributi.

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

Una definizione di entità di tipo 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. Instanze di entità parametro in una DTD iniziano con "%", continuano 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 nomi di entità parametro. Questi nomi sono espansi ricorsivamente. Nell'esempio seguente, l'entità parametro"%inline;" è definita per raggruppare le entità parametro "%fontstyle;", "%phrase;", "%special;" e "%formctrl;".

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

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

3.3.3 Dichiarazioni degli elementi

La maggioranza della DTD HTML consiste nelle dichiarazioni dei tipi di elemento ed i loro attributi. La parola chiave <!ELEMENT inizia una dichiarazione ed il carattere > la termina. Nel mezzo sono specificati:

  1. Il nome dell'elemento.
  2. Se i tag dell'elemento sono opzionale. Due trattini che appaiono dopo il nome dell'elemento indicano che i tag iniziali e finali sono obbligatori. Un trattino seguito dalla lettera "O" indica che il tag finale può essere omesso. Un paio di lettere "O" indicano che entrambe i tag iniziali e finali possono essere omessi.
  3. Il contenuto dell'elemento, se presente. Il contenuto ammissibile di un elemento è chiamato modello di contenuto. I tipi di elemento che sono designati a non avere contenuto sono chiamati elementi vuoti. Il modello di contenuto di questi 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 modello di contenuto.  

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

Il modello di contenuto di un elemento è specificato dalla 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 di 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ò solo contenere testo ed entità, quali &amp; -- questo è indicato dal tipo di dato SGML #PCDATA.

Alcuni tipi di elementi HTML usano una caratteristica SGML aggiuntiva per escludere elementi dal loro modello di contenuto. Gli elementi esclusi sono preceduti da un trattino. Esclusioni esplicite annullano elementi permessi.

In questo esempio, la notazione -(A) significa che l'elemento A non può apparire in un altro elemento A (cioè, 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 è escluso esplicitamente per la presenza di -(A).

Similmente, 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, l'attributo nome è definito per l'elemento MAP. L'attributo è opzionale per questo elemento.

<!ATTLIST MAP
  name        CDATA     #IMPLIED
  >

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

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

I seguenti esempi illustrano diverse definizioni di attibuto:

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

L'attributo rowspan richiede valori di tipo NUMBER. Il valore predefinito è esplicitamente indicato 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 di attributo  

La definizione di attributi può contenere anche riferimenti ad entità parametro.

In questo esempio, vediamo che la lista di definizioni di attributo per l'elemento LINK inizia con l'entità parametro "%attrs;".

<!ELEMENT LINK - O EMPTY               -- un riferimento indipendente dal  media -->
<!ATTLIST LINK
  %attrs;                              -- %coreattrs, %i18n, %events --
  charset     %Charset;      #IMPLIED  -- codifica carattere della risorsa riferita --
  href        %URI;          #IMPLIED  -- URI della risorsa riferita --
  hreflang    %LanguageCode; #IMPLIED  -- codifica del linguaggio --
  type        %ContentType;  #IMPLIED  -- tipo suggeritore di contenuto  --
  rel         %LinkTypes;    #IMPLIED  -- tipi di collegamento in avanti --
  rev         %LinkTypes;    #IMPLIED  -- tipi di collegamenti all'indietro  --
  media       %MediaDesc;    #IMPLIED  -- per visualizzare su questi media --
  >

Tag iniziale: richiesto, Tag finale: 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 globale al documento --
  class       CDATA          #IMPLIED  -- lista di classi separate da spazio --
  style       %StyleSheet;   #IMPLIED  -- informazioni sullo stile associato --
  title       %Text;         #IMPLIED  -- titolo suggeritore/amplificazione --"
  >

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

Similmente, la DTD definisce l'entità parametro "%URI;" come espandente nella stringa "CDATA".

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

Come questo esempio illustra, l'entità parametro"%URI;" fornisce al lettore della DTD maggiore informazione circa il tipo di dato aspettato per un attributo. Entità simili 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 implica che il valore dell'attributo è "vero". La loro assenza implica un valore di "falso".

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

Questo esempio definisce l'attributo selected come attributo booleano.

selected     (selected)  #IMPLIED  -- spaziatura ridotta tra componenti  --

L'attributo è impostato su "vero" apparendo nel tag iniziale dell'elemento:

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

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

<OPTION selected>

invece di:

<OPTION selected="selected">

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