Extensible Stylesheet Language Transformations (XSLT) è un linguaggio XML-based utilizzato per elaborare e trasformare un normale documento XML in nuovo XML oppure in un documento di un altro tipo, come, ad esempio, HTML. L'
XSLT è ormai molto diffuso ed è da tempo uno standard web del
W3C.
Come è possibile leggere dal sito ufficiale del
W3C, l’
XSLT è parte di un progetto più grande che si chiama XSL(Extensible Stylesheet Language) che è una "famiglia" di raccomandazioni per definire le trasformazioni e le presentazioni dei documenti XML.
L'
XSL è composto da :
1. XSLT che è un linguaggio per trasformare un documento XML.
2. XPath (XML Path Language) che è un linguaggio utilizzato da XSLT per accedere e navigare il documento XML.
3. XSL-FO (XSL Formatting Objects) che è un vocabolario XML per specificare la semantica delle trasformazioni.
Per generare una trasformazione
XSLT occorrono due file:
1. un documento XML da trasformare
2. un documento che contiene il foglio di stile XSL.
Quest'ultimo è un insieme di regole di trasformazione da applicare ai nodi del documento XML iniziale. Entrambi questi due file vengono dati in pasto ad un processore
XSLT che ha il compito di individuare i nodi del documento XML ed applicare ad essi le relative regole contenute nel foglio di stile XSL. L’output sarà un nuovo documento che, in base alle regole applicate, potrà essere, ad esempio, un nuovo XML, un nuovo HTML, un nuovo XHTML, un nuovo WML o un nuovo RTF.
Dopo la teoria passiamo alla pratica.
Nel nostro esempio abbiamo un file XML (
cd_catalog.xml) con la seguente struttura :
<CATALOG>
<CD>
<TITLE></TITLE>
<ARTIST></ARTIST>
<COUNTRY></COUNTRY>
<COMPANY></COMPANY>
<PRICE></PRICE>
<YEAR></YEAR>
</CD>
</CATALOG>
Vogliamo creare un documento HTML con una tabella contenente solo i dati relativi a
Title, Artist e Price e i le righe devono essere ordinate alfabeticamente secondo l’artista.
A questo punto non ci resta che creare il nostro foglio di stile (
cd_catalog_style.xslt) che sarà così costituito :
<?xml version='1.0' encoding='iso-8859-1'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="iso-8859-1"/>
<xsl:template match="/">
<html>
<body>
<h1 align="center">XML2HTML</h1>
<h2 align="center">CATALOGO CD</h2>
<p align="center">
<table width="100%" border="1">
<thead>
<tr align="center">
<th>Window</th>
<th>Date</th>
<th>Time</th>
</tr>
</thead>
<tbody>
<xsl:for-each select="CATALOG/CD">
<xsl:sort select="ARTIST"/>
<tr>
<td width="33%">
<xsl:value-of select="TITLE"/>
</td>
<td width="33%">
<xsl:value-of select="ARTIST"/>
</td>
<td width="33%">
<xsl:value-of select="PRICE"/>
</td>
</tr>
</xsl:for-each>
</tbody>
</table>
</p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Noterete subito che il foglio di stile è a sua volta un file XML. Il nodo più importante è sicuramente l’elemento template che contiente le regole da applicare all’elemento indicato da match. Con
'/' indichiamo l’elemento root del documento XML.
Subito dopo incontriamo normali elementi HTML finchè non si arriva all’interno del corpo della tabella dove incontriamo il blocco di nostro interesse :
<xsl:for-each select="CATALOG/CD">
<xsl:sort select="ARTIST"/>
<tr>
<td width="33%">
<xsl:value-of select="TITLE"/>
</td>
<td width="33%">
<xsl:value-of select="ARTIST"/>
</td>
<td width="33%">
<xsl:value-of select="PRICE"/>
</td>
</tr>
</xsl:for-each>
Basta dare uno sguardo per capire il significato di ogni singola riga
XSLT (regola di trasformazione) :
• la prima introcude un ciclo for-each, relativo a tutti i nodi CD figli del nodo radice CATALOG
• la seconda imposta il criterio di ordinamento secondo il valore dell’elemento ARTIST
• successivamente viene creata la riga della tabella e i valori delle colonne sono, nell’ordine, i valori degli elementi TITLE, ARTIST e PRICE
Da notare quanto sia semplice utilizzare
XSLT e come nelle regole si faccia uso di
XPath (es. select="TITLE" ) per indicare i nodi e gli elementi da trasformare.
Utilizzando C#, vediamo ora il codice necessario per applicare la trasformazione voluta usando il processore
XSLT fornito dal Framework 2.0.
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;
public void CreateHTML()
{
try
{
XPathDocument myXPathDocument = new XPathDocument("cd_catalog.xml");
XslCompiledTransform myXslTransform = new XslCompiledTransform();
XmlTextWriter writer = new XmlTextWriter("cd_catalog.html", null);
myXslTransform.Load("cd_catalog_style.xslt");
myXslTransform.Transform(myXPathDocument, null, writer);
writer.Close();
System.Diagnostics.Process.Start("cd_catalog.html");
}
catch (Exception ex)
{System.Windows.Forms.MessageBox.Show(ex.Message);}
}
Prima di tutto bisogna importare i namespaces
System.Xml , System.Xml.XPath e System.Xml.Xsl.
Creiamo un oggetto
XPathDocument, che fornisce una rappresentazione in memoria e in sola lettura di un documento
XML tramite il modello di dati
XPath, e gli passiamo il nostro documento XML.
Istanziamo un oggetto
XslCompiledTransform che trasforma i dati XML utilizzando un foglio di stile XSLT, successivamente istanziamo un oggetto
XmlTextWriter che rappresenta uno stream che fornisce un modo veloce di generare flussi o file che contengono dati XML e gli passiamo come argomento il file finale che conterrà l’HTML e null perchè vogliamo la codifica dei caratteri di default.
Con il metodo
Load di
XslCompiledTransform carichiamo il foglio di stile da utilizzare e con il metodo
Transform applichiamo la trasformazione scrivendo il risultato sullo
StreamWriter.
A questo punto potremo vedere il risultato della trasformazione.
Con
XSLT è possibile effettuare trasformazioni molto più complicate di quelle viste in questo articolo, trovate una guida completa per
XSLT qui