Per tutti gli esempi che abbiamo fatto fino a questo punto delle nostra guida abbiamo utilizzato la programmazione cosidetta template matching ovvero che fa uso dei Templates o modelli. Esistono però anche altri due modi di programmare con l'XSLT: l'iterazione e l'altro attraverso la ricorsione. La ricorsione viene utilizzata solo in particolari situazioni nelle quali un determinato modello richiama se stesso per effettuare delle operazioni un certo numero di volte.
L'iterazione invece è un metodo assai più importante e molto utilizzato, anzi forse il più utilizzato. Possiamo dire che tutti gli esempi che abbiamo fatto potevano essere proposti utilizzando l'iterazione ottenendo in output lo stesso codice HTML. La differenza tra l'iterazione e l'utilizzo dei modelli sta proprio nel modo con la quale il processore esegue le istruzioni che permettono di prendere i dati dall'albero XML.
Per chi ha già esperienze nel campo della programmazione l'iterazione viene subito associata all'utilizzo dei cicli for.
In effetti anche nell'XSLT si usa un elemento che altro non è che un ciclo che permette di applicare determinate regole a gruppi di nodi.
L'elemento in questione è <xsl:for-each
select="">. L'attributo select permette di specificare gli elementi che devono essere processati.
Scrivere quindi
<xsl:for-each select="albums/album">
<!-- Regole da applicare -->
</xsl:for-each>
vuol dire sostanzialmente "per ogni elemento <album> figlio
dell'elemento <albums> applica queste regole".
Un esempio ci chiarirà meglio le idee. Utilizzando lo stesso XML dell'esempio 10 (ovvero l'esempio precedente) vediamo ora come ottenere un output molto simile a quello ottenuto nell'esempio 3 dove abbiamo però utilizzato i modelli.
Esempio 11
Codice XSLT utilizzato (listacd_es11.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>
<xsl:for-each select="//artista">
<b>Artista : </b>
<xsl:value-of select="@nome"/>
<br/>
<xsl:for-each select="albums/album">
<xsl:text>amp;#160; </xsl:text>
<b>- Album: </b>
<xsl:value-of select="titolo"/>
-
<xsl:value-of select="anno"/>
-
<xsl:value-of select="etichetta"/>
<br/>
</xsl:for-each>
<br/>
</xsl:for-each>br/>
</html>
</xsl:template>
</xsl:stylesheet>
Risultato in Output della trasformazione
(esempio 11).
<html>
<b>Artista : </b>Stanley Jordan<br>
<b>- Album: </b>Magic Touch - 1985 - Blue Note<br>
<b>- Album: </b>Stolen Moments - 1991- Blue Note<br>
<br>
<b>Artista : </b>Nick Drake<br>
<b>- Album: </b>Pink Moon - 1972
- Island<br>
<b>- Album: </b>Bryter Layter - 1970
- Island<br>
<b>- Album: </b>Five leaves left - 1970 - Island<br>
<br>
<b>Artista : </b>Jeff Buckley<br>
<b>- Album: </b>Grace - 1994 - Columbia<br>
<b>- Album: </b>Mistery white boy - 2000 - Columbia<br><br>
<b>Artista : </b>Joe Satriani<br>
<b>- Album: </b>Surfing with the alien
- 1987 - Epic<br>
<b>- Album: </b>Not of this earth
- 1988 - Relativity<br>
<br></html>
Clicca
qui per vedere il risultato della trasformazione sul browser.
Clicca qui per vedere l'XSLT sul browser.
Come avrete potuto notare è molto semplice utilizzare l'iterazione con
xsl:for-each. Nel nostro esempio abbiamo utilizzato due cicli: il primo per
entrare dentro ogni nodo <artista> e il secondo, che è annidato dentro il
primo, per entrare dentro ogni elemento <album> che è figlio
dell'elemento <albums>.