XSL - XML, il braccio e la mente
XSL (Extensible Stylesheet Language) non rappresenta soltanto l'evoluzione dei fogli di stile CSS, né intende sostituire del tutto l'Html, almeno per il momento. Questo standard è piuttosto un vero e proprio linguaggio di programmazione che permette ai browser di visualizzare un qualunque linguaggio XML comunque definito e allo stesso tempo fornisce un vocabolario per le specifiche semantiche di rappresentazione di una serie di elementi di un documento
Quando abbiamo parlato di XML abbiamo visto come questo standard consenta di creare nuovi linguaggi a marcatori pensati per soddisfare esigenze specifiche o per definire pagine i cui componenti siano formati da una serie di macroelementi predefiniti. Poniamo, per esempio, di voler disegnare un catalogo di prodotti costituito da un indice e una pagina dedicata a ciascuno di essi. Ognuna di queste conterrà una serie di elementi con caratteristiche e comportamenti ben definiti, che si appoggeranno alle informazioni memorizzate in una base dati gestita da un server remoto. Possiamo desiderare che per ogni pagina venga fornita una foto del prodotto, una serie di informazioni sulle sue caratteristiche, i dati relativi al prezzo e alle eventuali offerte promozionali, la sua disponibilità in magazzino e i tempi di consegna. Nel caso in cui il prodotto venga venduto attraverso Internet, serviranno gli strumenti che ci consentano di aggiungerlo al "carrello della spesa" virtuale.
Tutto questo già viene fatto con il codice Html, con una serie di elementi attivi Java, ActiveX JavaScript, VBScript o con altri marcatori speciali gestiti direttamente dal server.
Con XML, invece, è possibile assegnare a ogni macroelemento un proprio marcatore, eventualmente dotato di un certo numero di parametri per la personalizzazione del componente, riducendo le dimensioni del codice, aumentando le prestazioni in fase di caricamento, semplificando la leggibilità e riducendo di conseguenza i costi e i tempi di manutenzione.
Abbiamo visto che con un DTD (la grammatica per una classe di documenti) è anche possibile definire la sintassi, a grandi linee, del nuovo linguaggio. Per esempio, richiedere che l'elemento rappresentato dal marcatore <OFFERTA> possa trovarsi solo in un blocco contraddistinto dal marcatore <PREZZO> oppure che la rappresentazione grafica del prodotto sia un'immagine fissa o un filmato, specificando l'esistenza di un parametro apposito chiamato TIPO.
A questo punto però sorge un problema: dove sta scritto come il browser deve trattare il macroelemento?
La rappresentazione degli elementi in Html
Vediamo quello che succede in Html, dove il browser ha una serie di informazioni predefinite che lo informano su come gestire gli elementi. Lo sviluppatore ha solo due modi di modificare queste informazioni: utilizzare gli attributi o specificare lo stile del marcatore.
Vediamo il primo caso. Alcuni marcatori hanno una serie di attributi che permettono di specificare alcune loro caratteristiche, per esempio richiedere che il paragrafo sia allineato a destra. Tuttavia non sarà possibile precisare, per esempio, se il margine destro debba essere quello della pagina o piuttosto "rientrare" di una certa quantità di spazio. Se però l'attributo non consente determinate informazioni, non ci sarà alcun modo di modificare le caratteristiche in questione. Nel caso di <EM>, per esempio, non si potrà definire il tipo di enfasi che va data al carattere, né tantomeno la certezza che ogni browser utilizzi gli stessi criteri.
Naturalmente esistono trucchi, come quello di utilizzare il marcatore <BLOCKQUOTE> per far rientrare il testo sia a destra sia a sinistra, oppure <FONT> per specificare un tipo di carattere con determinati attributi. Ma si tratta comunque di un vantaggio relativo. Anche questi marcatori, infatti, permettono un controllo parziale del risultato finale e il loro utilizzo sistematico rende molto pesante il codice.
Un sistema più elegante del precedente consiste nell'utilizzo degli attributi di stile. Questi possono essere inclusi direttamente nel marcatore o raggruppati in uno o più fogli riutilizzabili, da associare a ogni pagina.
Con il foglio di stile è possibile creare tante versioni dello stesso marcatore, ognuna con le sue caratteristiche e con un buon livello di controllo sull'effetto finale. Anche in questo caso c'è il problema della compatibilità fra browser, ma un bravo sviluppatore potrà comunque ottenere risultati apprezzabili e uniformi senza grosse difficoltà. Almeno per quanto riguarda le versioni più recenti dei software di navigazione più diffusi.
Tutto questo funziona alla condizione che, tuttavia, il linguaggio sia conosciuto dal browser. Questo può essere valido per l'Html, al limite anche per uno dei linguaggi XML predefiniti, come il MathML, ma certamente non per un linguaggio XML disegnato ad hoc da un qualunque sviluppatore per gestire una serie di pagine specializzate. Un browser non può sapere cosa vuol dire <INDIRIZZO> oppure <ETICHETTA>, né si possono registrare tutti i linguaggi definiti con XML, anche perché questo linguaggio si presta ad una proliferazione di marcatori specifici e linguaggi specializzati e questa flessibilità rappresenta in fondo la sua vera forza. In teoria, ognuno potrebbe inventarsi un linguaggio formato da non più di quattro marcatori per gestire una serie di 100 o 200 pagine con la stessa struttura. Un linguaggio del genere sarebbe talmente legato ad un'esigenza specifica da risultare non riutilizzabile in altri siti e quindi non avrebbe molto senso pubblicarne le specifiche apposite o registrarlo.
La rappresentazione degli elementi in XML
Per risolvere questo problema si è deciso di inventare un linguaggio apposito, a sua volta definito tramite XML, chiamato Extensible Stylesheet Language, o più semplicemente XSL.
XSL fornisce due funzioni distinte. La prima consiste in un vero e proprio linguaggio per la conversione di linguaggi XML. In pratica XSL permette di interpretare un file scritto in un linguaggio XML e trasformarlo in qualcos'altro, in Html, per esempio, gestibile dal browser. Il vantaggio è che da una pagina scritta con un linguaggio sintetico e chiaro da leggere si può generare un codice Html complesso, altrimenti difficile da sviluppare e mantenere, guadagnando in leggibilità e prestazioni.
È vero, infatti, che il codice XSL che definisce i criteri di conversione può essere abbastanza "pesante" e il browser deve caricarlo per visualizzare la pagina, ma è anche vero che tutte le pagine da trasformare diventano molto più piccole e che è possibile definire un solo foglio di stile per tutto il sito.
La seconda funzione consiste in un vocabolario per le specifiche semantiche di rappresentazione di una serie di elementi di un documento. Questa funzionalità è simile a quella fornita dai fogli di stile a cascata (CSS), con la differenza che non fa riferimento a un insieme specifico di marcatori, ma permette di definirne di nuovi, ognuno con le sue caratteristiche. Non sempre, infatti, è possibile associare a un marcatore XML un corrispondente tag o blocco di marcatori in un linguaggio predefinito come l'Html. A volte un tag XML corrisponde a un concetto che non ha equivalente in Html, per cui una semplice conversione del codice, può non essere sufficiente. D'altra parte è proprio per il continuo svilupparsi di nuovi elementi, a fronte di specifiche necessità, che l'Html fino a oggi ha subito continue evoluzioni con l'aggiunta di nuovi marcatori, spesso non riconosciuti da tutti i browser.
Facciamo un esempio pratico. Consideriamo l'Html standard, ovvero ignoriamo le estensioni specifiche di Netscape Communicator o di Microsoft Internet Explorer e supponiamo di voler definire una pagina a più colonne. Nell'Html base non esiste alcun modo di specificare che una pagina dev'essere sviluppata in questo modo. Finora, a meno di non usare estensioni non standard, l'unico modo di simulare delle colonne è stato quello di utilizzare una tabella per dividere la pagina in settori. Se usassimo XSL per convertire un immaginario marcatore XML <COLONNA> in Html, saremmo costretti a fare lo stesso, cioè a convertire l'elemento in questione in una struttura a celle. Una colonna, tuttavia, non è una semplice cella verticale, ma ha un comportamento peculiare che non corrisponde a una tabella Html. Ci si aspetta, infatti, che in una colonna il testo scorra in basso fino al margine inferiore, per poi passare nella colonna successiva. Questo non avviene nella cella di una tabella.
Creando invece un nuovo elemento di cui possiamo definire il comportamento, il problema non si porrà. Per fare questo avremo, però, bisogno di qualcosa di più che una semplice conversione in Html. Ci servirà piuttosto un linguaggio che consenta di specificare varie tipologie di elementi in base alla loro struttura e al loro comportamento, in modo da poter assegnare al nostro oggetto "colonna" le giuste caratteristiche.
Di recente il W3C ha definito nella bozza della versione 1.0 di XSL le specifiche di rappresentazione relative alla disposizione del testo su più colonne o alla divisione della pagina in settori disposti a griglia.
XSL come convertitore di documenti XML
Ecco un esempio pratico per farsi un'idea di cosa sia possibile fare con XSL. Non troverete questo esempio nelle specifiche, perché è stato sviluppato appositamente per Internet News.
Immaginate di avere una serie di prodotti e che per ognuno di questi vogliate mostrare una piccola foto, diciamo una miniatura selezionabile, il nome del prodotto e il prezzo. In Html dovreste scrivere un codice più o meno come quello riportato nel listato 1.
<TABLE WIDTH="100%" BORDER="1" CELLSPACING="2" CELLPADDING="2" BORDERCOLOR="#FF0000">
<TR>
<TH WIDTH="140" ALIGN="CENTER" VALIGN="MIDDLE">
Prodotto
</TH>
<TH ALIGN="CENTER" VALIGN="MIDDLE">
Descrizione
</TH>
<TH WIDTH="100" ALIGN="CENTER" VALIGN="MIDDLE">
Prezzo
</TH>
</TR>
<TR>
<TD WIDTH="140" ALIGN="CENTER" VALIGN="TOP">
<A HREF="bimb_full.jpg" TARGET="_top"><IMG SRC="bimb_120.jpg" BORDER=0 ALT="BimboBello"></A>
</TD>
<TD WIDTH="*" ALIGN="LEFT" VALIGN="TOP">
Bambolotto <EM>Bimbo Bello</EM> completo di ciucciotto e bavaglino.
</TD>
<TD WIDTH="100" ALIGN="RIGHT" VALIGN="TOP">
<FONT FACE="Verdana" COLOR="#0000FF">EUR 14,00</FONT>
</TD>
</TR>
<TD WIDTH="140" ALIGN="CENTER" VALIGN="TOP">
<A HREF="bell_full.jpg" TARGET="_top"><IMG SRC="bell_120.jpg" BORDER=0 ALT="Barbarella"></A>
</TD>
<TD ALIGN="LEFT" VALIGN="TOP">
Bambolina <EM>Barbarella</EM> snodata e con accessori (spazzola e pettine).
</TD>
<TD WIDTH="100" ALIGN="RIGHT" VALIGN="TOP">
<FONT FACE="Verdana" COLOR="#0000FF">EUR 8,25</FONT>
</TD>
</TR>
<TD WIDTH="140" ALIGN="CENTER" VALIGN="TOP">
<A HREF="capf_full.jpg" TARGET="_top"><IMG SRC="capf_120.jpg" BORDER=0 ALT="CapFusto"></A>
</TD>
<TD ALIGN="LEFT" VALIGN="TOP">
<EM>Capitan Fusto</EM> con fucile laser a tachioni e scudo in turchite.
</TD>
<TD WIDTH="100" ALIGN="RIGHT" VALIGN="TOP">
<FONT FACE="Verdana" COLOR="#0000FF">EUR 7,50</FONT>
</TD>
</TR>
</TABLE>
Listato 1 - Catalogo prodotti in Html
Come si può vedere si tratta di un codice che, pur non essendo così complesso dal punto di vista Html, è poco leggibile. Esso, infatti, non consente di identificare in modo chiaro la struttura e il contenuto del catalogo e non è affatto facile da mantenere. Se, per esempio, decidessimo di modificare la tabella, aggiungendo o togliendo una colonna, oppure modificando gli attributi di una serie di celle, dovremmo intervenire pesantemente su più marcatori contemporaneamente.
Proviamo allora a scrivere un semplice linguaggio XML pensato appositamente per questo tipo di oggetto. Alla fine ci troveremo ad avere a che fare con non più di sette marcatori e sei attributi, come si può vedere nel listato 2.
<CATALOGO BORDO="#FF0000">
<INTESTAZIONE>
<ETICHETTA TIPO="IMG">Prodotto</ETICHETTA>
<ETICHETTA TIPO="DSC">Descrizione</ETICHETTA>
<ETICHETTA TIPO="PRZ">Prezzo</ETICHETTA>
</INTESTAZIONE>
<PRODOTTO>
<IMMAGINE MINIATURA="bimb_120.jpg" INTERA="bimb_full.jpg" TESTO="BimboBello"/>
<DESCRIZIONE>Bambolotto <EM>Bimbo Bello</EM> completo di ciucciotto e bavaglino.</DESCRIZIONE>
<PREZZO VALUTA="EUR">14,00<PREZZO>
</PRODOTTO>
<PRODOTTO>
<IMMAGINE MINIATURA="bell_120.jpg" INTERA="bell_full.jpg" TESTO="Barbarella"/>
<DESCRIZIONE>Bambolina <EM>Barbarella</EM> snodata e con accessori (spazzola e pettine).</DESCRIZIONE>
<PREZZO VALUTA="EUR">8,25<PREZZO>
</PRODOTTO>
<PRODOTTO>
<IMMAGINE MINIATURA="capf_120.jpg" INTERA="capf_full.jpg" TESTO="CapFusto"/>
<DESCRIZIONE><EM>Capitan Fusto</EM> con fucile laser a tachioni e scudo in turchite.</DESCRIZIONE>
<PREZZO VALUTA="EUR">7,50<PREZZO>
</PRODOTTO>
</CATALOGO>
Listato 2 - Catalogo prodotti in XML
La leggibilità è sicuramente migliorata. Purtroppo, però nessun programma di navigazione sarà, infatti, capace di comprendere il codice XML che abbiamo scritto. Al massimo, scrivendo le specifiche DTD corrispondenti sarà in grado di convalidarlo. D'altra parte, visto che quello che stiamo cercando di fare è generare una semplice tabella, possiamo pensare di usare la prima delle funzioni XSL, quella cioè che permette di convertire un documento XML in un documento scritto in un altro linguaggio, in questo caso l'Html.
Per prima cosa definiamo tre costanti per le etichette dell'intestazione (listato 3).
<xsl:define-constant name="img-label" value="Prodotto"/>
<xsl:define-constant name="dsc-label" value="Descrizione"/>
<xsl:define-constant name="prz-label" value="Prezzo"/>
<xsl:define-attribute-set name="img-cell-attr">
<xsl:attribute-set width="140" align="CENTER" valign="TOP"/>
</xsl:define-attribute-set>
<xsl:define-attribute-set name="dsc-cell-attr">
<xsl:attribute-set width="*" align="LEFT" valign="TOP"/>
</xsl:define-attribute-set>
<xsl:define-attribute-set name="prz-cell-attr">
<xsl:attribute-set width="100" align="RIGHT" valign="TOP"/>
</xsl:define-attribute-set>
Listato 3 - Costanti ed attributi XSL
Poi definiamo tre insiemi di attributi da utilizzare per le varie colonne. A questo punto scriviamo il pezzo di codice XSL che converte l'elemento catalogo (listato 4).
<xsl:template match="CATALOGO">
<TABLE WIDTH="100%" BORDER="1" CELLSPACING="2" CELLPADDING="2" BORDERCOLOR="{attribute(BORDO)}">
<xsl:process-children/>
</TABLE>
</xsl:template>
Listato 4 - Schema di conversione per l'elemento CATALOGO
Per far questo usiamo uno schema di conversione, ovvero un'istruzione xsl:template che permette di selezionare un particolare componente - in questo caso catalogo- e di convertirlo in una serie di altre istruzioni. Come si può vedere, la conversione avviene in modo "iterativo". L'istruzione xsl:process-children dice semplicemente al processore XSL di convertire tutto ciò che è compreso fra <CATALOGO> e </CATALOGO> per cui la conversione avverrà semplicemente sostituendo alla coppia di marcatori XML i marcatori Html che segnalano l'inizio e la fine di una tabella, processando le istruzioni all'interno dell'elemento catalogo sulla base di altri schemi di conversione che vedremo più avanti.
Da notare l'istruzione {attribute(BORDO)} che permette di estrarre dal marcatore XML il valore di un attributo in modo da poterlo utilizzare nel marcatore Html <TABLE>.
Adesso dobbiamo definire altri due schemi di conversione, uno per l'intestazione e uno per l'elemento prodotto. Il primo utilizza una selezione multipla per convertire i vari elementi etichetta in marcatori <TH> generati in modo differente a seconda del tipo di campo che intendiamo associare alla colonna corrispondente (listato 5).
<xsl:template match="INTESTAZIONE">
<TR>
<xsl:for-each select="ETICHETTA">
<xsl:choose>
<xsl:when test="attribute(TIPO)="IMG">
<TH xsl:use="img-cell-attr" ALIGN="CENTER" VALIGN="MIDDLE">
<xsl:value-of expr="constant(img-label)"/>
</TH>
</xsl:when>
<xsl:when test="attribute(TIPO)="DSC">
<TH xsl:use="dcs-cell-attr" ALIGN="CENTER" VALIGN="MIDDLE">
<xsl:value-of expr="constant(dsc-label)"/>
</TH>
</xsl:when>
<xsl:when test="attribute(TIPO)="PRZ">
<TH xsl:use="prz-cell-attr" ALIGN="CENTER" VALIGN="MIDDLE">
<xsl:value-of expr="constant(prz-label)"/>
</TH>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</TR>
</xsl:template>
Listato 5 - Schema di conversione per l'elemento INTESTAZIONE
Da notare che per la generazione degli attributi dell'intestazione della colonna abbiamo riutilizzato gli insiemi definiti precedentemente. Dato tuttavia che l'allineamento dei titoli è differente rispetto a quello dei campi, abbiamo esplicitato gli attributi ALIGN e VALIGN che a questo punto assumono precedenza su quelli prodotti dall'istruzione xsl:use. Il testo del titolo viene invece ricavato dalle tre costanti definite inizialmente. Ovviamente è possibile realizzare programmi XSL più complessi e flessibili, rendendoli per esempio parametrici.
Per quanto riguarda il prodotto, invece, abbiamo uno schema più immediato, che tuttavia sfrutta le funzioni di sostituzione delle stringhe di caratteri (listato 6).
<xsl:template match="PRODOTTO">
<TR>
<TD xsl:use"img-cell-attr">
<A HREF="{IMMAGINE/attribute(INTERA)}" TARGET="_top">
<IMG SRC="{IMMAGINE/attribute(MINIATURA)}" BORDER=0 ALT="{IMMAGINE/attribute(TESTO)}">
</A>
</TD>
<TD xsl:use"dsc-cell-attr">
<xsl:value-of expr="DESCRIZIONE"/>
</TD>
<TD xsl:use"prz-cell-attr">
<xsl:value-of expr="PREZZO/attribute(VALUTA)"/>
<xsl:text> </xsl:text>
<xsl:value-of expr="PREZZO"/>
</TD>
</TR>
</xsl:template>
Listato 6 - Schema di conversione per l'elemento PRODOTTO
In XSL è infatti possibile fare riferimento a vari tipi di stringhe contenute nel documento origine - quello XML, tanto per intenderci - utilizzando vari modelli di specifiche.
Per esempio, se vogliamo estrarre tutto il contenuto dell'elemento <titolo>, basta scrivere {titolo}. Se invece di quell'elemento vogliamo estrarre il valore dell'attributo altezza, dobbiamo scrivere {titolo/attribute(altezza)}. Il contenuto del primo elemento <linea> di una <lista> si ottiene con {lista/linea[first-of-type()]} mentre una linea di una lista compatta sarà {lista[compact]/linea}. Altri esempi sono riportati nel listato 7.
<COPERTINA>
<TITOLO>Il Corriere dei Cuccioli</TITOLO>
<ILLUSTRAZIONE IMMAGINE="orsacchiotto.jpg"/>
<EDIZIONE DATA="Maggio 1999" ANNO="2" NUMERO="5"/>
<TESTO POSIZIONE="1cm,1cm" DIREZIONE="0" CARATTERE="Sans Serif" ALTEZZA="8pt">
Spedizione in abbonamento postale - 45% - art.2 comma 20/b legge 662/96 - Filiale di Genova
</TESTO>
<TESTO POSIZIONE="1cm,20cm" DIREZIONE="90" CARATTERE="Sans Serif" ALTEZZA="10pt">
In caso di mancata consegna restituire al mittente che si impegna a pagare la relativa tassa
</TESTO>
<TESTO POSIZIONE="3cm,8cm" DIREZIONE="0" CARATTERE="Modern" ALTEZZA="20pt" COLORE="rosso">
Capitan Fusto: l'eroe del 2000?
</TESTO>
<PREZZO>&lire;5.000</PREZZO>
<PREZZO ID="euro">€2,58</PREZZO>
</COPERTINA>
Listato 7 - Alcune espressioni di sostituzione in XSL
In pratica, le parentesi graffe indicano che vogliamo sostituire un'espressione con il testo equivalente. Il contenuto di un elemento è rappresentato semplicemente dal nome dello stesso. Un elemento contenuto direttamente in un altro, detto genitore, è rappresentato dal nome di quest'ultimo, separato da quello del figlio attraverso una barra diagonale, come si fa con gli Url in Html. Un elemento contenuto all'interno di un altro elemento, detto antenato, qualunque sia il livello di annidamento, utilizza invece due barre diagonali. Ad esempio, {BODY//DIV} rappresenta una qualunque divisione nel corpo di una pagina Html.
Gli attributi di un marcatore sono selezionati usando la funzione attribute(), mentre la ancestor() rappresenta il genitore di un elemento. Con la funzione id() si seleziona il marcatore che ha l'identificativo specificato. Altre funzioni, come first-of-type() o not-last-of-any() permettono di selezionare un certo elemento da un insieme di elementi dello stesso tipo. È inoltre possibile qualificare un elemento usando le parentesi quadre. Ad esempio, {PARAGRAFO[attribute(RIENTRO)="2cm"]} seleziona il primo paragrafo che rientra di 2 centimetri, mentre {articolo[catalogo]/autore} seleziona l'elemento autore solo di quei libri che hanno un numero di catalogo. XSL fornisce quindi una serie di istruzioni e funzioni che danno un elevato controllo nell'analizzare il documento origine ed estrarne specifici elementi via via che servono.
XSL contiene molte altre istruzioni utili, come xsl:number, che permette di gestire la numerazione automatica di elementi come capitoli, annotazioni, note a piè di lista, e così via. Questa istruzione ha molti attributi che permettono un elevato livello di controllo sullo schema di numerazione. Per esempio
<xsl:number level="multi" count="capitolo|sezione" format="1.1. "/>
numera i capitoli 1, 2, 3 … le sezioni 1.1, 1.2, 1.3 e via dicendo, mentre l'istruzione
<xsl:template match="linea">
<fo:block>
<xsl:number level="any" from="lista" format="(i)"/>
<xsl:process-children/>
</fo:block>
</xsl:template>
numera le varie linee di una lista con una sequenza di numeri romani, cioè i, ii, iii, iv e così via.
Un'altra utile istruzione è xsl:text che permette di includere nel documento finale una determinata stringa di testo. È poi possibile scrivere vere e proprie macro (xsl:define-macro e xsl:invoke) o copiare il contenuto di un elemento così com'è (xsl:contents).
La semantica di rappresentazione degli elementi
Nell'esempio riportato sopra abbiamo visto uno strano marcatore identificato dal prefisso fo. Ricordiamo che in XML il prefisso rappresenta lo spazio dei nomi a cui il marcatore corrispondente appartiene. Questo perché la possibilità di inventare continuamente nuovi marcatori richiede che venga sempre specificato il linguaggio XML a cui essi appartengono. fo sta per Formatting Objects, e rappresenta quel famoso vocabolario su cui si basa la seconda delle funzioni di XSL, quella che consente di specificare come determinati elementi devono essere visualizzati.
Prendiamo il codice riportato nel listato 8.
<fo:page-sequence xmlns:fo="http://www.w3.org/TR/WD-xsl/FO" font-family"sans serif">
<fo:simple-page-master name="scrolling"/>
<fo:queue queue-name="body">
<fo:block font-size="20pt" font-weight="bold">Vita Nuova</fo:block>
<fo:block>di <fo:sequence font-style="italic">Dante Alighieri</fo:sequence></fo:block>
<fo:block>
Nove fiate già appresso lo mio nascimento era tornato lo cielo de la luce quasi a uno medesimo
punto, quanto a la sua propria girazione, quando a li miei occhi apparve prima la gloriosa donna
de la mia mente, la quale fu chiamata da molti Beatrice, li quali non sapeano che si chiamare.
</fo:block>
</fo:queue>
</fo:page-sequence>
Listato 8 - Esempio di marcatori fo
Il primo marcatore indica che stiamo definendo una sequenza d'impaginazione valida sia per la visualizzazione a terminale sia per la stampa delle pagine. L'attributo xmlns riporta lo spazio dei nomi utilizzato e dove si trovano le corrispondenti specifiche. All'interno di questo blocco troviamo il marcatore che specifica lo schema base utilizzato per le pagine di questo modello. Esistono al momento solo quattro schemi base: first, odd, even e scrolling. I primi tre si riferiscono a una struttura a pagine singole, relativa alla prima pagina o alla copertina, a tutte le pagine dispari e a tutte quelle pari.
Il quarto schema riguarda invece le strutture a scorrimento, cioè quelle non divise in pagine. Tenete presente che una "pagina" Html è in realtà una struttura continua, non suddivisa in pagine. Una presentazione realizzata con software quali Freelance Graphics o PowerPoint ha invece una struttura a pagine. Ogni schema permette di definire cinque aree, ovvero header, body, footer, start-side ed end-side, più un titolo (title) solo per le presentazioni in linea, però.
Nel nostro caso, definiamo solo l'area body, ovvero il corpo della pagina. Per far questo usiamo il marcatore fo:queue. All'interno di quest'area definiamo vari blocchi di testo. Il marcatore fo:block va utilizzato per blocchi di testo e di grafica distribuiti su più righe, per esempio un paragrafo o un'annotazione, mentre fo:sequence va usato per stringhe di testo in linea, come gruppi di parole a cui si vuole dare una particolare enfasi (grassetto o corsivo), oppure termini da rappresentare con un carattere differente (per esempio i comandi di un sistema operativo da visualizzare con un carattere a spaziatura costante).
Altre specifiche fo sono fo:list, per le liste, fo:character, per i glifi o altri simboli speciali, fo:rule-graphic, per le linee, fo:graphic, per la grafica, fo:score, per particolari stili di evidenziazione come il barrato o il sottolineato, e fo:boxes, per realizzare aree con bordi o con uno sfondo colorato.
Come si può vedere mancano ancora molti tipi di oggetti. Oltre alle strutture di impaginazione, come quelle a più colonne, manca la possibilità di definire oggetti con posizione variabile (floating), il supporto a schemi di impaginazione non standard tipici di alcune lingue, soprattutto quelle orientali, come i paragrafi bustrofedici, la scrittura da destra a sinistra, quella che si sviluppa verticalmente, e altri modelli anche più complessi. Inoltre, non esistono oggetti per generare indici, riferimenti incrociati e citazioni, così come tabelle, equazioni matematiche e oggetti interattivi.
Anche così, scrivere un file XSL non è certo semplice, tanto più che il numero di marcatori e di attributi cresce continuamente. Un linguaggio completo potrebbe richiedere più di 300 pagine di specifiche. Al momento, infatti, la maggior parte degli esempi di XSL riguardano più il suo utilizzo come convertitore di file XML in Html piuttosto che per la definizione di linguaggi a marcatori completamente nuovi.
Per chi ne volesse sapere di più, comunque, le specifiche della bozza della versione 1.0 di XSL possono essere trovate all'indirizzo
http://www.w3.org/TR/WD-xsl
|