Namespace e template di XSL
Introduzione
Nel documento XSLT si usano elementi provenienti da almeno due namespace:
- quello di XSLT;
- quello del modello di documenti di destinazione.
- Iterativo, o Pull: basata su template, viene usata tipicamente per trasformare dati. In un documento pre-formattato per l'output, si vanno ad inserire le parti di documento tratte dal file d'origine. Si ispirano sostanzialmente ai linguaggi di inclusione (ad es. server-side include tipo PHP e simili).
- Ricorsivo, o Push: basata su regole, usata tipicamente per trasformare documenti. Per ogni elemento dei documenti di input, si cerca la regola più appropriata e la si usa per scrivere il risultato. Si ispirano ai linguaggi di riscrittura basati su regole (tipo DSSSL)
I fogli di stile tipo pull sono adatti per riscrivere documenti XML dalla struttura di database, molto ripetitivi, ad esempio:
<portfolio titoli>
<indice="MIB">
<nome>la mia società</nome>
<sym>ZCXM</sym>
<prezzo>28.875</prezzo>
</indice>
<indice="Nikkei">
<nome>la sua società</nome>
<sym>ZFFX</sym>
<prezzo>92.250</prezzo>
</indice>
<indice="nasdaq">
<name>la nostra società</nome>
<sym>ZYSZ</sym>
<prezzo>20.313</prezzo>
</indice>
</portfolio titoli>
Di seguito è illustrato un foglio di stile XSLT di tipo pull per generare un documento HTML con i dati di sopra:
<HTML xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/HTML4/">
<BODY>
<TABLE BORDER="2">
<TR><TD>Indice</TD><TD>Nome</TD><TD>Prezzo</TD></TR>
<xsl:for-each select="portfoliotitoli">
<TR>
<TD><xsl:value-of select="sym"/> </TD>
<TD><xsl:value-of select="nome"/></TD>
<TD><xsl:value-of select="prezzo"/></TD>
</TR>
</xsl:for-each>
</TABLE>
</BODY>
</HTML>
</HTML>
Quello di sopra è sostanzialmente un documento HTML con qualche tag strano, che spiegheremo nei capitoli successivi, per ora diciamo che:
- xsl:for-each va a cercare uno ad uno una sequenza di elementi ed applica le istruzioni al suo interno per ciascun elemento;
- xsl:value-of va a cercare il valore (cioè il contenuto) di ogni elemento all’interno di xsl:foreach, e lo inserisce al suo posto.
Supponiamo di avere questo documento XML dalla struttura di documento, molto diversificato:
<document>
<titolo>In principio era ...</titolo>
<sezione>
<titolo>Il primo giorno</titolo>
<paragrafo>Quando non c'era ancora niente
<enfatizzato>lui</enfatizzato>
fu impegnato nella<enfatizzato>creazione</enfatizzato>
di tutto</paragrafo>
<paragrafo><enfatizzato>Lui</enfatizzato> aveva qualche dubbio
riguardo a tale atto<enfatizzato>Lui</enfatizzato>
si impegno al massimo comunque</paragrafo>
</sezione>
...
</document>
Questo è un foglio di stile XSLT di tipo push:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/HTML4/">
<xsl:template match="/">
<HTML>
<BODY>
<H1><xsl:value-of select="document/titolo"/></H1>
<xsl:apply-templates select="document/sezione"/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="sezione">
<HR/>
<H2><xsl:value-of select="title"/></H2>
<xsl:apply-templates select="paragrafo"/>
</xsl:template>
<xsl:template match="paragrafo"><P>
<xsl:apply-templates /></P>
</xsl:template>
<xsl:template match="paragrafo"><I>
<xsl:apply-templates /></I>
</xsl:template>
</xsl:stylesheet>
I Templates
Il testo di sopra non assomiglia ad un documento HTML, ma difatti rappresenta una serie di istruzioni di riscrittura separate:
- xsl:template è la regola da applicare se l'elemento in esame corrisponde al valore dell'attributo match. Di volta in volta applicherò il template della radice ("/"), dell'elemento "sezione", dell'elemento "paragrafo", dell'elemento "enfatizzato", ecc.
- xsl:apply-templates spinge a cercare, all'interno dell'elemento che stiamo considerando, se esistono altri template applicabili.E' il modo per far ripartire ricorsivamente la ricerca di altri template.
L'applicazione del template può creare dei frammenti di albero di destinazione e può anche inserire altri nodi nella lista di nodi correnti,poi il ciclo si ripete fino ad esaurimento della lista di nodi correnti. L'elemento xsl:template è un modello che definisce delle regole che vengono applicate al nodo specificato nell'attributo match del documento sorgente XML. L'utilizzo del carattere / indica al processore di applicare queste regole all'elemento radice dell'XML.
All'interno dell'elemento xsl:template per prima cosa mettiamo i TAG <html> e all'interno di questi utilizziamo l'elemento xsl:apply-templates per richiamare gli altri modelli che saranno applicati agli elementi figli.
Ad esempio, avendo un documento contenente la collezione di CD con autori (identificati dal nome) e titoli dei CD, possiamo applicare una trasformazione in base alla regola, descritta dal seguente documento XSLT:
<!-- Prologo XML -->
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- Applica il template al nodo radice indicato dal carattere -->
<xsl:template match="/">
<html>
<!-- Richiama e applica gli altri templates -->
<xsl:apply-templates>
</xsl:apply-templates>
</html>
</xsl:template>
<!-- Quando c'è nodo artista applica questa regola -->
<xsl:template match="artista">
<xsl:value-of select="nome">
</xsl:value-of>
<br></br>
</xsl:template>
</xsl:stylesheet>
Il risultato della trasformazione è visualizzare i nomi dei cantanti su ogni riga, cioè:
<html>
Pippo Pluto
Paperina Pericoli
Jack Lemmond
Frank Energy
</html>
Quando un Template non corrisponde a nessun elemento dell'XML questo semplicemente non viene applicato, non crea quindi nessun errore, il codice XSLT dell'esempio può essere ridotto se tutti gli elementi vuoti vengono scritti in questo modo <elemento/> (per esempio <xsl:apply-templates></xsl:apply-templates> può essere scritto così <xsl:apply-templates/> lo stesso vale per <br></br> che possiamo scrivere così <br/>).







