Codifica elettronica dei testi letterari ed e-book:
la marcatura XML TEI ed il trattamento informatico del romanzo Baltico di Matteo Collura
vedi: appendice 1 e appendice 2
Sebbene XML sia fatto in modo da poter essere intellegibile anche agli esseri umani, è stato in primo luogo concepito per permettere un trattamento ottimale dei dati alle applicazioni informatiche. La codifica elettronica da noi operata è stata portata avanti sulla base del presupposto che il codice sarebbe poi stato sottoposto ad elaborazione automatica dei dati. Si ricorderà quanto gia detto nelle parti precedenti della trattazione sull'importanza della separazione del contenuto dalla sua rappresentazione; mediante la codifica TEI abbiamo sostanzialmente identificato e demarcato la struttura del testo secondo un ben determinato livello descrittivo. Per il trattamento dei dati ci siamo giovati degli strumenti offerti dall'Extensible Stylesheet Language (XSL) ed in particolar modo dal suo componente Extensible Stylesheet Language Trasformations (XSLT). Abbiamo già parlato in termini teorici di XSL e della sua genesi nella prima parte di questa relazione, ci accingiamo adesso a mostrare nella pratica, sulla base del lavoro svolto per il romanzo di Collura, come questa tecnologia possa essere impiegata per la creazione di output destinati alla fruizione o addirittura all'analisi del testo.
Intraprendiamo la nostra esposizione con la descrizione della produzione di un output HTML per l'Header del nostro file TEI/XML. In appendice vengono forniti sia il codice completo del foglio di stile XSLT adoperato per la trasformazione, sia il codice HTML prodotto ed una sua rappresentazione[161] grafica. Ove non indicato diversamente si precisa che il processore XSLT da noi adottato è stato Istant Saxon 6.5.2.
Sostanzialmente XSLT è un linguaggio di estrazione dei dati. Questo significa che l'applicazione, in base alle istruzioni del documento, estrae i dati di un altro documento, nel nostro caso il file XML di Baltico, e li posiziona all'interno di una nuova struttura, nello specifico quella del file HTML con i dati dell'HEADER TEI.
Passando all'analisi del codice salta subito all'occhio che un foglio di stile XSLT è anche un file XML ben formato. Il documento si apre con la consueta dichiarazione XML
<?xml version="1.0" encoding="UTF-8"?> cui segue l'elemento radice del foglio XSLT <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">, subito dopo incontriamo <xsl:output method="html" encoding="iso-8859-1" version="4.01" doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"/> con cui si specifica il formato dell'output, in questo caso HTML 4.01. tralasciando i due elementi <xsl:strip-space elements="*"/> <xsl:preserve-space elements="author"/> entriamo nel vivo del foglio di stile; il cuore della sintassi XSLT è costituito dalle dichiarazioni di modello (template), mediante le quali si mettono in corrispondenza i nodi, ovvero gli elementi, del sorgente XML con le istruzioni definite nel foglio XSLT. Tornando all'esempio concreto vediamo che il primo modello definito è:
<xsl:template match="/">
<html>
<head>
<title>
<xsl:value-of select="/TEI.2/teiHeader/fileDesc/titleStmt/author"/> - <xsl:value-of select="/TEI.2/teiHeader/fileDesc/titleStmt/title"/> [FRONTESPIZIO]</title>
</head>
<body>
<hr/>
<h1>
<xsl:value-of select="/TEI.2/teiHeader/fileDesc/titleStmt/title"/>
<hr/>
</h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
Questo primo modello, mediante l'attributo match, mette in relazione il nodo radice[162] del file sottoposto ad elaborazione, nel nostro caso[163] <TEI.2>...</TEI.2>, con le istruzioni definite nel foglio di stile. Ecco nel concreto cosa avviene: il processore dopo aver trovato corrispondenza nel file sorgente con il nodo identificato nel modello, ossia <TEI.2>, manda in output le istruzioni del modello: in pratica comincia a creare un file HTML scrivendo gli opportuni tag: <html> <head> <title>, arrivato a questo punto l'espressione <xsl:value-of select="TEI.2/teiHeader/fileDesc/titleStmt/author"/>[164] ordina al processore di mandare in output, di scrivere, il contenuto dell'elemento identificato dall'espressione XPath (TEI.2/teiHeader/fileDesc/titleStmt/author), la quale può essere così tradotta: "il contenuto di <author> figlio di <titleStmt> il quale è figlio di <fileDesc> il quale è figlio di <teiHeader> il quale è figlio di <TEI.2>", il lettore forse ricorderà che questo elemento così si presenta nella testata di Baltico:
<author><name type="forename">Matteo</name>
<name type="surname">Collura</name></author>
Come vediamo il tag <author> ha due elementi figli <name>, tuttavia il comportamento di value-of prevede che venga mandato in output il valore di stringa (in parole povere il contenuto testuale) dell'elemento selezionato e dei suoi figli, in questo caso <name>. Procedendo nell'analisi del foglio di stile osserviamo che il modello prevede che si inserisca un trattino e poi, allo stesso modo di quanto già fatto con il nome dell'autore, si trasmetta il valore del tag <title> del <titleStmt>, contenente il titolo dell'opera. Dopo queste operazioni si prescrive al template di scrivere [FRONTESPIZIO], e di seguito </title> </head> <body> <hr/> <h1>, marcatori con cui si chiude la testata ed inizia il contenuto del file HTML, dopo si manda nuovamente in output il titolo dell'opera sempre grazie all'ausilio di espressioni xsl:value-of, dopodiché l'elaborazione prosegue scrivendo <hr/></h1>, finché non incontra <xsl:apply-templates/> ed allora si arresta temporaneamente; <xsl:apply-templates/> impone al processore di bloccarsi e chiamare i modelli per gli elementi figli dell'elemento selezionato, solo dopo aver effettuato queste operazioni il modello torna attivo ed esegue le restanti operazioni, nello specifico scrivere i tag di chiusura del file HTML </body> </html>. Ecco l'output prodotto dal modello appena illustrato fino al suo arresto al momento in cui incontra <xsl:apply-templates/>:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Matteo Collura - Baltico. Un'epopea siciliana: edizione elettronica [FRONTESPIZIO]</title>
</head>
<body>
<hr>
<h1>Baltico. Un'epopea siciliana: edizione elettronica</h1>
<hr>
Come si può vedere all'interno del tag <title> sono stati inseriti i valori dei tag <author> e <title> della testata TEI, lo stesso è stato fatto anche per il marcatore <h1> che apre il corpo del file HTML. Di seguito mostriamo come appare nel browser Internet Explorer 6.0 questo output HTML:
Proseguendo nell'analisi del foglio di stile il secondo modello che incontriamo è:
<xsl:template match="teiHeader">
<xsl:apply-templates/>
</xsl:template>
Il contenuto di questo template si limita a dire al processore di chiamare gli altri modelli per gli elementi figli del nodo corrente; si ricorderà che in effetti l'elemento <teiHeader> non è altro che un contenitore per tutta una serie di sotto elementi contenenti i dati veri e propri. Una impostazione analoga al modello adottato per il <teiHeader> la ritroviamo nel modello del suo primo figlio <fileDesc> ed a sua volta per il figlio di questi <titleStmt>: entrambi, infatti, sono elementi che, come sappiamo, racchiudono un gruppo di tag che marcano informazioni strutturate, pertanto i modelli che interverranno saranno quelli facenti riferimento ai loro sottocomponenti di livello più basso.
Una precisazione occorre fare in merito al comportamento di <xsl:apply-templates/>, questo elemento come abbiamo visto viene usato per invocare i modelli per gli elementi figli dell'elemento contesto, tuttavia come si potrà notare proseguendo nell'analisi del foglio XSLT, in taluni casi questo comando è presente anche in modelli i quali fanno riferimento ad elementi nel sorgente il cui contenuto è costituito esclusivamente da testo e che si trovano al livello più basso dell'albero del documento XML, ci si domanderà quindi il perché dell'adozione di <xsl:apply-templates/> in questi contesti. In realtà, oltre ai modelli esplicitamente dichiarati nel foglio di stile XSLT, il processore prevede dei modelli, per così dire impliciti, definiti in un foglio di stile di default che interviene quando si incontra un elemento non messo in corrispondenza con un template[165] definito nel foglio di stile principale. Sulla base dei comportamenti di default, allorché il processore XSLT raggiunge il contenuto di un elemento per cui non è stato definito un modello, viene mandato in output il contenuto dell'elemento, in sostanza è come se fosse presente il comando <xsl:value-of select="."/>[166].
Riprendendo l'analisi del nostro foglio di stile incontriamo i modelli per gli elementi <title> ed <author> del <titleStmt> del <fileDesc>:
<xsl:template match="fileDesc/titleStmt/title">
<p><b>Titolo dell'Opera</b>:  <xsl:apply-templates/></p>
</xsl:template>
<xsl:template match="fileDesc/titleStmt/author">
<p><b>Autore</b>: <xsl:apply-templates/></p>
</xsl:template>
come vediamo questi template per ognuno dei due elementi creano un paragrafo (delimitato dai tag <p>...</p>) poi scrivono del testo, rispettivamente "Titolo dell'opera" ed "Autore", racchiudendolo dentro tag <b>[167] in modo che venga reso in grassetto nell'output HTML ed infine invocano eventuali altri modelli mediante <xsl:apply-templates/>, tuttavia non essendovi modelli definiti per i figli di questi elementi interviene il foglio di stile di default che manda in output il contenuto del nodo corrente.
La medesima impostazione dei modelli appena illustrati la ritroviamo nei template definiti per gli altri elementi dell'Header TEI presenti nel resto del foglio di stile, di seguito, pertanto, descriveremo soltanto quei modelli che in qualche modo si discostano da questa organizzazione di base.
Hanno richiesto una programmazione leggermente diversa i template per le dichiarazioni di responsabilità, che nel sorgente XML sono racchiuse dentro il tag <respStmt>. Si rammenterà che dentro questo marcatore il ruolo ed il nome dei responsabili dell'edizione elettronica vengono indicati per mezzo della coppia di tag <resp> e <name>, il primo contenente un'espressione che descrive per esteso la natura della responsabilità, il secondo il nome del responsabile. Nell'Header del file XML di Baltico queste coppie di elementi ricorrono due volte, la prima per registrare la responsabilità della digitalizzazione e codifica nella persona di Salvatore Salzillo, la seconda invece per la dichiarazione di responsabilità della supervisione nella figura della prof. Lucrezia Lorenzini. Nell'output HTML desideravamo che ognuna delle due dichiarazioni di responsabilità (ossia il contenuto dei due elementi <resp> e <name>) fosse inserita dentro un paragrafo distinto, tuttavia non essendo, dentro <respStmt>, racchiuse le coppie di tag <resp> e <name> dentro un ulteriore elemento contenitore[168], siamo dovuti ricorrere, per così dire, ad un espediente per l'ottenimento di questo tipo di struttura HTML. Riportiamo di seguito il codice dei tre modelli in questione:
<xsl:template match="fileDesc/titleStmt/respStmt">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="fileDesc/titleStmt/respStmt/resp">
<xsl:text disable-output-escaping="yes"> <p></xsl:text>
<b><xsl:apply-templates/></b>:  
</xsl:template>
<xsl:template match="fileDesc/titleStmt/respStmt/name">
<xsl:apply-templates/>
<xsl:text disable-output-escaping="yes"> </p></xsl:text>
</xsl:template>
<xsl:text disable-output-escaping="yes"><p></xsl:text>[170]
successivamente mediante <xsl:apply-templates/> scrive nell'output il valore dell'elemento contesto (ossia <resp>) racchiudendolo dentro tag <b>...</b> e facendolo seguire dal segno di due punti ed uno spazio bianco.
Il template dell'elemento <name> invece subito dopo aver trasmesso nell'output il proprio valore scrive il tag HTML di chiusura paragrafo </p> sempre grazie all'espressione:
<xsl:text disable-output-escaping="yes"></p></xsl:text>.
Grazie alla tecnica appena illustrata siamo riusciti ad aprire il paragrafo HTML prima di scrivere il valore del tag <resp> ed a chiuderlo subito dopo che nell'output si è inserito il valore di <name>, ottenendo così il risultato da noi voluto di divisione in paragrafi separati delle dichiarazioni di responsabilità[171]. Mostriamo di seguito la porzione di codice HTML prodotto dai modelli appena illustrati:
<p><b>Digitalizzazione e codifica elettronica a cura di</b>: [172] Salvatore Salzillo</p>
<p><b>Supervisione</b>: prof. Lucrezia Lorenzini </p>
Precisiamo che abbiamo adottato il comando <xsl:text disable-output-escaping="yes"> per creare i paragrafi esclusivamente per mantenere la "buona formazione"[173] XML del nostro foglio di stile XSLT.
Anche l'elemento <availability> ha richiesto una cura particolare nella programmazione del suo template. Il lettore forse ricorderà la nostra decisione di adoperare le tecniche di firma digitale per l'attestazione della provenienza dell'originalità e dell'integrità dei sorgenti XML di opere codificate elettronicamente e rammenterà probabilmente la decisione di inserire la chiave pubblica del codificatore all'interno del file di Baltico, che appunto è stata posta nell'Header all'interno del tag <availability>. Avendo noi preferito non inserire nell'output HTML dell'Header, sotto forma di testo, il codice della chiave pubblica (cosa comunque possibile) così come fatto nel file XML, ma piuttosto come collegamento ad un file esterno, abbiamo creato due modelli, il cui codice riportiamo di seguito, uno per l'elemento <availability> ed uno per il suo ultimo paragrafo:
<xsl:template match="publicationStmt/availability">
<p><b>Copyright</b>: <xsl:apply-templates/><br/>
<a href="chiave_codificatore.asc">Download chiave pubblica per la verifica della firma digitale</a>
</p>
</xsl:template>
<xsl:template match="availability/p[position() = last()]"/>
Il primo modello, sulla scorta del comportamento degli altri template, invoca mediante <xsl:apply-templates/> i modelli per i figli dell'elemento contesto <availability>, che nello specifico nel nostro file XML è costituito da due paragrafi (<p>), il primo contenente le dichiarazioni di disponibilità del documento ed il secondo la chiave pubblica del codificatore. Per il primo paragrafo il processore non trova corrispondenza con alcun modello pertanto sulla base del foglio di stile di default manda in output il contenuto del primo elemento <p>, tuttavia per il secondo <p> è stato precisato un modello: <xsl:template match="availability/p[position() = last()]"/>, questo template trova corrispondenza con l'ultimo paragrafo (<p>) di <availability>, come si può notare non ha alcun contenuto, infatti questo template indica al processore di non compiere alcuna azione allorché l'elaborazione giunge all'elemento selezionato, in pratica ordina di ignorarlo. L'espressione XPath "availability/p[position() = last()]" selezionerà sempre l'ultimo paragrafo di <availability>, indipendentemente dal numero di paragrafi presenti nell'elemento, pertanto il codificatore per escludere dall'elaborazione il paragrafo con la sua chiave pubblica, dovrà soltanto aver cura di porla nell'ultimo paragrafo[174].
Un template analogo a questo appena illustrato è quello posto alla fine del documento con cui si fa in modo che l'elaborazione si limiti al TEI Header e non proceda nel resto del file XML: <xsl:template match="text"/>.
Nella trasformazione dei documenti XML il linguaggio XSLT dà anche la possibilità di compiere delle elaborazioni condizionali sui dati, ossia consente di stabilire che determinate operazioni vengano compiute soltanto al verificarsi di specifiche condizioni. Anche nel foglio di stile che stiamo esaminando è stata inserita una semplice elaborazione condizionale, infatti il modello per tutti i figli dell'elemento <bibl>[175], contenente la citazione bibliografica del testo fonte all'interno del diario di codifica (<revisionDesc>), esegue comandi differenti sulla base del verificarsi di certe condizioni, di seguito ne riportiamo il codice:
<xsl:template match="revisionDesc/change/item/bibl/*">
<xsl:choose>
<xsl:when test="position() = 1">:  <xsl:apply-templates/>,</xsl:when>
<xsl:when test="position() != last()">  <xsl:apply-templates/>,</xsl:when>
<xsl:otherwise>  <xsl:apply-templates/>.</xsl:otherwise>
</xsl:choose>
</xsl:template>
<bibl>
<author>Matteo Collura</author>
<title>Baltico : un'epopea siciliana</title>
<publisher>Luigi Reverdito Editore</publisher>
<date>1988</date>
</bibl>
Ecco, invece, come tale citazione viene riprodotta nel browser dopo la trasformazione con XSLT:
digitalizzazione e correzione del testo in base alla edizione di riferimento[178]: Matteo Collura, Baltico: un'epopea siciliana, Luigi Reverdito Editore, 1988.
Sebbene la finalità del foglio di stile appena descritto sia prevalentemente la dimostrazione delle potenzialità di XSLT nel trattamento dei testi, piuttosto che un suo uso pratico, ci teniamo a sottolineare come con pochi eventuali aggiustamenti[179] sarebbe possibile applicare il nostro foglio di stile ad innumerevoli testi codificati secondo le regole della TEI-Lite, è questo infatti uno dei pregi principali della codifica dichiarativa dei testi. Concludendo possiamo dire che in queste pagine abbiamo dato una prima dimostrazione pratica di alcune delle potenzialità che si hanno nella rappresentazione di dati identificati funzionalmente mediante una marcatura di tipo dichiarativo. Come si ricorderà al momento della codifica XML-TEI abbiamo racchiuso le varie porzioni di testo entro tag che hanno specificato cosa identificassero, cosa fossero, entro una data struttura funzionale i diversi blocchi testuali. Potremmo dire che con la codifica abbiamo espresso cosa un tag contenesse e solo ora grazie ad XSLT stabiliamo come quel contenuto vada rappresentato; ma la grande novità sta nel fatto che il contenuto non è più vincolato ad un'unica rappresentazione è bensì pronto ad infinite raffigurazioni atte a soddisfare le esigenze più diverse; nelle pagine che seguiranno vedremo come partendo sempre dallo stesso nucleo di dati, pur nel nostro piccolo, siamo stati in grado di produrre output in formati rappresentazionali per gli scopi e gli usi più vari.