Agrégateur
Reproduire le fonctionnement d'un agrégateur
Nous avons récupéré différents flux RSS provenant de différentes sources (on suppose ici que les fichiers des différents flux sont disponibles de manière statique).
Notre objectif va être, à partir de ces fichiers XML, de créer une page HTML permettant d'afficher les différents articles de nos différents flux.
Remarque : si cela vous intéresse, vous pouvez accéder aux différents flux RSS disponibles pour ces sites ici :
Flux 1
Notre premier flux : Le flux de "Le Monde"
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<title>Actu : Toute l'actualité sur Le Monde.fr.</title>
<description>Actu - Découvrez gratuitement tous les articles, les vidéos et les infographies de la rubrique Actu sur Le Monde.fr.</description>
<copyright>Copyright Le Monde.fr</copyright>
<link>http://www.lemonde.fr/m-actu/rss_full.xml</link>
<atom:link href="http://www.lemonde.fr/m-actu/rss_full.xml" rel="self" type="application/rss+xml"/>
<pubDate>Fri, 13 Nov 2015 00:40:55 +0100</pubDate>
<image>
<url>http://www.lemonde.fr/medias/web/img/export/logo_lmfr_90x20_export.png</url>
<title>Actu : Toute l'actualité sur Le Monde.fr.</title>
<link>http://www.lemonde.fr/m-actu/rss_full.xml</link>
</image>
<item>
<link>http://bigbrowser.blog.lemonde.fr/2015/11/10/lesbos-une-zone-de-paix-qui-ressemble-tant-a-une-zone-de-guerre/</link>
<title>Lesbos, une « zone de paix » qui ressemble tant à une zone de guerre</title>
<description>Un photographe de l'Agence France-Presse livre un récit poignant, face à la souffrance des migrants qui viennent s'échouer sur l'île grecque.</description>
<pubDate>Tue, 10 Nov 2015 18:06:09 +0100</pubDate>
<guid isPermaLink="true">http://www.lemonde.fr/tiny/4806885/</guid>
<enclosure url="http://s2.lemde.fr/image/2015/11/11/644x322/4807360_3_0c83_ill-4807360-7706-362555_6cc84fd1a9f68e91de95291241f88055.jpg" type="image/jpeg" length="45473"/>
</item>
<item>
<link>http://www.lemonde.fr/m-actu/article/2015/11/04/le-mariage-a-trois-avenir-de-la-chine_4802599_4497186.html</link>
<title>Le mariage à trois, avenir de la Chine ?</title>
<description>Face au déséquilibre entre les naissances de garçons et de filles, un professeur a trouvé la parade : permettre aux femmes d'épouser plusieurs hommes.</description>
<pubDate>Wed, 04 Nov 2015 06:22:54 +0100</pubDate>
<guid isPermaLink="true">http://www.lemonde.fr/tiny/4802599/</guid>
<enclosure url="http://s1.lemde.fr/image/2015/11/04/644x322/4802598_3_61f9_a-nanning-dans-le-sud-de-la-chine-des_d0956b3c51514e21294cec12f07d964b.jpg" type="image/jpeg" length="84674"/>
</item>
</channel>
</rss>
Flux 2 : Le flux de "Le Point"
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<atom:link rel="self" href="http://www.lepoint.fr/24h-infos/rss.xml"/>
<title>Le Point - En continu</title>
<description>Actualité de la rubrique En continu</description>
<lastBuildDate>Sun, 15 Nov 2015 11:40:04 +0100</lastBuildDate>
<link>http://www.lepoint.fr#xtor=RSS-221</link>
<category>En continu</category>
<language>fr</language>
<pubDate>Sun, 15 Nov 2015 11:40:04 +0100</pubDate>
<image>
<url>
http://www.lepoint.fr/images/commun3/header/logo2010.gif
</url>
<title>Le Point - En continu</title>
<link>http://www.lepoint.fr</link>
</image>
<item>
<title>Une organisation panislamique appelle à combattre "l'ennemi de l'humanité"</title>
<description/>
<pubDate>Sun, 15 Nov 2015 10:42:00 +0100</pubDate>
<link>http://www.lepoint.fr/monde/une-organisation-panislamique-appelle-a-combattre-l-ennemi-de-l-humanite-15-11-2015-1981761_24.php#xtor=RSS-221</link>
<guid>http://www.lepoint.fr/monde/une-organisation-panislamique-appelle-a-combattre-l-ennemi-de-l-humanite-15-11-2015-1981761_24.php#xtor=RSS-221</guid>
<enclosure url="http://www.lepoint.fr/images/2015/11/15/3293053-717024-jpg_3159276.jpg" length="64415" type="image/jpeg"/>
<category>Actualité</category>
</item>
<item>
<title>Attentats de Paris: aussi prévisibles qu'imparables ?</title>
<description/>
<pubDate>Sat, 14 Nov 2015 11:58:00 +0100</pubDate>
<link>http://www.lepoint.fr/societe/attentats-de-paris-aussi-previsibles-qu-imparables-14-11-2015-1981607_23.php#xtor=RSS-221</link>
<guid>http://www.lepoint.fr/societe/attentats-de-paris-aussi-previsibles-qu-imparables-14-11-2015-1981607_23.php#xtor=RSS-221</guid>
<enclosure url="http://www.lepoint.fr/images/2015/11/14/3292596-716953-jpg_3157896.jpg" length="71480" type="image/jpeg"/>
<category>Actualité</category>
</item>
</channel>
</rss>
Agrégation de plusieurs flux
Nous disposons également d'un fichier supplémentaire qui sert à référencer les fichiers XML de nos flux.
<agregateur>
<title>Liste des flux</title>
<flux>
<rss>
<ref>le_monde.xml</ref>
</rss>
<rss>
<ref>le_point.xml</ref>
</rss>
</flux>
</agregateur>
Question
Proposer une XSLT permettant de transformer le fichier d’agrégation ci-dessus en un fichier HTML, qui listera le nom de chacun des fichiers XML correspondant à nos flux.
Résultat attendu :
<html>
<head>
<title>Mon Agregateur</title>
</head>
<body>
<h1>Liste des flux</h1>
<div>
<p>le_monde.xml</p>
</div>
<div>
<p>le_point.xml</p>
</div>
</body>
</html>
On cherche à extraire le nom des documents (le_monde.xml et le_point.xml). Nous utilisons la technique du for-each pour parcourir chacun des flux rss.
Exemple d'exercice utilisant le for-each (Stéphane Crozat)
<xsl:for-each select="rss">
<p><xsl:value-of select="ref"/></p>
</xsl:for-each>
Première étape
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="agregateur">
<html>
<head><title>Mon Agregateur</title></head>
<body>
<xsl:apply-templates></xsl:apply-templates>
</body>
</html>
</xsl:template>
<xsl:template match="title">
<h1><xsl:value-of select="."/></h1>
</xsl:template>
<xsl:template match="flux">
<xsl:for-each select="rss">
<div>
<p><xsl:value-of select="ref"/></p>
</div>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Question
Nous souhaitons maintenant aller chercher à l'intérieur de chacun de ces flux les différentes entrées (articles) et les afficher dans notre page HTML. Nous ne récupérerons que :
Le titre de l'article
Le lien
La description
Modifier votre XSLT pour prendre en compte ces modifications.
Résultat attendu :
<html>
<head>
<title>Mon Agregateur</title>
</head>
<body>
<h1>Mon agrégateur de flux</h1>
<h2>Actu : Toute l'actualité sur Le Monde.fr.</h2>
<div>
<h3>
<a href="http://bigbrowser.blog.lemonde.fr/2015/11/10/lesbos-une-zone-de-paix-qui-ressemble-tant-a-une-zone-de-guerre/">Lesbos, une « zone de paix » qui ressemble tant à une zone de guerre</a>
</h3>
<p>Un photographe de l'Agence France-Presse livre un récit poignant, face à la souffrance des migrants qui viennent s'échouer sur l'île grecque.</p>
</div>
<div>
<h3>
<a href="http://www.lemonde.fr/m-actu/article/2015/11/04/le-mariage-a-trois-avenir-de-la-chine_4802599_4497186.html">Le mariage à trois, avenir de la Chine ?</a>
</h3>
<p>Face au déséquilibre entre les naissances de garçons et de filles, un professeur a trouvé la parade : permettre aux femmes d'épouser plusieurs hommes.</p>
</div>
<h2>Le Point - En continu</h2>
<div>
<h3>
<a href="http://www.lepoint.fr/monde/une-organisation-panislamique-appelle-a-combattre-l-ennemi-de-l-humanite-15-11-2015-1981761_24.php#xtor=RSS-221">Une organisation panislamique appelle à combattre "l'ennemi de l'humanité"</a>
</h3>
<p/>
</div>
<div>
<h3>
<a href="http://www.lepoint.fr/societe/attentats-de-paris-aussi-previsibles-qu-imparables-14-11-2015-1981607_23.php#xtor=RSS-221">Attentats de Paris: aussi prévisibles qu'imparables ?</a>
</h3>
<p/>
</div>
</body>
</html>
On utilise la fonction document() pour rentrer à l'intérieur de chacun des fichiers.
<xsl:variable name="doc"><xsl:value-of select="./ref"/></xsl:variable>
<xsl:for-each select="document($doc)/rss/channel/item">
(...)
</xsl:for-each>
Deuxième partie
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="agregateur">
<html>
<head>
<title>Mon Agregateur</title></head>
<body>
<h1>Mon agrégateur de flux</h1>
<xsl:apply-templates select="flux"/>
</body>
</html>
</xsl:template>
<xsl:template match="flux">
<xsl:for-each select="rss">
<xsl:variable name="doc"><xsl:value-of select="./ref"/></xsl:variable>
<h2><xsl:value-of select="document($doc)/rss/channel/title"/></h2>
<xsl:for-each select="document($doc)/rss/channel/item">
<div>
<h3><a><xsl:attribute name="href"><xsl:value-of select="./link"/></xsl:attribute><xsl:value-of select="./title"/></a></h3>
<p><xsl:value-of select="./description"/></p>
</div>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>