Circum Blog

Circum Net – IT – Conseils pratiques

Passage en majuscules/minuscules

XSLT

En XSLT 1.0, il n’est pas possible de faire directement appel à une fonction du style uppercase() ou lowercase() pour assurer le passage en majuscules (ou minuscules) d’une chaîne de caractères. Il faut se trourner vers l’instruction translate().

Exemple en XSLT 1.0 :

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0">

<xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

<xsl:template match="/">
  <xsl:value-of select="translate(title, $lowercase, $uppercase)" />
  <xsl:value-of select="translate(reference, $uppercase, $lowercase)" />
</xsl:template>

</xsl:stylesheet>

En XSLT 2.0 par contre, on dispose des fonctions “upper-case” et “lower-case”. Ce qui facilite la tâche.

Exemple en XSLT 2.0:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0">

<xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

<xsl:template match="/">
  <xsl:value-of select="upper-case(title)" />
  <xsl:value-of select="lower-case(reference)" />
</xsl:template>

</xsl:stylesheet>


Transformation XSLT avec Java

Java, Programmation, XML, XSLT

Pour obtenir une transformation d’un document XML par une feuille XSL on peut invoquer un “transformeur” (javax.xml.transform.Transformer) à partir d’une fabrique de transformeurs (javax.xml.transform.TransformerFactory).

Ce transformeur va prendre en charge la transformation de la source XML via sa méthode “transform”. Par défaut, si aucune feuille XSL n’est passée en argument, le transformeur va se contenter de copier la source dans le résultat.

Voyons à présent comment tout cela est mis en oeuvre concrètement.

Tout d’abord, prenons connaissance du document XML source qui va faire l’objet de la transformation:

Fichier source XML : members.xml

<?xml version=”1.0″ encoding=”iso-8859-1″?>
<members date=”2008/07/09″ context=”dbaccess”>
  <member privilege=”admin”>
    <name>John Reese</name>
    <id>3674</id>
    <login>jreese</login>
  </member>
  <member privilege=”collaborator”>
    <name>Robin Wright</name>
    <id>36555</id>
    <login>rwright</login>
  </member>
  <member privilege=”guest”>
    <name>Peter Crows</name>
    <id>333676</id>
    <login>pcrows</login>
  </member>
</members>

Ensuite, considérons la feuille de styles XSL qui est aux commandes de la transformation :

Fichier source XSL : members.xsl

<?xml version=”1.0″?>
<xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” version=”1.0″>
<xsl:template match=”/”>
  <html>
  <head><title>Members List</title></head>
  <body>
  <table border=”1″>
  <tr>
  <th>id</th>
  <th>name</th>
  </tr>
  <xsl:for-each select=”members/member”>
    <tr>
    <td><xsl:value-of select=”id”/></td>
    <td><xsl:value-of select=”name”/></td>
    </tr>
  </xsl:for-each>
  </table>
  </body></html>
</xsl:template>
</xsl:stylesheet>

Enfin, il nous faut écrire le code Java qui joue le rôle de chef d’orchestre et lance la transformation :

import java.io.*;

import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

/* Transformation XSL  */
public class XSLTransform
  {
  public static void main(String[] args) 
    {
    try 
      {
      // Chargement de la source XML
      StreamSource xmlSource = new StreamSource("members.xml");

      // Chargement de la feuille XSL
      StreamSource xsltSource = new StreamSource("members.xsl");

      // Préparation du fichier résultat
      FileOutputStream fResult = new FileOutputStream("members.html")
      StreamResult transResult = new StreamResult(fResult);
      
      TransformerFactory transFact = TransformerFactory.newInstance();
      
      Transformer trans = transFact.newTransformer(xsltSource);
      trans.transform(xmlSource, transResult);
      }
    catch (Exception e) 
      {
      e.printStackTrace( );
      }
    }
  }


Transformation XSLT avec Python sous MacOSX

MacOSX, Programmation, Python, XML, XSLT

Pour obtenir une transformation d’un document XML source via une feuille de style XSLT, nous aurons ici recours aux librairies libxml et libxslt. Celle-ci ont en effet été déclinées pour pouvoir travailler avec Python.

Prérequis :
– MacOSX 10.3 ou supérieur
– Python préinstallé ou MacPython

Première étape : installation de libxml

La bibliothèque libxml fournit aux programmes les fonctions permettant le décodage/parcours des fichiers au format XML. Après l’avoir téléchargée, on l’installe en lançant les commandes suivantes:

Version de la bibliothèque utilisée : 2.7.0

./configure –prefix=/usr/local/libxml2-2.7.0
make
sudo make install

Deuxième étape : installation de libxslt

La bibliothèque libxslt étend la bibliothèque libxml en lui ajoutant le support des feuilles de styles XSLT. Après l’avoir téléchargée, on l’installe en lançant les commandes suivantes:

Version de la bibliothèque utilisée : 1.1.24

./configure –prefix=/usr/local/libxslt-1.1.24 –with-libxml-prefix=/usr/local/libxml2-2.7.0
make
sudo make install

