Le Journal de Nikrou - PerlCe journal n'est pas un blog!2024-01-09T15:52:56+01:00urn:md5:501048fab0be4d1978e39dded54e4f42DotclearFaire des transformations xslt avec perlurn:md5:8088331f4f6d2c78b43d14f87d76e12b2008-02-19T11:51:00+01:002008-02-19T11:55:28+01:00NicolasPerlperlxmlxsl<p>Pour mettre en forme un document <acronym title="Extensible Markup Language">XML</acronym> et le présenter sur le web en tant que document html, le plus simple à mon sens est d'utiliser <acronym title="Extensible Stylesheet Language Transformations">XSLT</acronym>.</p>
<p>Il faut ensuite faire appel à un moteur XSL pour faire les transformations. Ma préférence va à la <a hreflang="en" href="http://xmlsoft.org/XSLT/">Libxslt</a> qui est une implémentation en <a href="http://fr.wikipedia.org/wiki/C_%28langage%29">C</a> de <acronym>XSLT</acronym> 1.0. J'utilise ensuite une interface en <a hreflang="en" href="http://www.perl.com/">perl</a> de la librairie Lixslt à travers le module <a hreflang="en" href="http://search.cpan.org/dist/XML-LibXSLT/LibXSLT.pm">XML::LibXSLT</a>.</p> <p>Imaginons le fichier <acronym>XML</acronym> suivant:</p>
<pre><?xml version="1.0" encoding="iso-8859-1"?><br /><articles><br /> <article><br /> <titre>Faire des transformations XSLT en perl.</titre><br /> <entete>perl est le couteau suisse du programmeur. On peut tout faire avec. Cet article va vous présenter le module XML::LibXSLT</entete><br /> <date>2007-12-26T17:56:17+00:00</date><br /> </article><br /> <article><br /> <titre>PHP6, c'est pour bientôt.</titre><br /> <entete>Alors que la version 5 de php n'est pas encore définitivement adopté par la communauté, la version 6 pointe le bout de son nez!</entete><br /> <date>2008-01-09T07:20:26+00:00</date><br /> </article><br /> <article><br /> <titre>Des exceptions en perl</titre><br /> <entete>Comment gérer les exceptions en perl ?</entete><br /> <date>2008-02-13T16:01:03+00:00</date><br /> </article><br /></articles></pre>
<p>En utilisant la feuille de style xslt suivante:</p>
<pre><?xml version="1.0" encoding="utf-8"?><br /><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><br /> <xsl:output method="html" version="1.0" indent="yes" encoding="utf-8" omit-xml-declaration="no"/><br /> <br /> <xsl:template match="/articles"><br /> <h1>Les derniers articles publiés</h1><br /> <xsl:apply-templates select="article"/><br /> </xsl:template><br /><br /> <xsl:template match="article"><br /> <div class="article"><br /> <h2><xsl:value-of select="titre"/></h2><br /> <span class="date"><xsl:value-of select="date"/></span><br /> <p><xsl:value-of select="entete"></xsl:value-of></p><br /> </div><br /> </xsl:template><br /></xsl:stylesheet></pre>
<p>On souhaite obtenir le résultat suivant:</p>
<pre><h1>Les derniers articles publiés</h1><br /><div class="article"><br /> <h2>Faire des transformations XSLT en perl.</h2><br /> <span class="date">2007-12-26T17:56:17+00:00</span><br /> <p>perl est le couteau suisse du programmeur. <br /> On peut tout faire avec. Cet article va vous présenter le module XML::LibXSLT</p><br /></div><br /><div class="article"><br /> <h2>PHP6, c'est pour bientôt.</h2><br /> <span class="date">2008-01-09T07:20:26+00:00</span><br /> <p>Alors que la version 5 de php n'est pas encore définitivement adoptée<br /> par la communauté, la version 6 pointe le bout de son nez!</p><br /></div><br /><div class="article"><br /> <h2>Des exceptions en perl</h2><br /> <span class="date">2008-02-13T16:01:03+00:00</span><br /> <p>Comment gérer les exceptions en perl ?</p><br /></div></pre>
<p>Le code qui permet de faire cela n'est pas bien complexe:</p>
<pre>#!/usr/bin/perl -w<br /><br />use warnings;<br />use strict;<br />use XML::LibXML;<br />use XML::LibXSLT;<br /><br />my $parser = XML::LibXML->new();<br />my $xslt = XML::LibXSLT->new();<br />$xslt->max_depth(2000);<br />my $source = $parser->parse_file('source.xml');<br />my $style_doc = $parser->parse_file('source.xsl');<br />my $stylesheet = $xslt->parse_stylesheet($style_doc);<br />my $result = $stylesheet->transform($source);<br />print $stylesheet->output_string($result);</pre>
<p>Rien de bien compliqué, en fait.</p>
<p>Note:<br />Si quelqu'un connait un moyen simple de colorer le code, je suis ouvert à toutes propositions. Merci d'avance.</p>Bien utiliser MakeMakerurn:md5:13c48f6e9d7fb5580c60223fa39ec4ab2006-09-10T15:32:00+00:002013-08-29T12:49:23+00:00NicolasPerl<p>La création de modules <a href="http://www.perl.org/" hreflang="en">perl</a> est grandement facilitée par l'utilisation de <a href="http://www.perl.com/doc/manual/html/utils/h2xs.html" hreflang="en">h2xs</a>. Leur installation est aussi simplifiée par l'utilisation de <a href="http://search.cpan.org/~mschwern/ExtUtils-MakeMaker-6.30/lib/ExtUtils/MakeMaker.pm" hreflang="en">MakeMaker</a>... encore faut-il l'utiliser correctement!</p> <p>J'ai récemment créer un module perl. Je lui ai adjoint deux scripts qui utilisent ce module. Ils font partie intérgrante du module. Je désire les installer dans un endroit particulier, par exemple <strong>/usr/loca/scripts/</strong>. Pour cela rien de plus simple je modifie le script <strong>Makefile.PL</strong>. Supposons que je continue <a href="https://www.nikrou.net/post/2005/10/10/62-a-la-decouverte-de-cpan" hreflang="fr">mon pseudo module XML::Tools</a>. Je lui ajoutes un script <strong>transform.pl</strong> que je veux installer en même temps que le module.</p>
<p>Les variables de <strong>Makefile.PL</strong> à utiliser sont <strong> EXE_FILES</strong> et <strong>INSTALLSCRIPT</strong> qui contiennent respectivement les fichiers (scripts) à installer et le répertoire d'installation. J'ai donc modifié le script <strong>Makefile.PL</strong> ainsi:</p>
<pre>use 5.004;
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
NAME => 'XML::Tools',
VERSION_FROM => 'lib/XML/Tools.pm', # finds $VERSION
PREREQ_PM => {}, # e.g., Module::Name => 1.1
($] >= 5.005 ? ## Add these new keywords supported since 5.005
(ABSTRACT_FROM => 'lib/XML/Tools.pm', # retrieve abstract from module
AUTHOR => 'Nicolas >nikrou77@gmail.com<') : ()),
EXE_FILES => [qw!transform.pl!],
INSTALLSCRIPT => "/usr/local/scripts/",
);
</pre>
<p>Cela semble pas mal mais en y regardant de plus près et surtout en testant, le script n'est pas installé dans <strong>/usr/loca/scripts/</strong>. En fait la solution est dans la documentation qu'il aurait fallu que je lise avant de m'arracher le peu de cheveux qu'ils me restent! Il faut ajouter le paramètre <strong>INSTALLDIRS</strong> dans le <strong>Makefile.PL</strong> et le positionner à <strong>perl</strong> car il est par défaut à <strong>site</strong> ce qui provoque l'installation des scripts au même endroit que le module. Le script <strong>Makefile.PL</strong> modifié ressemble à ça:</p>
<pre>use 5.004;
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
NAME => 'XML::Tools',
VERSION_FROM => 'lib/XML/Tools.pm', # finds $VERSION
PREREQ_PM => {}, # e.g., Module::Name => 1.1
($] >= 5.005 ? ## Add these new keywords supported since 5.005
(ABSTRACT_FROM => 'lib/XML/Tools.pm', # retrieve abstract from module
AUTHOR => 'Nicolas >nikrou77@gmail.com<') : ()),
EXE_FILES => [qw!transform.pl!],
INSTALLSCRIPT => "/usr/local/scripts/",
INSTALLDIRS => "perl"
);
</pre>A la découverte de CPANurn:md5:7046dc67dc7bff87d0bd9190466710d52005-10-10T09:59:33+00:002005-10-22T09:37:18+00:00NicolasPerl <p><acronym title="Comprehensive Perl Archive Network" lang="en">CPAN</acronym> est une incontournable source de modules lorsqu'on utilise <a href="http://www.perl.org/" hreflang="en">Perl</a>. L'écriture d'un module peut sembler compliqué au premier abord mais ce n'est pas si complexe que cela!</p>
<p>L'utilisation de <a href="http://www.perl.com/doc/manual/html/utils/h2xs.html" hreflang="en">h2xs</a> en facilite grandement l'écriture! Au départ, cet outil sert à créer un module Perl à partir des fichiers d'entête en C. Mais on peut tout à fait s'en servir pour batîr l'architecture d'un module. Imaginons que l'on veuille écrire un module faisant des transformations <acronym title="Extensible Stylesheet Language" lang="en">XSL</acronym>. On peut utiliser la commande suivante pour créer le module que nous appelerons XML::Tools:</p>
<code>h2xs -b 5.4.0 -AXn XML::Tools</code>
<p>Cela crée une arborescence de ce type:</p>
<pre>
lib
XML
Tools.pm
Makefile.PL
Changes
README
MANIFIEST
t
XML-Tools.t
</pre>
<p><em>lib/Tools.pm</em> est le module en question; <em>Makefile.PL</em> est le fichier servant à gérer les tests, l'installation, l'export,...; MANIFEST contient l'ensemble des fichiers nécessaires à l'installation du module (fichiers de tests y compris); Changes contient les modifications entre les différentes versions, et le répertoire <em>t</em> contient l'ensemble des fichiers de tests.</p>
<p>Vous pouvez voir <a href="https://www.nikrou.net/perl/XML-Tools/">l'arborescence du module</a> une fois crée. Ce module est en version0.0.1 et peut donc être largement améliorer et n'a de toute façon rien d'original!</p>