In questo capitolo andiamo ad analizzare la seconda componente di XSL, XSL-FO.
XSL-Formatting Objects è un linguaggio, anch'esso basato su XML, per la specifica di una semantica di formattazione dei contenuti di un documento XML.
All'interno di un documento XSL-FO possiamo definire le regole di impaginazione delle informazioni che vogliamo visualizzare, andando ad esprimere la posizione dei singoli contenuti nella pagina.
Grazie a XSL-FO possiamo produrre, ad esempio dei documenti PDF, RTF o PS, rappresentanti il contenuto di un documento XML.
Il documento XSL-FO viene analizzato da un processore XSL-FO che si occupa di produrre il documento di output, in base alle regole specificate nel documento di input.
La struttura di un file XSL-FO è la seguente:
<?xml version="1.0"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<!--modello pagina-->
</fo:layout-master-set>
<fo:declarations>
<!--dichiarazioni globali-->
</fo:declarations>
<fo:page-sequence>
<!--contenuti pagine-->
</fo:page-sequence>
</fo:root>
All'interno dell'elemento <layout-master-set> vanno inserite le regole di impaginazione per la pagina master, ovvero la pagina che costituisce il modello per tutte le altre pagine del documento.
Il secondo elemento (<declarations>)contiene eventuali dichiarazioni globali al file XSL-FO; mentre l'elemento <page-seguence> contiene la definizione delle informazioni contenute nelle pagine che costituiranno il documento finale.
Per cercare di capire meglio il funzionamento di XSL-FO vediamo di analizzare il seguente documento di esempio:
<?xml version="1.0"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<fo:simple-page-master master-name="PaginaA4"
page-height="29.7cm" page-width="21cm" margin-top="1.5cm"
margin-bottom="1.5cm" margin-left="2.5cm" margin-right="2.5cm">
<fo:region-body margin-top="1.8cm"/>
<fo:region-before extent="1.3cm"/>
<fo:region-after extent="1.3cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="PaginaA4">
<fo:title>Esempio XSL-FO</fo:title>
<fo:static-content flow-name="xsl-region-before">
<fo:block text-align="end" font-size="8pt" font-family="times">
Esempio XSL-FO
</fo:block>
</fo:static-content>
<fo:static-content flow-name="xsl-region-after">
<fo:block text-align="end" font-size="8pt" font-family="times">
Pagina <fo:page-number/>
</fo:block>
</fo:static-content>
<fo:flow flow-name="xsl-region-body">
<fo:block text-align="center" font-size="14pt" font-family="times" color="blue">
Testo della prima pagina dell'esempio XSL-FO.
</fo:block>
<fo:block break-before="page" text-align="center" font-size="14pt" font-family="times" color="green">
Testo della seconda pagina dell'esempio XSL-FO.
</fo:block>
</fo:flow>
</fo:page-sequence>
</fo:root>
Come detto in precedenza, il modello della pagina master viene definito con l'elemento <single-page-master>.
Nel nostro caso, al suo interno, abbiamo specificato le misure di un foglio in formato A4 utilizzando gli attributi dell'elemento.
Inoltre abbiamo indicato anche la dimensione dell'intestazione (con l'elemento <region-before>), la dimensione del piè di pagina (con l'elemento <region-after>) e del contenuto della pagina (con l'elemento <region-body>).
Una volta stabilito il modello della pagina andiamo a specificare il contenuto delle pagine del nostro documento con l'elemento <page-sequence>.
Gli elementi che troviamo al suo interno sono:
- <title>: permette di specificare il titolo del documento;
- <static-content>: indica le informazioni che verranno ripetute in ogni pagina;
- <flow>: elemento che contiene il contenuto delle pagine.
Nel nostro esempio abbiamo definito, in <static-content>, l'intestazione delle pagine del documento contenente il titolo e il piè di pagina con il numero di pagina, che viene calcolato in maniera automatica grazie al tag <page-number>.
Nell'elemento <flow> abbiamo definito il contenuto delle due pagine che costituiscono il nostro esempio.
Il risultato della trasformazione del documento di esempio da parte del processore XSL-FO è il documento PDF mostrato in figura.
Se volessimo creare un documento XSL-FO in grado di visualizzare il contenuto di un documento XML allora sarebbe necessario applicare una prima trasformazione XSLT al file XML, in modo da produrre il file XSL-FO con le regole di impaginazione.
Una volta prodotto questo documento saremmo in grado di utilizzare il processore XSL-FO per creare, ad esempio, un documento PDF contenente i dati del documento XML di partenza.
Per maggiori approfondimenti su XSL-FO vi rimando, anche in questo caso, alla lettura della specifica sul sito del W3C, all'indirizzo: http://www.w3.org/tr/xsl/.
Il processore utilizzato per realizzare l'esempio è FOP, un processore XSL-FO , sviluppato in Java e liberamente prelevabile all'indirizzo: http://xml.apache.org/fop/.