Lo schema di codifica definito dalle norme della Text Encoding Initiative (TEI) costituisce una applicazione dello Standard Generalized Markup Language1. SGML è uno standard internazionale per la definizione di metodi di rappresentazione di testi in formato elettronico, indipendenti dall'hardware e dal software. Questo capitolo presenta una breve guida introduttiva alle principali caratteristiche di SGML per quei lettori che non ne hanno mai sentito parlare. Per un approfondimento sul modo in cui la TEI utilizza lo standard SGML si rimanda al capitolo 28 "Conformance". Per una descrizione più tecnica delle caratteristiche SGML utilizzate nello schema di codifica della TEI si rimanda al capitolo 39 "Formal grammar for the TEI-interchange-Format Subset of SGML".
SGML è uno standard internazionale per la descrizione di testi elettronici codificati. Più precisamente SGML è un metalinguaggio, in altre parole uno strumento per descrivere in modo formale un linguaggio, un linguaggio di codifica. Prima di procedere ulteriormente, dobbiamo chiarire il significato di questi termini.
Storicamente la parola codifica è stata usata per descrivere annotazioni o altri codici presenti in un testo per comunicare al tipografo come doveva essere stampato un particolare brano. Per fare qualche esempio, è una forma di codifoca il sottolineato che indica grassetto, simboli speciali per indicare la omissione di una parte di testo o la necessità di stamparla con caratteri particolari. Quando l'impaginazione e la stampa del testo sono state automatizzate, il termine è stato usato per indicare tutti i tipi di codifica presenti nel testo elettronico per controllarne la formattazione, la stampa e in genere la gestione.
In senso più generale definiamo markup o codifica ogni mezzo per rendere esplicita un'interpretazione di un testo. Ad un livello più basso tutti i testi stampati sono codificati: la punteggiatura, l'uso delle maiuscole, la disposizione delle lettere sulla pagina, persino gli spazi tra le parole possono essere considerati una sorta di codifica, la cui funzione è quella di aiutare il lettore a individuare dove finisce una parola e ne comincia un'altra, o ad identificare elementi strutturali quali i titoli, o semplicemente unità sintattiche quali le frasi. Codificare un testo per gestirlo mediante computer è un processo simile a quello della trascrizione di un manoscritto con scriptio continua, consiste cioè nel rendere esplicito ciò che è congetturale o implicito, in altre parole un processo finalizzato a guidare il fruitore nell'interpretazione del contenuto del testo.
Noi intendiamo per linguaggio di codifica un insieme di convenzioni usate per codificare un testo. Un linguaggio di codifica deve specificare quale tipo di codici è ammesso, quale è richiesto, come i codici si distinguono dal testo e quale è il loro significato. SGML fornisce gli strumenti per compiere le prime tre azioni mentre una documentazione quale le TEI-Guidelines, server per capire il significato dei codici.
Il presente capitolo è finalizzato a fornire un'introduzione informale - molto meno dettagliata rispetto allo standard stesso - a quelle parti di SGML necessarie per poter utilizzare al meglio le Guidelines stesse.
Tre sono le caratteristiche di SGML che più lo distinguono da altri linguaggi di codifica: l'essere un sistema di codifica descrittiva piuttosto che procedurale; il concetto in esso formulato di tipo di documento; la sua indipendenza da tutti i sistemi di di rappresentazione dei documenti. Questi tre aspetti verrano brevemente affrontati nei successivi paragrafi e in modo più approfondito nelle sezioni 2.3 "SGML Structure" e 2.7 "SGML Entities".
Un sistema di codifica descrittiva utilizza
i codici semplicemente come nomi per classificare parti del documento. Codici come
<para> o \end{list} identificano semplicemente una parte di documento e la
qualificano come "paragrafo" o come "fine di una lista". Al contrario
la codifica procedurale stabilisce quale azione deve essere eseguita in un particolare
punto del documento: "chiama la procedura PARA con i parametri 1, b e x", etc.
In SGML le istruzioni necessarie per gestire un documento per particolari scopi (ad
esempio per impaginarlo) sono del tutto separate dalla codifica descrittiva presente nel
documento. Normalmente queste istruzioni sono raccolte fuori del documento in procedure o
programmi.
Applicando la codifica descrittiva invece che quella procedurale, lo stesso documento può essere facilmente gestito da diversi programmi ciascuno dei quali può eseguire diverse istruzioni su quelle parti considerate rilevanti. Per esempio un programma che analizza il contenuto del documento può tralasciare completamente le note presenti in un testo, mentre un programma che impagina può estrarle e raccoglierle tutte alla fine del capitolo nella fase di stampa. Diversi tipi di istruzioni possono essere associate alle stesse parti del file. Per esempio un programma può estrarre nomi di persona e di luogo da un documento per creare un indice o un archivio informatizzato mentre un altro, lavorando sul medesimo testo, può stampare gli stessi nomi in un carattere particolare.
SGML introduce la nozione di tipo di documento e conseguentemente di definizione del tipo di documento o Document Type Definition (DTD). I documenti appartengono a delle categorie tipologiche come altri oggetti gestiti dal computer. Il tipo di un documento è definito formalmente dalle sua parti costituenti e dalla struttura nella quale esse sono ordinate. La definizione del documento "relazione", ad esempio, potrebbe essere che esso consiste in un titolo e possibilmente in un nome di autore, seguiti da un riassunto e da uno o più paragrafi. Secondo questa definizione un documento privo di titolo non sarebbe formalemente una relazione allo stesso modo di una serie di paragrafi seguiti da un riassunto anche se presentassero per il lettore caratteristiche simili a quelle di una relazione.
Se i documenti appartengono a tipologie note un programma speciale chiamato parser può essere usato per analizzare un documento di un certo tipo e verificare se tutti gli elementi richiesti per quel particolare tipo sono presenti e inseriti nell'ordine corretto. Inoltre più documenti dello stesso tipo possono essere trattati in modo uniforme. Possono essere quindi predisposti dei programmi che sfruttino le informazioni relative alla struttura dei documenti e li gestiscano in un modo più intelligente.
Lo scopo iniziale di SGML fu quello di fare in modo che i documenti codificati secondo le sue regole fossero trasportabili da un ambiente hardware e software ad un altro senza perdita di informazione. Quanto detto finora affronta il problema ad un livello astratto, ma il problema è stato affrontato anche al livello delle stringhe di bytes (caratteri) di cui si compone il documento. SGML fornisce un meccanismo generale per la sostituzione di stringhe che è un modo semplice, indipendente dalla macchina, di far sì che una particolare stringa di caratteri nel documento venga sostituita da un'altra quando il documento stesso viene gestito. Un'ovvia applicazione di questo meccanismo è quella di assicurare l'uniformità della nomenclatura; un'altra più significativa è quella di risolvere la nota incapacità di computer diversi di comprendere i reciproci set di caratteri o di un singolo computer di mettere a disposizione tutti i caratteri grafici necessari per un particolare lavoro, fornendo una codifica descrittiva per quei caratteri non trasferibili. Le stringhe definite da questo meccanismo di sostituzione sono chiamate entità e vengono studiate in modo approfondito nella sezione 2.7 "SGML Entities".
Un testo non è una sequenza indifferenziata di parole, e ancora meno di bytes. Esso può essere diviso in differenti parti per scopi diversi. Un testo in prosa come il presente può essere diviso in sezioni, capitoli, paragrafi, frasi. Un testo in versi può essere diviso in canti, stanze, versi. Una volta stampati, testi in prosa e in versi possono essere divisi in volumi, fascicoli e pagine.
Unità strutturali di questo tipo sono usate molto spesso per identificare specifici luoghi nel testo ("la terza frase del secondo paragrafo nel capitolo dieci"; "canto 10, verso 1234"; "pagina 412"; etc.) ma possono essere usate anche per dividere il testo in parti significative per l'analisi ("la lunghezza media delle frasi della sezione 2 è diversa rispetto alla sezione 5?", "quanti paragrafi separano ogni ricorrenza della parola natura?"; "quante pagine?"). Altre unità strutturali hanno una funzione più chiaramente analitica in quanto caratterizzano una sezione del testo. In un testo teatrale si possono considerare i dialoghi di ogni personaggio come unità di un certo tipo, le direttive per la scena e le azioni come unità diverse. Un'analisi di questo genere non serve tanto a localizzare parti del testo ("il 93mo dialogo di Orazio nell'Atto secondo") quanto a facilitare il confronto tra le parole usate da un personaggio con quelle di un altro, o tra quelle usate dallo stesso personaggio in diversi momenti dello spettacolo.
In un testo in prosa si potrebbero isolare come unità di diverso tipo le parti in discorso diretto e quelle in discorso indiretto, brani che presentano stili compositivi diversi (narrativo, polemico, etc.), brani di autori diversi, etc. Per determinate analisi testuali (soprattutto per la critica del testo) l'aspetto fisico di una particolare fonte a stampa o manoscritta può avere importanza; paradossalmente si potrebbe usare la codifica descrittiva per descrivere carattestiche di stampa come il tipo di caratteri usati, l'interruzione di riga, l'uso degli spazi, etc.
Queste strutture testuali si sovrappongono le une alle altre in modo complesso ed imprevedibile. Soprattutto quando si trattano testi per studiare le tecniche di stampa, si deve valutare sia l'organizzazione fisica del libro che la struttura logica del lavoro che esso contiene. Molte importanti opere (ad es. il Trastram Shandy di Sterne) non sarebbero apprezzate a pieno senza considerare la relazione esistente tra le unità narrative (capitoli o paragrafi) e le divisioni di pagina. Per molte ricerche la relazione tra diversi livelli di analisi è fondamentale; fino a che punto la struttura sintattica e quella narrativa sono correlate o non lo sono, o, ad esempio, fino a che punto le strutture fonologiche riflettono quelle morfologiche.
Questa sezione descrive il semplice meccanismo per la codifica o l'identificazione delle unità testuali strutturali fornito da SGML. Descrive anche i metodi SGML per formulare regole che definiscono come le combinazioni di tali unità possono ricorrere in ogni testo.
Il termine tecnico usato in SGML per un'unità testuale considerata come una componente strutturale è elemento. Tipi diversi di elementi hanno nomi diversi, ma SGML non fornisce alcun modo per dichiarare il significato di un particolare tipo di elemento se non la sua relazione con gli altri elementi. Tutto ciò che si può dire di un elemento, ad esempio <blort> è che ogni occorrenza può o meno trovarsi dentro elementi del tipo <farble>, e che può o meno essere scomposto in elementi del tipo <blortette>. Si può dire che lo standard SGML non si preoccupa della semantica degli elementi testuali: essa infatti dipende dall'applicazione2. È compito di chi elabora un insieme di codici secondo le regole SGML (come sono queste Guidelines) scegliere nomi autoesplicativi per gli elementi che essi identificano e documentare il loro corretto uso nella fase di codifica. Questo è uno scopo delle Guidelines. Dalla necessità di scegliere nomi che spieghino la funzione degli elementi deriva il termine tecnico usato per identificare il nome di un elemento, ossia generic identifier o GI.
In un testo codificato (una document instance) ogni elemento deve essere marcato esplicitamente con dei codici. Lo standard fornisce vari modi per farlo, il più comune è quello di inserire una codice o tag all'inizio dell'elemento (start-tag) e un altro alla fine (end-tag). La coppia di start- e end-tag delimita tutte le occorrenze dell'elemento nello stesso modo in cui vengono usate le parentesi o le virgolette nella putenggiatura convenzionale. Ad esempio un elemento tra virgolette in un testo può essere codificato nel modo seguente:
... Rosalind's remarks <quote>This is the silliest stuff that ere I heard of!</quote> clearly indicate ...
Come mostra l'esempio uno start-tag ha la forma <nome>; la parentesi uncinata aperta indica l'inizio dello start-tag, "nome" è l'identificativo generico dell'elemento delimitato, la parentesi uncinata chiusa indica la fine dello start-tag. Un end-tag presenta la stessa forma ma in più ha uno slash dopo la parentesi uncinata aperta: </nome>3.
Un elemento può essere vuoto (empty) o contenere semplicemente testo. Di solito elementi di un tipo sono contenuti in elementi di tipo diverso.
Consideriamo un semplice modello. Supponiamo di voler identificare all'interno di un'antologia solamente le poesie, i loro titoli, le stanze e i versi che le compongono. In termini SGML il nostro "tipo di documento" è l'antologia, che consiste in una serie di poesie. Ogni poesia contiene un elemento, il titolo, e più occorrenze di un altro elemento, la stanza, ognuna delle quali può contenere un certo numero di elementi "verso". Un testo codificato secondo questo modello presenta la forma seguente 4:
<antologia> <poesia> <titolo>The SICK ROSE</titolo> <stanza> <verso>O Rose thou art sick.</verso> <verso>The invisible worm,</verso> <verso>That flies in the night</verso> <verso>In the howling storm:</verso> </stanza> <stanza> <verso>Has found out thy bed</verso> <verso>Of crimson joy:</verso> <verso>And his dark secret love</verso> <verso>Does thy life destroy.</verso> </stanza> </poesia> <!- -seguono altre poesie - -> </antologia>
Va sottolineato il fatto che questo esempio non presenta i nomi di elementi proposti in queste Guidelines e che pertanto non si tratta di un documento TEI. Servirà tuttavia per introdurre le nozioni fondamentali di SGML. Sono stati aggiunti spazi e interruzioni di linea solamente per chiarezza, ma non hanno particolare significato rispetto alla codifica. La linea
<!-- seguono altre poesie -->
è un commento SGML e non viene trattato come parte del testo.
Questo esempio non dice nulla rispetto alle regole che stabiliscono, ad esempio, se un titolo può trovarsi o meno in altra posizione oltre che all'inizio della prima stanza; per questo motivo la codifica è completa. In casi del genere deve essere esplicitamente dichiarato sia l'inizio sia la fine di ogni elemento, proprio perché non ci sono regole esplicite che stabiliscano dove possono trovarsi gli elementi. Nella prassi normale vengono normalmente dichiarate delle regole per ridurre la necessità di una codifica tanto pesante. Per esempio, a proposito del modello semplificato di poesia, si possono formulare le seguenti regole:
Da queste regole si deduce che non è necessario segnalare la fine di una stanza e di un verso in modo esplicito. Dalla regola 2 segue che non è necessario segnalare la fine del titolo -è infatti implicita nell'inizio della prima stanza. Allo stesso modo dalle regole 3 e 1 consegue che non è necessario segnalare la fine della poesia: dal momento che non si può trovare una poesia dentro altre poesie ma solamente dentro antologie, la fine di una poesia è implicita nell'inizio della successiva o nella fine dell'antologia. Applicando queste semplificazioni potremmo codificare la stessa poesia nel modo seguente:
<antologia> <poesia> <titolo>The SICK ROSE <stanza> <verso>O Rose thou art sick. <verso>The invisible worm, <verso>That flies in the night <verso>In the howling storm: <stanza> <verso>Has found out thy bed <verso>Of crimson joy: <verso>And his dark secret love <verso>Does thy life destroy. <poesia> <!- -seguono altre poesie - -> </antologia>
La possibilità di usare regole che stabiliscono quali elementi possono trovarsi dentro altri al fine di semplificare la codifica, è una caratteristica importante di SGML. Prima di approfondire l'analisi delle regole, vediamo come il testo codificato nel precedente esempio può essere gestito dal computer per molti e diversi scopi. Un semplice programma per l'indicizzazione può estrarre solo determinati elementi e costruire una lista di titoli o di parole usate in un testo in versi; un semplice programma per impaginare può inserire linee bianche tra le stanze, far rientrare la prima riga di ogni stanza o inserire un numero progressivo per ognuna. Parti diverse di ogni poesia possono essere stampate con caratteri diversi. Un promamma più complesso potrebbe mettere in relazione l'uso della punteggiatura con le divisioni della metrica5. I ricercatori che desiderano studiare le conseguenze di cambiamenti nelle divisioni delle stanze o dei versi stabilite dall'autore della poesia, possono farlo modificando la posizione dei tag. Naturalmente il testo codificato come nell'esempio può essere trasportato da un computer ad un altro e gestito con qualsiasi programma in grado di dare un significato ai tag presenti, senza che si debbano trasformare e tradurre come avviene quando si importano i file prodotti da programmi di video scrittura.
Regole come quelle prima descritte costituiscono la prima fase nella creazione di una formale descrizione della struttura di un documento SGML o document type definition, di norma abbreviata in DTD. Nel creare una DTD si può essere più o meno restrittivi. Si deve trovare un equilibrio tra la convenienza di seguire regole semplici e la complessità di gestione dei testi reali. Questo soprattutto quando le regole da definire sono destinate a testi già esistenti: non sempre è ben chiaro lo scopo e il significato di un testo antico e conseguentemente è molto difficile definire regole che ne rispecchino la struttura. D'altra parte quando un testo viene preparato per uno scopo preciso, ad esempio per introdurre i dati in un database, più rigorose sono le regole e meglio si raggiunge lo scopo. Nel caso di codifica di un testo preesistente la definizione di un insieme di regole secondo una particolare valutazione o interpretazione del testo può rivelarsi un vantaggio - anche solo al fine di verificare le ipotesi formulate. È importante ricordare che ogni definizione di tipologia di Documento costituisce una interpretazione di un testo. Non esiste una DTD che rifletta una verità assoluta riguardo ad un testo, sebbene possa risultare conveniente preferire una DTD ad un'altra per determinati tipi di analisi.
Al momento SGML viene usato soprattuto in ambienti nei quali l'uniformità di struttura dei documenti è un requisito fondamentale. Nella produzione di documentazione tecnica, per esempio, è di grande importanza che le sezioni e le sottosezioni siano ordinate correttamente, che i rinvii interni siano giusti, etc. In queste situazioni i documenti devono rispecchiare degli insiemi predefiniti di regole. Come visto in precedenza l'uso di regole semplici può semplificare il compito di codificare gli elementi in testi dalla struttura meno rigida. Rendendo esplicite tali regole lo studioso riduce la sua libertà nel codificare e verificare il testo elettronico e dunque si costringe ad esplicitare l'interpretazione della struttura e le particolarità significative del testo che viene codificato.
Una DTD SGML si presenta come un insieme di dichiarazioni formulate con una semplice sintassi definita nello standard. Tornando al modello della poesia, si potrebbero formulare le seguenti dichiarazioni:
<!ELEMENT antologia - - (poesia+)> <!ELEMENT poesia - - (titolo?, stanza+)> <!ELEMENT titolo - O (#PCDATA)> <!ELEMENT stanza - O (verso+)> <!ELEMENT verso O O (#PCDATA)>
Le cinque linee sono un esempio di dichiarazioni formali di elementi SGML. Una dichiarazione è delimitata come un elemento dalle parentesi uncinate; il primo carattere dopo la parentesi aperta deve essere un punto esclamativo, seguito da una parola chiave della sintassi SGML che specifichi il tipo di oggetto da dichiarare. Le cinque dichiarazioni sono tutte dello stesso tipo: cominciano con la parola chiave ELEMENT e dunque si riferiscono ad elementi. Ognuna è costituita da tre parti: un nome o gruppo di nomi, due caratteri che specificano le regole di minimizzazione e il modello del contenuto. Ogni parte viene discussa nei successivi paragrafi. Ogni parte di una dichiarazione è separata dalle altre mediante uno spazio.
La prima parte contiene l'identificativo generico dell'elemento, ad esempio poesia, titolo, etc. Si possono dichiarare insieme anche più elementi.
La seconda parte della dichiarazione specifica le cosiddette regole di minimizzazione per l'elemento in questione. Queste regole stabiliscono se lo start- e l'end-tag devono o meno essere presenti in ogni occorrenza di elemento. Nella dichiarazione vengono usati due caratteri separati da spazio, il primo riferito allo start-tag, il secondo all'end-tag. Nelle due posizioni si possono usare il trattino che indica l'obbligo di inserire il tag, o la lettera O (per omissible o optional) per consentire l'omissione. Nell'esempio precedente tutti gli elementi con l'eccezione di verso devono avere lo start-tag. Solo <poesia> e <antologia> devono avere l'end-tag.
La terza parte di una dichiarazione, chiusa tra parentesi tonde, costituisce il modello del contenuto dell'elemento in quanto specifica cosa può trovarsi dentro l'elemento. Nel modello si possono introdurre i nomi di altri elementi o delle parole chiave, tra le quali la più usata è #PCDATA. Si tratta dell'abbreviazione di "parsed character data" ed indica che l'elemento della dichiarazione può contenere ogni carattere valido. Se pensiamo alla dichiarazione SGML come ad una struttura gerarchica ad albero con una radice (nel nostro caso sarebbe l'elemento <antologia>), seguendo le ramificazioni dell'albero verso il basso (per esempio da <antologia> a <poesia> a <stanza>, <verso>, <titolo>) si arriverà in genere a #PCDATA. Nell'esempio, <titolo> e <verso> sono definiti in questo modo. Dal momento che il loro contenuto è definito come #PCDATA essi non possono contenere altri elementi.
La dichiarazione per la <stanza> nell'esempio precedente stabilisce che una stanza contiene uno o più versi. Per indicare quante volte l'elemento presente nel suo modello di contenuto può ricorrere viene introdotto un indicatore di occorrenza (il segno +). Nella sintassi SGML sono presenti tre indicatori di questo tipo rappresentati convenzionalmente dal segno di più, dal punto interrogativo, dall'asterisco o stella6. Il segno più indica che si possono trovare una o più occorrenze dell'elemento relativo; il punto interrogativo che l'elemento è facoltativo; l'asterisco che l'elemento può essere assente o ricorrere uno o più volte. Pertanto, se il modello per la <stanza> fosse VERSO*, si potrebbero trovare stanze prive di versi o con uno o più versi. Se fosse VERSO? sarebbero ancora possibili stanze senza versi, ma non con più di un verso. La dichiarazione per <poesia> stabilisce che una <poesia> non può contenere più di un titolo, ma può anche esserne priva mentre deve contenere almeno una stanza.
Il modello (TITOLO?, STANZA+) contiene due elementi e pertanto è necessario stabilire anche l'ordine in cui essi possono ricorrere. L'ordine è determinato dal connettore (la virgola) usato tra i componenti del gruppo. Esistono tre possibili connettori rappresentati convenzionalmente dalla "virgola", dalla "barra verticale" (|) e dalla "e commerciale" (&)7. La virgola indica che gli elementi devono ricorrere entrambi nella successione stabilita nel modello. La "e commerciale" indica che gli elementi possono ricorrere in qualsiasi ordine. La "barra verticale" indica che uno solo degli elementi può essere presente. Se la "virgola" dell'esempio fosse sostituita dalla "e commerciale", un titolo potrebbe trovarsi sia prima di tutte le stanze di una <poesia> sia dopo l'ultima (non tra le stanze). Se fosse sostituita da una barra verticale allora la <poesia> potrebbe contenere o un titolo o una o più stanze, non entrambi gli elementi.
Nel nostro esempio i componenti presenti in ogni modello sono sempre stati singoli elementi o la parola chiave #PCDATA. È ammissibile comunque definire modelli i cui componenti siano liste di elementi unite dagli speciali connettori. Tali liste chiamate model groups possono contenere indicatori di occorrenza ed essere a loro volta unite da connettori di gruppo. Per dimostrare tale possibilità possiamo modificare l'esempio in modo da introdurre versi che non facciano parte di stanze. Definiamo quindi le seguenti categorie di poesie: composte di stanze, di coppie di versi, di singoli versi. Una poesia in versi contiene semplicemente versi (ignoriamo il caso di paragrafi in versi)8 così non sarà necessario introdurre nuovi elementi. Una coppia_di_versi è definita come <verso1> seguito da <verso2>.
<!ELEMENT coppia_di_versi O O (verso1, verso2) >
Gli elementi <verso1> e <verso2> (distinti per consentire studi, ad esempio, delle rime) presentano esattamente lo stesso contenuto del precedente elemento <verso>. Pertanto possono condividere la stessa dichiarazione. In questa situazione conviene introdurre un name group come primo componente di un'unica dichiarazione piuttosto che una serie di dichiarazioni che differiscano solamente per il nome dell'elemento dichiarato. Un name group è una lista di GIs uniti da un connettore e delimitati da parentesi tonde:
<!ELEMENT (verso | verso1 | verso2) O O (#PCDATA) >
La dichiarazione per l'elemento <poesia> viene dunque modificata nel modo seguente:
<!ELEMENT poesia - O (titolo?, (stanza+ | coppia_di_versi+ | verso+) ) >
In questo modo si stabilisce che una poesia può contenere un titolo facoltativo seguito da una o più stanze, o una o più coppie_di_versi, o uno o più versi. Notare la differenza tra questa definizione e la seguente:
<!ELEMENT poesia - O (titolo?, (stanza | coppia_di_versi | verso)+) >
La seconda versione, applicando l'indicatore di occorrenza al gruppo piuttosto che a ciascun elemento, consentirebbe l'introduzione di una poesia contenente insieme stanze, coppie_di_versi e versi.
Modelli piuttosto complessi possono essere costruiti facilmente in questo modo così da rispecchiare la complessità strutturale di molti tipi di testi. Come ulteriore esempio consideriamo il caso di versi organizzati in stanze nelle quali appare un ritornello o un coro. Un ritornello può essere composto dalla ripetizione di elementi "verso" o semplicemente da testo non diviso in versi. Un ritornello può quindi trovarsi all'inizio di una poesia o come elemento facoltativo aggiunto ad ogni stanza. Questo caso potrebbe essere regolato dal seguente modello:
<!ELEMENT ritornello - - (#PCDATA | verso+) > <!ELEMENT poesia - O (titolo?, ( (verso+) | (riassunto?, (stanza, riassunto?)+ ) )) >
In questo caso una poesia consiste di un titolo facoltativo seguito da una sequenza di versi o da un gruppo di elementi che inizia con un ritornello facoltativo seguito da un altro gruppo, ogni componente del quale contiene una stanza seguita da un ritornello facoltativo. Una sequenza del tipo ritornello - stanza - stanza - ritornello rispecchia il modello allo stesso modo di stanza - ritornello - stanza - ritornello. La sequenza ritornello - ritornello - stanza - stanza non è ammessa, né lo è la sequenza "stanza - ritornello - ritornello - stanza". Tra le altre condizioni esplicitate da questo modello c'è il requisito che deve essere presente almeno una stanza in una poesia, se questa non contiene semplicemente versi, e che nel caso in cui ci siano sia il titolo sia una stanza, essi debbano trovarsi nell'ordine prefissato.