Troisième étape : liaison python/libxml/libxslt

Pour lier Python aux deux bibliothèques XML précédemment installées, on va utiliser des liens symboliques à partir du répertoire de gestion d’extensions de Python : site-packages. Ce répertoire est en effet destiné à recevoir les modules supplémentaires installés par l’utilisateur.

Version de Pyhton utilisée : 2.5

Il faut d’abord repérer le chemin d’accès du répertoire “site-packages”. Si vous utilisez le moteur Python préinstallé de MacOSX, vous le trouverez à l’endroit suivant :

/Library/Python/2.5/site-packages/

Si vous avez installé MacPython, vous le trouverez à l’endroit suivant :

/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages

Une fois repéré, vous vous placer dans le répertoire site-packages:

cd /Library/Python/2.5/site-packages/
 
ou
 
cd /Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/
site-packages

Puis vous créez les liens symboliques vers les bibliothèques libxml et libxslt:

sudo ln -s /usr/local/libxml2-2.7.0/lib/python2.5/site-packages/* .
 
et
 
sudo ln -s /usr/local/libxslt-1.1.24/lib/python2.5/site-packages/* .

Quatrième étape : tester une transformation XSLT

Pour boucler la procédure, il nous reste à tester un script Python exécutant une transformation d’un document XML via une feuille de style XSLT. En voici un exemple.

#!/usr/bin/python
import libxml2
import libxslt
 
xsltdoc = libxml2.parseFile("test.xsl")
style = libxslt.parseStylesheetDoc(xsltdoc)
xmldoc = libxml2.parseFile("test.xml")
result = style.applyStylesheet(xmldoc, None)
style.saveResultToFilename("dump.txt", result, 0)
style.freeStylesheet()
xmldoc.freeDoc()
result.freeDoc()


Lecture d’un flux RSS

PHP, Programmation, XML

Exploiter un flux RSS à partir d’un script PHP est une tâche relativement aisée du fait que depuis la version 5 du langage PHP on dispose de la librairie SimpleXML.

SimpleXML est un module standard de PHP qui permet la lecture d’un document XML, de ses éléments et de leurs attributs en utilisant les méthodes d’accès des tableaux et des objets.

Et puisque RSS s’appuie sur une structure XML basique, la liaison entre les deux se fait naturellement. En effet, avec le format RSS la description d’un site ou d’un contenu est réalisée via un set d’une dizaines de balises différentes (<channel>, <item>, <title>, <description> …).

Ossature d’un flux RSS

<rss version="2.0">
<channel>
    <title>...</title>
    <link>...</link>
    <description></description>
    <item>
        <title>...</title>
        <link>...</link>
        <description>...</description>
    </item>
    <item>
        <title>...</title>
        <link>...</link>
        <description>...</description>
    </item>
</channel>
</rss>

Du fait de cette simplicité, il n’est pas compliqué d’envisager de manipuler par programmation le contenu d’un flux RSS. Voyons concrètement ce qu’il en est.

Lecture d’un flux RSS avec SimpleXML

<?php
$root=simplexml_load_file("http://site.org/news.rss");
foreach($root->channel->item as $item)
    {
    echo "News:" . utf8_decode($item->title) . "<br/>";
    }
?>

Ce code donne pour résultat l’affichage des titres des éléments d’information du flux RSS http://www.site.org/news.rss

Explication “ligne par ligne”

Pour charger un document XML avec SimpleXML, il suffit de lancer la fonction ‘simplexml_load_file()’. Celle-ci prend comme argument le chemin d’accès du fichier XML et retourne un objet de la classe ‘simplexml_element’. Ce dernier représente l’élément racine du document XML pris en compte.

$root = simplexml_load_file(“http://www.site.org/news.rss”);

Lorsqu’il s’agit d’un document XML simple, pour accéder à un noeud à partir de la racine il suffit de l’appeler par son nom. Dans le cas qui nous occupe, on veut se placer au niveau des éléments “item”. La structure de contrôle ‘foreach’ permet de parcourir aisément tous les éléments ‘item’ du fichier RSS et d’en traiter les composants.

foreach($root->channel->item as $item)

Une fois dans la boucle, ile ne reste plus qu’à demander l’affichage du titre de l’item traité ($item->title). La fonction “utf8_decode” s’assurant de la bonne conversion des caractères accentués ou spéciaux.

echo “News : ” . utf8_decode($item->title) . “<br/>”;

Conversion des jeux de caractères

La plupart des modules de manipulation XML traitent les données qu’ils fournissent et qu’ils réceptionnent selon le codage international UTF-8. Si des caractères accentués ou spéciaux doivent être utilisés (codage ISO-8859-1), il faudra avoir recours aux fonctions PHP ‘utf8_encode’ et ‘utf8_decode’ pour que la conversion des chaînes de caractères se passe correctement.

– utf8_encode fait passer une chaîne d’iso-8859-1 à utf-8
– utf8_decode fait passer une chaîne de utf-8 à iso-8859-1