[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico] [volume] [parte]
Fino a questo punto è stata ignorata la dichiarazione SGML, che in generale non dovrebbe essere un problema per l'utilizzatore, ma rappresenta pur sempre un elemento determinante per la comprensione della filosofia di questo linguaggio.
La dichiarazione SGML è qualcosa che viene prima del DTD; serve a definire la forma del sorgente e alcune caratteristiche del linguaggio utilizzato. Attraverso la dichiarazione si possono modificare molti comportamenti convenzionali, facendo anche cambiare aspetto notevolmente al linguaggio stesso. Tutto quello che è stato descritto di SGML nei capitoli precedenti, fa affidamento sulla dichiarazione SGML raccomandata, ma volendo si potrebbero cambiare molte cose. Per fare un esempio pratico, XML può essere inteso come un modo di utilizzare SGML in base a una dichiarazione particolare, realizzata per le esigenze specifiche della pubblicazione di documentazione attraverso la rete.
La dichiarazione SGML si fa generalmente in un file apposito; tutte le direttive sono contenute all'interno di un'istruzione sola del tipo seguente:
<!SGML "ISO 8879:1986"
...
...
...
>
In pratica, nel modello mostrato, le direttive occupano il posto dei puntini di sospensione.
Si osservi che lo standard originale ISO prevedeva la definizione 8879-1986, che successivamente è stata modificata nel modo mostrato, ovvero 8879:1986. Lo stesso ragionamento vale per gli altri standard ISO che prevedono l'indicazione dell'anno. |
Esiste una variante recente allo standard ISO 8879:1996 e precisamente si tratta di cambiamenti pensati per facilitare la comunicazione attraverso la rete. La stringa che fa riferimento a questo standard esteso è:
"ISO 8879:1986 (WWW)"
La si ritrova in particolare nella dichiarazione dell'HTML 4.* e nell'XML.
In questo capitolo vengono mostrate solo alcune direttive che possono essere utili per capire il senso della dichiarazione SGML. Per approfondire lo studio di questo linguaggio, bisogna procurarsi la documentazione originale ISO.
La codifica dei caratteri utilizzata nel sorgente SGML non può essere ignorata, soprattutto perché alcuni codici hanno significati speciali che vanno oltre il carattere vero e proprio. Le direttive riferite alla codifica del sorgente iniziano con la parola chiave CHARSET che delimita la sezione relativa:
CHARSET
definizione_riferita_all'insieme_di_caratteri
...
In generale, si inizia con la definizione di un insieme standard di riferimento, attraverso l'uso di un identificatore standard:
BASESET insieme_di_caratteri
L'identificatore che definisce lo standard è normalmente una stringa abbastanza dettagliata. L'esempio seguente definisce l'insieme di partenza corrispondente all'ISO 646:1983, ovvero all'ASCII tradizionale:
BASESET "ISO 646:1983//CHARSET International Reference Version (IRV)//ESC 2/5 4/0"
La direttiva appare su due righe, ma si tratta solo di una possibilità e non di una necessità, tanto che in alcuni casi la si può vedere anche distribuita su tre righe. Dopo la definizione dell'insieme di partenza, si può descrivere nel dettaglio l'utilizzo e la conversione dei codici corrispondenti ai caratteri:
DESCSET
inizio quantità {corrispondenza|UNUSED}
...
Si osservi l'esempio:
DESCSET 0 9 UNUSED 9 2 9 11 2 UNUSED 13 1 13 14 18 UNUSED 32 95 32 127 1 UNUSED
Il primo numero indica il codice corrispondente al carattere iniziale di un raggruppamento composto da una sequenza di n caratteri; il secondo valore indica una quantità di caratteri che possono essere ignorati oppure anche trasformati, partendo dal codice rappresentato dal terzo valore.
Nell'esempio, i codici che vanno da 0 a 8, in decimale, non sono utilizzati; inoltre i codici da 9 a 10 vengono convertiti con il codice 9 e seguenti (in pratica non vengono convertiti affatto). In sostanza, ciò che mostra l'esempio non ha lo scopo di convertire alcunché, ma solo di filtrare codici inutili: vengono lasciati passare i caratteri grafici, a partire dallo spazio, oltre a <HT>, <LF> e <CR>. Volendo esprimere la cosa in modo più esplicito, si possono usare anche dei commenti descrittivi:
DESCSET 0 9 UNUSED 9 1 9 -- HT -- 10 1 10 -- LF -- 11 2 UNUSED 13 1 13 -- CR -- 14 18 UNUSED 32 95 32 -- SP e altri caratteri grafici -- 127 1 UNUSED
La sequenza di direttive BASESET e DESCSET può anche essere ripetuta, quando dopo l'ASCII normale, i primi 7 bit, si vuole fare riferimento a qualcosa di più. Per esempio, la dichiarazione relativa alla codifica dell'HTML 3.2, si presenta come si vede di seguito:
CHARSET BASESET "ISO 646:1983//CHARSET International Reference Version (IRV)//ESC 2/5 4/0" DESCSET 0 9 UNUSED 9 2 9 11 2 UNUSED 13 1 13 14 18 UNUSED 32 95 32 127 1 UNUSED BASESET "ISO Registration Number 100//CHARSET ECMA-94 Right Part of Latin Alphabet Nr. 1//ESC 2/13 4/1" DESCSET 128 32 UNUSED 160 96 32
Rispetto a quanto già visto si aggiunge il riferimento allo standard ISO 8859-1 (Latin-1). Si può vedere che vengono esclusi i primi 32 codici a partire dal numero 128, che non contengono simboli grafici utili.
Per qualche ragione storica, che ormai non avrebbe più motivo di sussistere, è prevista una sezione attraverso la quale si definisce la capacità elaborativa dell'analizzatore SGML. Si tratta di stabilire dei limiti di spazio per la gestione di una serie di informazioni. In generale, non dovrebbe essere determinante la dimensione da dare ai vari attributi riferiti a questa capacità; tuttavia, si tratta di un'indicazione che rimane, per la quale si fa riferimento allo standard, oppure si indica semplicemente che non ci sono limiti. Nel primo caso si indica,
CAPACITY PUBLIC "ISO 8879:1986//CAPACITY Reference//EN"
nel secondo soltanto
CAPACITY NONE
A titolo di esempio si mostra anche la direttiva relativa riferita all'HTML 3.2 e 4:
CAPACITY SGMLREF TOTALCAP 150000 GRPCAP 150000 ENTCAP 150000
Si osservi la parola chiave SGMLREF che può essere usata anche altrove. Rappresenta il riferimento ai valori predefiniti SGML, prima di modificarli o integrarli con le richieste successive.
La sintassi del linguaggio SGML può essere alterata in parte, attraverso una serie di direttive descritte nella prossima sezione. L'ambito della definizione della sintassi SGML può essere controllato attraverso la direttiva SCOPE:
SCOPE DOCUMENT|INSTANCE
La direttiva SCOPE DOCUMENT indica che la sintassi si applica sia al DTD, sia al sorgente SGML; nell'altro caso, SCOPE INSTANCE si riferisce solo al sorgente, mentre il DTD va interpretato in base alla sintassi standard predefinita (la sintassi concreta di riferimento).
Di solito si usa la direttiva SCOPE DOCUMENT.
La sintassi concreta è ciò che definisce i delimitatori dei marcatori SGML, il ruolo dei codici di controllo e altri dettagli riferiti alla sintassi SGML. In particolare si parla di sintassi concreta di riferimento quando si vuole indicare quella predefinita, ovvero quella a cui si fa riferimento di solito. Le direttive che compongono la definizione della sintassi concreta sono introdotte dalla sezione SYNTAX, a cui spesso segue la stringa di un identificatore pubblico, per richiamare inizialmente una serie di caratteristiche standard che poi vengono alterate o integrate dalle direttive successive:
SYNTAX PUBLIC "ISO 8879:1986//SYNTAX Reference//EN"
La prima cosa che si specifica all'interno della dichiarazione della sintassi concreta è l'elenco dei numeri decimali corrispondenti ai codici, o caratteri, che non devono essere usati nel testo del sorgente. Questi non verranno passati all'applicazione successiva dall'analizzatore SGML. All'interno dei codici esclusi in questo modo ci possono essere comunque simboli o caratteri di controllo che servono in altri ambiti, come si vedrà in seguito.
La codifica a cui si fa riferimento, non è quella ottenuta dopo la trasformazione con la direttiva DESCSET della sezione CHARSET, ma quella della stessa direttiva della sezione SYNTAX, come verrà descritto tra poco. |
La direttiva in questione è molto semplice; spesso, quando si tratta dell'ASCII, si utilizza direttamente l'esempio seguente:
SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127
Nell'ambito della definizione della sintassi concreta, è necessario specificare nuovamente la codifica di partenza e la conversione eventuale. Tutto procede esattamente come è già stato visto in precedenza, nella sezione CHARSET, con la differenza che in generale si preferisce lasciare tutto come si trova:
BASESET "ISO 646:1983//CHARSET International Reference Version (IRV)//ESC 2/5 4/0" DESCSET 0 128 0
L'esempio si riferisce al caso in cui si utilizzi solo l'ASCII. Comunque, si può osservare che la direttiva DESCSET non esclude alcunché e non trasforma alcun carattere.
Si possono definire alcuni codici con funzioni speciali, attribuendo loro un nome, a cui si accede con macro del tipo &#nome;. Spesso si fa uso di queste macro nel DTD, precisamente nelle mappe di sostituzione. Si ricorderà che la macro &RE; fa riferimento convenzionalmente alla fine del record. Si osservi l'esempio seguente:
FUNCTION RE 13 RS 10 SPACE 32 TAB SEPCHAR 9
Si tratta della direttiva FUNCTION a cui segue la dichiarazione di una serie di nomi, abbinati al codice relativo. Si può osservare il caso del nome TAB, a cui si aggiunge la parola chiave SEPCHAR: si tratta effettivamente del carattere <HT>, che però, ai fini della sintassi concreta, viene tradotto con ciò che corrisponde a &SPACE;, cioè uno spazio normale.
Attraverso la sottosezione NAMING è possibile definire quali caratteri possono essere usati nei «nomi». In questo modo si intendono i nomi degli elementi, delle entità, degli attributi e di alcuni tipi di valori da associare agli attributi.
In generale, si fa riferimento alle lettere latine dell'alfabeto inglese e alle cifre numeriche, tenendo conto che in generale è concesso solo di iniziare con una lettera. Per modificare questo assunto si interviene in direttive particolari, che limitano il primo carattere, oppure quelli restanti.
LCNMSTRT "caratteri_ulteriori"
UCNMSTRT "caratteri_ulteriori"
Lower case name start, Upper case name start
Descrivono rispettivamente il primo carattere minuscolo e maiuscolo. In generale, si indica semplicemente la stringa nulla, "".
LCNMCHAR "caratteri_ulteriori"
UCNMCHAR "caratteri_ulteriori"
Lower case name characters, Upper case name characters
Descrivono rispettivamente i caratteri successivi al primo, minuscoli e maiuscoli. In generale, si indica semplicemente la stringa nulla, "".
NAMESTRT elenco_codici
NAMECHAR elenco_codici
Name start, Name characters
Descrivono rispettivamente i codici utilizzabili nel primo carattere e in quelli restanti. Si usano queste direttive particolarmente nella definizione di XML.
NAMECASE
Si tratta di un'ulteriore sotto-sottosezione, con la quale si definisce la trasformazione o meno in maiuscolo:
GENERAL YES|NO
in questo caso si controlla la conversione in maiuscolo di tutti i nomi, tranne le entità (nell'SGML tradizionale si attiva questa opzione);
ENTITY YES|NO
si controlla la conversione in maiuscolo dei nomi di entità e dei loro riferimenti: le macro (nell'SGML tradizionale non si attiva questa opzione).
Nell'SGML normale si utilizza abitualmente la sezione NAMING nel modo seguente:
NAMING LCNMSTRT "" UCNMSTRT "" LCNMCHAR "-." UCNMCHAR "-." NAMECASE GENERAL YES ENTITY NO
In questo modo, si può osservare che i nomi possono contenere anche il trattino (-) e il punto (.), ma non possono iniziare così; inoltre, tutti i nomi, tranne quelli delle entità, vengono convertiti in maiuscolo (si parla di normalizzazione), per cui non fa differenza in che modo sono stati scritti.
La sottosezione introdotta dalla parola chiave DELIM può servire per intervenire nella definizione dei delimitatori. In generale non si modifica nulla e ci si limita a confermare lo standard di riferimento, attraverso la parola chiave SGMLREF:
DELIM GENERAL SGMLREF SHORTREF SGMLREF
A volte viene disabilitato l'uso delle mappe di sostituzione nel DTD, attraverso la direttiva SHORTREF NONE, come avviene in XML.
Nell'HTML 4 e in XML è stata aggiunta la possibilità di indicare delle macro carattere nella forma &xn;, per rappresentare i caratteri attraverso cifre esadecimali. Per ottenere questo risultato, dopo la direttiva GENERAL SGMLREF, si aggiunge la dichiarazione di HCRO:
DELIM GENERAL SGMLREF HCRO "&#x" SHORTREF SGMLREF
Naturalmente, in XML ci sono poi altre aggiunte, che qui non vengono mostrate.
Alcune nomi che hanno significati speciali possono essere modificati nella sottosezione NAMES. In generale, queste cose non si fanno, per cui si abbina semplicemente la dichiarazione predefinita: SGMLREF:
NAMES SGMLREF
Nell'ambito della sintassi concreta è possibile definire il limite a una serie di quantità. Di solito non ci si preoccupa di queste cose, oppure si scrivono direttive per richiedere limiti molto elevati. Per fare riferimento allo standard, si utilizza la parola chiave SGMLREF come al solito:
QUANTITY SGMLREF
Eventualmente si aggiungono le varianti che si ritiene necessario apportare. L'esempio seguente è tratto dalla configurazione predefinita di SP e appare evidente l'intenzione di estendere al massimo i limiti, anche senza spiegare nel dettaglio il significato di ogni parametro:
QUANTITY SGMLREF ATTCNT 99999999 ATTSPLEN 99999999 DTEMPLEN 24000 ENTLVL 99999999 GRPCNT 99999999 GRPGTCNT 99999999 GRPLVL 99999999 LITLEN 24000 NAMELEN 99999999 PILEN 24000 TAGLEN 99999999 TAGLVL 99999999
Con XML, o comunque con la dichiarazione «Web SGML», ISO 8879:1986 (WWW), è possibile usare una forma differente e più intuitiva per indicare che non si vogliono porre limiti:
QUANTITY NONE
L'ultima sezione della dichiarazione SGML serve a raccogliere la definizione delle proprietà: FEATURES. Contiene in particolare tre sottosezioni intitolate rispettivamente MINIMIZE, LINK e OTHER. Non è il caso di approfondire queste definizioni, a parte qualche direttiva che può essere interessante.
Per cominciare, conviene osservare la sezione FEATURES dell'HTML 4:
FEATURES MINIMIZE DATATAG NO OMITTAG YES RANK NO SHORTTAG YES LINK SIMPLE NO IMPLICIT NO EXPLICIT NO OTHER CONCUR NO SUBDOC NO FORMAL YES
Nella sottosezione MINIMIZE è importante tenere in considerazione l'opzione DATATAG, che in generale è bene sia disattivata come appare nell'esempio. Questa dovrebbe servire per specificare una stringa che nel testo deve essere presa in considerazione come una chiusura implicita di un elemento. L'opzione OMITTAG consente di utilizzare le regole di minimizzazione nel DTD.
La sottosezione OTHER permette di definire delle caratteristiche interessanti riguardo all'organizzazione del DTD, del sorgente e dei cataloghi. L'opzione CONCUR consente, se attivata, di gestire più DTD nello stesso documento. Ciò può servire quando è consentita l'aggregazione di più sorgenti che a loro volta utilizzano DTD differenti. Data la complessità che si creerebbe in questo modo, tale opzione viene disabilitata normalmente. L'opzione SUBDOC permette, se abilitata, di aggregare più sorgenti SGML assieme (che di solito condividono lo stesso DTD implicitamente); se si abilita l'opzione occorre aggiungere l'indicazione del numero massimo di livelli di annidamento a cui si può arrivare. L'opzione FORMAL, se attivata, serve a richiedere l'uso corretto degli identificatori pubblici; se non è attivata, l'identificazione può avvenire in modo meno rigoroso.
L'esempio seguente mostra l'impostazione tradizionale di un sistema SGML:
FEATURES MINIMIZE DATATAG NO OMITTAG YES RANK YES SHORTTAG YES LINK SIMPLE YES 1000 IMPLICIT YES EXPLICIT YES 1 OTHER CONCUR NO SUBDOC YES 99999999 FORMAL YES
La dichiarazione SGML può essere attribuita attraverso il catalogo, con la direttiva SGMLDECL:
SGMLDECL "HTML4.dcl"
L'esempio mostra il riferimento al file HTML4.dcl
, contenente la dichiarazione SGML desiderata.
Potrebbe essere impossibile selezionare tra più dichiarazioni alternative. In tal caso, diventa necessario predisporre più cataloghi, uno per ogni tipo di dichiarazione che si intende utilizzare.
Per concludere viene mostrato un esempio completo di una dichiarazione SGML realizzata per poter utilizzare nel sorgente la codifica ISO 8859-1, che potrebbe essere adatta alle situazioni più comuni (appare anche la sezione APPINFO che non è stata descritta). Altri esempi possono essere ottenuti dal pacchetto SP sorgente, nel quale si può trovare anche la dichiarazione di XML.
<!SGML "ISO 8879:1986 (WWW)" CHARSET BASESET "ISO 646-1983//CHARSET International Reference Version (IRV)//ESC 2/5 4/0" DESCSET 0 9 UNUSED 9 2 9 11 2 UNUSED 13 1 13 14 18 UNUSED 32 95 32 127 1 UNUSED BASESET "ISO Registration Number 100//CHARSET ECMA-94 Right Part of Latin Alphabet Nr. 1//ESC 2/13 4/1" DESCSET 128 32 UNUSED 160 96 32 CAPACITY PUBLIC "ISO 8879:1986//CAPACITY Reference//EN" SCOPE DOCUMENT SYNTAX SHUNCHAR CONTROLS 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 127 BASESET "ISO 646-1983//CHARSET International Reference Version (IRV)//ESC 2/5 4/0" DESCSET 0 128 0 FUNCTION RE 13 RS 10 SPACE 32 TAB SEPCHAR 9 NAMING LCNMSTRT "" UCNMSTRT "" LCNMCHAR "-." UCNMCHAR "-." NAMECASE GENERAL YES ENTITY NO DELIM GENERAL SGMLREF HCRO "&#x" SHORTREF SGMLREF NAMES SGMLREF QUANTITY NONE FEATURES MINIMIZE DATATAG NO OMITTAG YES RANK NO SHORTTAG NO LINK SIMPLE YES 1000 IMPLICIT YES EXPLICIT YES 1 OTHER CONCUR NO SUBDOC YES 99999999 FORMAL YES APPINFO NONE >
The SGML/XML Web Page
Wayne L. Wohler, SGML Declarations
The SGML Newsletter
daniele @ swlibero.org
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome dichiarazione_sgml.html
[successivo] [precedente] [inizio] [fine] [indice generale] [violazione GPL] [translators] [docinfo] [indice analitico]