# 8 - Le trasformazioni XML e i fogli di stile

L'Extensible Stylesheet Language (XSL) proponeva inizialmente l'utilizzo di fogli di stile per xml ed era esso stesso un'applicazione xml. Lo scopo originario di questi fogli di stile era di specificare le trasformazioni dei documenti xml in modo che potessero venire stampati o visualizzati dai browser Web. In seguito XSL e' stato suddiviso in due linguaggi standard:

- XSL Formatting Objects (XSL-FO), un potente meccanismo per descrivere la presentazione di documenti XML;
- XSL Transformations (XSLT), utilizzato per trasformare un documento XML in una forma diversa, talvolta utilizzando le DTD

Spesso un documento XML viene trasformato in un documento HTML. XSLT utilizza fogli di stile per specificare le trasformazioni, le quali possono includere informazioni di presentazione HTML e CSS. In questa lezione si descrive esclusivamente la forma e l'utlizzo di XSLT, spesso chiamato semplicemente XSL.

## I fogli stile XSLT

I fogli di stile XSLT utilizzano un approccio molto diverso da quello dei CSS, in quanto i primi contengono uno o piu' modelli per descrivere la struttura desiderata del documento nella quale possono venire inseriti i dati di un documento XML. Ogni parte di ciascun modello deve identificare la parte dei dati XML con cui e' associata.

Il processore XSLT unisce il documento XML al documento di foglio di stile XSLT modo simile alla funzione stampa unione (in cui un file contenente nomi e indirizzi viene unito ad un file di una lettera).

Il modello XSLT di fusione dei dati XML in modelli XSLT viene chiamato modello basato sul modlelo. Questo modello utilizza dati consistenti in molteplici istanze di insiemi di dati altamente regolari. XSLT puo' occuparsi anche di dati irregolari e ricorrenti garzie a frammenti di modelli nel modello su base di dati. Un unico foglio di stile XSLT puo' includere il meccanismo per entrambi i modelli. Tuttavia in questa lezione verra' decsritto solo il modello su base di dati.

Nonostante i fogli di stile XSLT possano venire utilizzati per controllare il layout di pagina, l'orientamento, la direzione di scrittura, i margini e la numerazione di pagina, questa lezione decsrive solo le specifiche di formattazione piu' semplici per le unita' di informazione piu' piccole. XSLT include piu' di 50 tipi di oggetti di formattazione (elementi) e piu' di 230 proprieta', per cui e' un set di tag complesso e consistente (rimandiamo alla lettura del capitolo 12 del libro "XML corso di programmazione" di Deitel, Deitel, Nieto, Lin, Sadhu, ed. Apogeo).

La seguente figura illustra l'architettura generale che consente la trasformazione di un documento XML in un documento di layout HTML

Un documento XML da unire a un foglio di stile XSLT deve includere un'istruzione di elaborazione per indicare al processore XSLT di utilizzare un foglio di stile XSL. La forma di questa istruzione e' la seguente:

`<?xml-stylesheet type = "text/xsl" href = "nome_foglio_stile_xsl"?>`

Il seguente e' un semplice esempio di documento XML da formattare con XSLT

Esempio di file XML : xslplane.xml (versione XML) ---- xslplane.xml (versione TXT)

Si noti come questo documento XML specifichi il proprio foglio di stile XSLT con il nome `xslplane.xsl`

Un foglio di stile XSLT consiste in un documento XML dotato di un elemento `stylesheet` a cui e' attribuita una funzione speciale: definisce i namespace come propri attributi ed include l'insieme di elementi a cui verra' applicato . Questo tag identifica anche il documento come XSLT. Il namespace per tutti gli elementi XSLT viene specificato con l'URL del W3C, mostrato come attributo nel seguente tag `stylesheet`:

`<xsl:stylesheet xmlns:xsl = "http://www.w3c.org/1999/XSL/Format">`

Sfortunatamente il browser Internet Explorer 5 e' basato su una bozza precedente al namespace per XSL, per cui quest'ultimo non funziona con i browser IE5. L'indirizzo del piano di lavoro e' http://www.w3c.org/TR/WD-xsl e viene utilizzato negli esempi di questa lezione.

