Esempio con XML e XSLT

Oggi in azienda mi è stato chiesto di fare una breve lista di software libero che puo’ essere interessante da usare per testing, bug tracking; cosi ho preso a scrivere l’elenco in xml per transformalo in una tabella HTML:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="open_source_tools.xslt"?>
<tools>
 <tool>
 <name>Hudson</name>
 <url>http://hudson-ci.org/</url>
 <description>Hudson is a scalable continuous integration server, it allows to do automatic building, document generation, perform unit tests and support for several language, Java in particular</description>
 <license>MIT license</license>
 <requirements>JDK, an Application Server is optional but recommended</requirements>
 <documentation>http://wiki.hudson-ci.org/display/HUDSON/Use+Hudson</documentation>
 <latestversion>1.340, 11 January 2010</latestversion>
 </tool>
 <tool>
 <name>Junit</name>
 <url>http://www.junit.org/</url>
 <description>Junit allows to perform unit test on the java source code</description>
 <license>Common Public License 1.0</license>
 <requirements>JDK</requirements>
 <documentation>http://junit.sourceforge.net/</documentation>
 <latestversion>4.8.1, 8 December 2009</latestversion>
 </tool>
 <tool>
 <name>Jmeter</name>
 <url>http://jakarta.apache.org/jmeter/</url>
 <description>Java desktop application designed to load test functional behavior and measure performance</description>
 <license>Apache License 2.0</license>
 <requirements>JVM 1.4+</requirements>
 <documentation>http://jakarta.apache.org/jmeter/usermanual/index.html</documentation>
 <latestversion>2.3.4, 17 June 2009</latestversion>
 </tool>
 <tool>
 <name>soapUI</name>
 <url>http://www.soapui.org/</url>
 <description>Tool for Web Service Testing</description>
 <license>GNU Library or Lesser General Public License (LGPL)</license>
 <requirements>JVM</requirements>
 <documentation>http://www.soapui.org/userguide/index.html</documentation>
 <latestversion>3.5, 15 January 2010</latestversion>
 </tool>
 <tool>
 <name>Selenium</name>
 <url>http://seleniumhq.org/</url>
 <description>Selenium allows to do automatic User Interface test</description>
 <license>Apache License 2.0</license>
 <requirements>IDE Based on Firefox, RC based on Java</requirements>
 <documentation>http://seleniumhq.org/docs/</documentation>
 <latestversion>1.0.2, 30 June 30 2009 </latestversion>
 </tool>
 <tool>
 <name>Sonar</name>
 <url>http://sonar.codehaus.org/</url>
 <description>Sonar allows to evaluate the quality of the source code using a combination of tools like PMD, Checkstile and Findbugs</description>
 <license>GNU General Public License</license>
 <requirements>JDK, Maven, Database (Derby/MySQL/Oracle/PostgreSQL)</requirements>
 <documentation>http://sonar.codehaus.org/documentation/</documentation>
 <latestversion>1.12, 7 December 2009</latestversion>
 </tool>
 <tool>
 <name>Bugzilla</name>
 <url>http://www.bugzilla.org/</url>
 <description>Bug tracking tool</description>
 <license>Mozilla Public License</license>
 <requirements>Web server (Apache), Perl, Database (MySQL/PostgreSQL)</requirements>
 <documentation>http://www.bugzilla.org/docs/</documentation>
 <latestversion>3.4.4, 18 November 2009</latestversion>
 </tool>
 <tool>
 <name>Redmine</name>
 <url>http://www.redmine.org/</url>
 <description>Bug tracking tool</description>
 <license>GNU General Public License</license>
 <requirements>Ruby, Database (MySQL/PostgresSQL, SQLite)</requirements>
 <documentation>http://www.redmine.org/wiki/redmine/Guide</documentation>
 <latestversion>0.8.7 15 November 2009</latestversion>
 </tool>
</tools>

Come potete vedere il file xml contiene alla radice il nodo tools con dentro i singoli nodi tool ognuno con suoi sotto nodi. E’ un semplice file XML con incluso il file xslt nella prima riga.

Vediamo ora il file XSLT:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="UTF-8"/>
<xsl:template match="/">
<html>
<head><title>Open Source Tools</title>
</head>
<body>
<table width="100%" border="1">
 <thead>
 <tr>
 <td width="5%"><b>Name</b></td>
 <td width="15%"><b>URL</b></td>
 <td width="35%"><b>Description</b></td>
 <td width="15%"><b>License</b></td>
 <td width="10%"><b>Requirements</b></td>
 <td width="10%"><b>Documentation</b></td>
 <td width="10%"><b>Latest Version</b></td>
 </tr>
 </thead>
 <tbody>
 <xsl:for-each select="tools/tool">
 <xsl:sort select="name"/>
 <tr>
 <xsl:if test="(position() mod 2 = 1)">
 <xsl:attribute name="bgcolor">#EEEEFF</xsl:attribute>
 </xsl:if>
 <td width="5%">
 <xsl:value-of select="name" />
 </td>
 <td width="15%">
 <a href="{url}">
 <xsl:value-of select="url"/>
 </a>
 </td>
 <td width="35%">
 <xsl:value-of select="description" />
 </td>
 <td width="15%">
 <xsl:value-of select="license" />
 </td>
 <td width="10%">
 <xsl:value-of select="requirements" />
 </td>
 <td width="10%">
 <a href="{documentation}">
 <xsl:value-of select="documentation" />
 </a>
 </td>
 <td width="10%">
 <xsl:value-of select="latestversion" />
 </td>
 </tr>
 </xsl:for-each>
 </tbody>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

Come notiamo che:

  • alla riga 02 diciamo che vogliamo generare un output html con codifica UTF-8
  • alla riga 03 usiamo il tag template che punta alla radice del file XML di origine (carattere /)
  • dalla riga 04 alla 20 inseriamo il codice per una tabella HTML dove indichiamo da mettere tutti sottocampi dei nodi tool uno per ogni colonna
  • alla riga 21 usiamo il tag for-each dicendo di selezionare tutti nodi tool sotto il nodo originale tools.
  • alla riga 22 usiamo il tag sort diciamo di ordinare i nodi tool per i loro sottonodi name
  • alla riga 23 iniziamo a scrivere la riga che dovrà comparire e dovremo estrarre i vari campi uno per ogni cella
  • alla riga 24-25 inserisco una condizione che mi permette di aggiungere il colore alle righe dispari (position() mod 2 = 1), il metodo position() parte da 1; dunque se le condizione if è soddisfatta aggiungiamo, con la riga 25, l’attributo bgcolor alla riga tramite il tag attribute
  • ora per ogni cella td dalla riga 27 alla riga 51 estraiamo il ogni singolo sottonodo attraverso il tag value-of
  • Siccome vorrei creare un link al sito ufficiale per ogni software trasformo il testo nel sottonodo url in un hyperlink (html tag a) usando le parentesi graffe per indicare tramite XPATH il sottonodo (url per esempio) ed inserisco il valore dello stesso sottonodo usando il tag value-of .

Aprite il file xml con il vostro browser. A voi un po di divertimento nel provare.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s