Per comprendere come funziona l'attributo match utilizziamo un nuovo documento XSLT da applicare sempre all'XML dell'esempio 1.
Esempio 3
Documento XSLT (listacd_es3.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>
<body>
<xsl:apply-templates select="//artista"/>
</body>
</html>
</xsl:template>
<xsl:template match="//artista">
<!-- elemento artista indipendentemente dalla sua profondità -->
<xsl:apply-templates select="nome"/>
<ul>
<xsl:apply-templates select="albums/album"/>
</ul>
</xsl:template>
<xsl:template match="albums/album">
<!-- elemento album figlio di albums -->
<li><strong>Album:</strong> <xsl:value-of select="."/></li>
</xsl:template>
<xsl:template match="nome">
<!-- elemento nome -->
<strong>Nome artista: </strong> <xsl:value-of select="text()"/>
<br />
</xsl:template>
</xsl:stylesheet>
Come notiamo l'attributo match contiene il percorso dei nodi che deve prendere in esame. Possiamo quindi utilizzare il carattere /
per indicare che un nodo è figlio di un altro nodo, oppure utilizzare il carattere *
per indicare che è nipote.
Un modo però molto sbrigativo è quello di utilizzare ad esempio albums//titolo
per indicare di cercare il nodo <titolo>
indifferentemente dalla sua profondità rispetto al nodo <albums>
.
Se osservate l'XSLT abbiamo utilizzato //artista
anzichè utilizzare listacd/artista
. Questo è un modo molto più flessibile di scrivere il codice XSLT che, nel caso vengano fatte delle modifiche alla struttura dell'albero XML, ci permette magari di evitare future modifiche nel codice del documento stesso.
Un'altra considerazione che possiamo fare osservando l'esempio 3 è l'utilizzo dell'attributo select nell'elemento xsl:apply-templates
. Questo è molto importante perché ci permette di specificare in che ordine applicare i vari modelli ai vari nodi dell'XML.
Possiamo osservare che la dichiarazione del modello relativo al nodo <nome>
risulta essere scritta dopo quella relativa al nodo <albums><album>
ma in fase di esecuzione del programma viene prima richiamato il modello che corrisponde al nodo <nome>
.
Possiamo anche osservare che stiamo iniziando ad inserire nel codice parti di codice HTML che verrano inseriti nell'output senza essere interpretati dal processore non essendo elementi XSLT.
Risultato in Output della trasformazione (esempio 3)
<html>
<body>
<strong>Nome artista: </strong>Stanley Jordan<br />
<ul>
<li><strong>Album:</strong> Magic Touch 1985 Blue Note</li>
<li><strong>Album:</strong> Stolen Moments 1991 Blue Note</li>
</ul>
<strong>Nome artista: </strong>Nick Drake<br />
<ul>
<li><strong>Album:</strong> Pink Moon 1972 Island</li>
<li><strong>Album:</strong> Bryter Layter 1970 Island</li>
<li><strong>Album:</strong> Five leaves left 1970 Island</li>
</ul>
<strong>Nome artista: </strong>Jeff Buckley<br>
<ul>
<li><strong>Album:</strong> Grace 1994 Columbia</li>
<li><strong>Album:</strong> Mistery white boy 2000 Columbia</li>
</ul>
<strong>Nome artista: </strong>Joe Satriani<br>
<ul>
<li><strong>Album:</strong> Surfing with the alien 1987 Epic</li>
<li><strong>Album:</strong> Not of this earth 1988 Relativity</li>
</ul>
</body>
</html>
- Clicca qui per vedere il risultato della trasformazione sul browser.
- Clicca qui per vedere l'XSLT sul browser.
Molto importante nelle trasformazioni che dovranno dare in output codice HTML è l'utilizzo di <xsl:template match="/">
che in un certo senso sostituisce all'intero sorgente XML il nuovo codice che si andrà a generare con la trasformazione.
Se quindi ci dovesse capitare di non avere in output un codice HTML corretto sarà bene verificare che questo elemento esista nel nostro codice XSLT.