Si noti come il prefisso per gli elementi XSLT sia `xsl`. Un elemento `stylesheet` deve includere almeno un elemento `template>`, che viene utilizzato dal processore XSLT per visualizzare un ramo particolare nella gerarchia di elementi di un documento XML.

Per specificare un ramo della gerarchia (albero!) degli elementi del documento xml si ricorre all'attributo `match` dell'elemento `template>`. Nel caso piu' semplice il modello corrisponde all'intero documento XML. In questo caso uno `stylesheet` XSLT specifica il formato dell'intero documento XML senza inpiegare il foglio di stile in modo ripetuto, per cui si potrebbe utilizzare il seguente tag `template>`:

`<xsl:template match = "/">`

Il valore `match="/"`specifica l'intera struttura dei dati XML rappresentata dalla radice del documento. Viene utilizzata una notazione simile a quella che specifica gli indirizzi delle directory (Unix). Ogni foglio di stile XSLT deve includere un modello per la radice `"/"`. Un foglio di stile potrebbe avere modelli per rami specifici della gerarchia di elementi, come in questo caso:

`<xsl:template match = "plane/year">`

I fogli di stile XSLT includono due tipi di elementi distinti:

1. quelli che includono effettivamente un contenuto, e
2. quelli che specificano il contenuto del documento XML associato da unire

Al primo tipo appartengono gli elementi XSLT che rappresentano elementi HTML: vengono utilizzati spesso per specificare il contenuto e hanno appunto l'aspetto di tali elementi HTML associati. Per esempio, si consideri il seguente elemento HTML:

`<span style = "font-style : italic"> Year: </span>`

Tutti gli elementi XSLT che rappresentano elementi HTML vengono copiati dal processore XSLT nell'output HTML mentre questo viene generato. Si noti come tutti gli elementi HTML che appaiono in un documento XSLT debbano adeguarsi alle restrizioni sintattiche in vigore per gli elementi XML (ed XHTML).

Al secondo tipo appartengono gli elementi XSLT utilizzati per unire i dati XML. L'elemento `value-of` e' uno di questi elementi, ed e' tra i piu' semplici. Tale elemento dispone dell'attributo `select` che specifica una parte dei dati XML da unire nel documento XSLT. Per esempio, si consideri:

`<xsl:value-of select = "plane/year" />`

Questo elemento specifica che i dati devono venire uniti in quel punto nel documento XSLT dall'elemento `year` incorporato nell'elemento `plane` del documento HTML. Si noti come l'elemento `value-of` non possa disporre di un contenuto, per cui si comporta come un elemento vuoto.

L'attributo `select` puo' specificare qualsiasi ramo dell'albero del documento XML. Questa possibilita' rappresenta un vantaggio della formattazione XSLT rispetto ai CSS, nel quale l'ordine dei dati memorizzati e' l'unico ordine di visualizzazione possibile.

Di seguito viene presentato il foglio di stile XLST completo per il documento xslplane.xml (versione TXT) visto precedentemente:

Esempio di Foglio di stile XSLT : xslplane.xsl (versione XSL) ---- xslplane.xsl (versione TXT)

Se il browser in uso contiene un processore XSLT per i file XML (le versioni di Internet Explorer successive alla versione 5 contengono il processore XSLT) allora ecco come verra' visualizzato il documento xslplane.xml a cui e' stato associato il foglio di stile XSLT appena visto (`xslplane.xsl`):

In atre parole, il processore genera un file HTML di layout che potra' successivamente essere salvato con estensione HTML . In alternativa si puo' usare il processore XSLT incorporato nell'edior XLMSpy dell'Altova a cui si e' fatto cenno nella lezione 4.4.2. Bastera' infatti aprire nell'editor XMLSpy file `xslplane.xml`, successivamente bastera' cliccare sul bottone "XSL Transformation" nel menu' in alto con l'icona XSL (attraversato da una freccia con la punta rivolat in basso), verra' cosi' generato un file XSL Output.html, come nella figura sotto: