Il caso che abbiamo analizzato nell'esempio precedente mette in luce la possibilità di effettuare diverse operazioni in base al contesto in cui ci troviamo. Un altro modo per utilizzare i modelli è quello di specificarne il modo o modalità (in inglese 'mode').
Supponiamo di dover definire diversi modelli che processano gli stessi elementi per fornire un output diverso. Questo può essere molto utile nel caso volessimo ottenere diversi documenti in output a partire dallo stesso documento sorgente XML utilizzando un unico documento XSLT.
Un esempio servirà a rendere più chiaro il concetto, lavoriamo ancora sul sorgente XML dell'esempio 5.
Codice XSLT utilizzato (listacd_es7.xslt)
<?xml version="1.0" encoding="UTF-8"?> <!-- Prologo XML -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<u>Elenco di tutti gli artisti:</u><br/><br/>
<xsl:apply-templates mode="elencoartisti"/>
<hr/>
<u>Elenco di tutti gli albums:</u><br/>
<xsl:apply-templates mode="elencoalbums"/>
</html>
</xsl:template>
<xsl:template match="//artista" mode="elencoartisti">
<b>Artista : </b>
<xsl:call-template name="stampa"/>
<br/>
</xsl:template>
<xsl:template match="//albums//album" mode="elencoalbums">
<br/>
<b>- Titolo dell'album : </b>
<xsl:call-template name="stampa"/>
( artista: <xsl:value-of select="../../@nome"/> )
</xsl:template>
<xsl:template name="stampa">
<xsl:value-of select="@nome"/>
<xsl:value-of select="titolo"/>
</xsl:template>
</xsl:stylesheet>
Come avrete potuto notare ci sono delle affinità con il codice XSLT dell'esempio 6, tuttavia il risultato è decisamente molto diverso! Andiamolo a vedere.
Risultato in Output della trasformazione
(esempio 7).
<html>
<u>Elenco di tutti gli artisti:</u><br><br>
<b>Artista : </b>Stanley Jordan<br>
<b>Artista : </b>Nick Drake<br>
<b>Artista : </b>Jeff Buckley<br>
<b>Artista : </b>Joe Satriani<br>
<hr>
<u>Elenco di tutti gli albums:</u><br><br>
<b>- Titolo dell'album : </b>Magic Touch
( artista: Stanley Jordan )
<br><b>- Titolo dell'album : </b>Stolen Moments
( artista: Stanley Jordan )
<br><b>- Titolo dell'album : </b>Pink Moon
( artista: Nick Drake )
<br><b>- Titolo dell'album : </b>Bryter Layter
( artista: Nick Drake )
<br><b>- Titolo dell'album : </b>Five leaves left
( artista: Nick Drake )
<br><b>- Titolo dell'album : </b>Grace
( artista: Jeff Buckley )
<br><b>- Titolo dell'album : </b>Mistery white boy
( artista: Jeff Buckley )
<br><b>- Titolo dell'album : </b>Surfing with the alien
( artista: Joe Satriani )
<br><b>- Titolo dell'album : </b>Not of this earth
( artista: Joe Satriani )
</html>
Il risultato potrebbe apparire sorprendente!!!
Con così poche righe di codice siamo riusciti a creare un documento HTML
composto da due diversi output di dati estrapolati dal medesimo documento
sorgente XML.
Abbiamo sostanzialmente applicato prima il modello che crea una lista degli artisti e poi quello che crea una lista di tutti gli albums con a fianco tra le parentesi il nome dell'artista.
I modelli richiamati con il mode in questo nostro esempio processano nodi diversi ma possono anche processare lo stesso o gli stessi elementi, l'importante è che il valore specificato all'interno dell'attributo mode sia diverso.
Clicca
qui per vedere il risultato della trasformazione sul browser.