Générer un flux RSS à partir d’une liste de définition

Pour un site d’hébergement perso, nous souhaitons proposer des nouvelles sur son activité.

Au début une solution toute simple : une page d’accueil statique avec la dernière nouvelle du moment. Cela se complique lorsque d’autres nouvelles arrivent.
L’idée a donc été de faire une liste de définitions des nouvelles dans un fichier html.

     <dl id="20/01/05">
       <dt>Ouverture du site</dt>
       <dd class="date">20/01/05</dd>
       <dd class="description">Azerttyu.net ouvre enfin ses portes</dd>
     </dl>  

Le choix d’une liste sous cette forme semblait la plus opportune, pour s’en convaincre un article sur pompage.net.
Pour présenter la dernière nouvelle sur la page d’accueil l’utilisation de simplexml (php5) fait très bien l’affaire.

Dans les offres web 2.0, nous trouvons les flux rss. C’est un moyen simple pour diffuser et consulter des mises à jours régulières de site, tel que les blog (explication en images).

Le flux rss s’appuie sur une normalisation xml mais n’a aucun rapport avec les liste de définitions. 2 solutions font jour :

  • La première, faire un système complet de new en plus.
  • La seconde, formater sa liste de définitions en un format rss valide.

La seconde solution a été choisie, en raison du format xml aussi bien en entrée (liste de définitions) qu’en sortie (rss) et du xslt qui permet des transformations de format xml.

Du coté php, cela donne :

<?php
// Créé le processeur XSLT
$xh = xslt_create();
xslt_set_base ($xh, 'file://' . getcwd () . '/');

// Traite le document, puis affiche le résultat
$result = xslt_process($xh, '../news.htm', 'rss.xsl');
if (!$result)
  echo ("Erreur XSLT ...");
else
  header("Content-Type: application/rss+xml; charset=iso-8859-15");
  echo ($result);

// Détruit le processeur XSLT
xslt_free($xh);
?>

La ligne importante est xslt_process($xh, ’../news.htm’, ’rss.xsl’) ; où on cherche la liste de définitions (news.htm) et le fichier de transformation (rss.xsl).
le header est aussi important, cela permet au navigateur de comprendre que le fichier fournit est un flux rss.

Du coté rss.xsl, cela est un peu plus tendu. Pourtant en prenant le temps de regarder, sa lecture est assez aisée.

<?xml version="1.0" encoding="iso-8859-15" standalone="yes"?>
<xsl:stylesheet version="1.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:data='http://hebergement.azerttyu.net/menu/month.xml'
        exclude-result-prefixes="data"
        >
       
        <xsl:output
                method="xml"
                encoding="ISO-8859-15"
                version="1.0"
                indent="yes" />
               
        <xsl:template match="/div/div">
                <rss version="2.0">
                        <xsl:element name="channel">
                                <xsl:element name="title">Azerttyu.net - Nouvelles</xsl:element>
                                <xsl:element name="link">http://hebergement.zerttyu.net</xsl:element>
                                <xsl:element name="description">Nouvelles sur Azerttyu.net</xsl:element>
                                <xsl:element name="language">fr-FR</xsl:element>
                                 
                                <xsl:apply-templates select="dl"/>       
                        </xsl:element>
                </rss>
        </xsl:template>

        <xsl:template match="dl">
                <xsl:element name="item">
                          <xsl:apply-templates select="dt"/>
       
                        <xsl:apply-templates select="dd[@class='description']"/>
                        <author>azerttyu@pourriel.azerttyu.net (Azerttyu)</author>
                          <xsl:apply-templates select="dd[@class='date']"/>
                </xsl:element>
        </xsl:template>       

        <xsl:template match="dt">
                <xsl:element name="title">
                          <xsl:value-of select="."/>       
                </xsl:element>
        </xsl:template>       

        <xsl:template match="dd[@class='description']">
                <xsl:element name="description">
                          <xsl:value-of select="."/>       
                </xsl:element>
        </xsl:template>       

        <xsl:template match="dd[@class='date']">
                <xsl:element name="pubDate">
                        <xsl:call-template name="convert-date">
                                <xsl:with-param name="date">
                                          <xsl:value-of select="."/>
                                </xsl:with-param>
                        </xsl:call-template>
                </xsl:element>

                <xsl:element name="link">
                        http://hebergement.azerttyu.net/?page=news#<xsl:value-of select="."/>
                </xsl:element>
               
                <xsl:element name="guid">
                        <xsl:attribute name = "isPermaLink" >false</xsl:attribute>
                        <xsl:value-of select="."/>
                </xsl:element>
        </xsl:template>
       
        <!-- convertit jj/mm/aa en jj mmmm aa hh:mm +UT -->
        <xsl:template name="convert-date">
                <xsl:param name="date"/>
                <xsl:variable name = "jour" >
                        <xsl:value-of select="substring-before($date,'/')"/>
                </xsl:variable>               
                <xsl:variable name = "mois" >
                        <xsl:value-of select="substring-before(substring-after($date,'/'),'/')"/>
                </xsl:variable>
                <xsl:variable name = "annee" >
                        <xsl:value-of select="concat('20',substring-after(substring-after($date,'/'),'/'))"/>
                </xsl:variable>
                <xsl:value-of select="$jour"/>
                <xsl:text> </xsl:text>
                <xsl:value-of select="document('month.xml')//data:indexmonth/data:month[@id=$mois]/@short" />
                <xsl:text> </xsl:text>
                <xsl:value-of select="$annee"/>
                <xsl:text> 12:00:00 +0100</xsl:text>
        </xsl:template>
                               
</xsl:stylesheet>

Enfin pour s’assurer de la validité du flux, il est conseillé de consulter ces sites :

Un message, un commentaire ?

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.