Le XML et son langage de programmation XSL me fascinent depuis le siècle dernier et je ne comprends toujours pas pourquoi personne ne s’y intéresse vraiment. Je suis tombé dernièrement sur un vieux texte du Dr A. J. Trickett « Processing RSS Files with XSLT » qui ressemble beaucoup à mon histoire. Seul dans son monde XML qu’il a visiblement abandonné depuis...
Et pourtant c’est génial, efficace, rapide et surtout eXtensible. Super cool quoi. À l’époque, les navigateurs n’étaient pas encore compatibles avec le langage XSL, mais on espérait. C’est peut-être ce qui en décourageait plusieurs. Il y a aussi le très populaire PHP qui a dû attendre la version 5 pour avoir un véritable moteur XML. Et que dire de l’actionScript de Macromedia et son simili moteur XML ensuite détruit par Apple. On peut aussi ajouter à la liste Google qui a ressuscité le simple, et rapide d’usage, JSON qui a fini par éclipser le XML.
Mais l’espoir a depuis longtemps porté fruit. Prenez ce texte par exemple, vous avez une version en pur XML (http://www.trucsweb.com/tutoriels/xml/rss-styliser-xsl-css/default.rdf) comme tous les tutoriels des Trucsweb, et ce depuis 10 ans ! Vous vous dites peut-être à quoi bon ? Et il n’existe assurément aucun plug-in Wordpress pour ce faire. Mais si tout le monde connait l’expression Web 2, quoique galvaudé à de nombreuses sauces, on semble oublier que c’est avant tout la révolution de la séparation du contenu du contenant.
Exactement comme la feuille de styles qui détermine comment sera affichée une page HTML. C’est le même principe, mais au lieu d’une base de données et d’un langage serveur pour rendre au départ une page HTML, les données XML sont envoyées directement au navigateur, avec son code XSL et finalement sa feuille de style CSS en texte clair pour être interprété par le navigateur pour générer la page HTML. Directement sur la machine de l’usager. Le serveur fait un seul travail, celui de servir des fichiers via HTTP, comme son nom l’indique en fait, un serveur !
Si le XML n’a pas toujours de lettre de noblesse sur le Web, outre quelques usages limités à l’import/export, c’est fou tout ce qu’un serveur peut faire pour retourner une banale page Web. Et aujourd’hui, en plus des nombreuses dépendances, c’est souvent un contenu qui provient de plusieurs serveurs, question de laisser les « majors » monopoliser le contrôle du contenu. Sans le savoir, une bête page HTML peut charger plusieurs versions de la même librairie jQuery. Un peu comme les multiples versions de Microsoft Visual C++ Redistribuable qui embourbe votre Windows.
Quand je navigue avec mon Firefox sécurisé qui bloc les scripts intersites (Cross Site Scripting) il y a partout des trous. Les pictogrammes, les avatars à gauche, le contenu sur un nuage en haut, les commentaires en bas sur un autre serveur, la carte Google Map. Aucun formulaire ne fonctionne, car il manque le Captcha Google. Et que dire des fichiers témoins, aucune page Web n’a besoin de témoins pour fonctionner. Mais ils sont proposés comme indispensable, pour faire rouler un serveur qui n’a que faire du principe de précaution et d’économie que procure une page Web autonome. Mais on s’en fout, on est encore à l’heure de l’abondance en 2021 (!). Voilà aussi pourquoi bouder le XML et le contenu généré localement. Ils n’ont rien à gagner et tout à perdre...
Je radote encore, mais j’ai terminé ma montée de lait ; -) Revenons à nos moutons.
Exemple en temps réel de la syndication des Trucsweb.com
S’il y a un domaine que le XML a réussi à prendre le marché, c’est bien la syndication de contenu, le RSS (Really Simple Syndication). Fouillez moi pourquoi ce n’est pas Google qui a pris le contrôle, il a même créé son propre format RSS, l’Atom. Twitter aussi était historiquement un grand serveur de RSS. J’ai bien aimé Twitter à sa sortie. On pouvait utiliser à notre guise les RSS poussés par lui. Était, car on a déchanté rapidement quand Twitter a décidé de cessé de publier des flux RSS, libre et gratuit, au profit de ses satanés widgets. Enfin, le RSS est plus que jamais vivant grâce sans doute aux nombreux plug-ins WordPress ou aux services comme feedreader.com. Toujours est-il qu’il est là pour de bon et je vous offre un petit script fort sympathique pour afficher, en toute liberté, vos RSS sans langage serveur.
Code complet
Sans tarder, et comme promis, voilà un exemple qui parle de lui même. Ouvrez la syndication RSS des Trucsweb.com : http://www.trucsweb.com/documents/syndication/rss.rdf. C’est un simple fichier d’une syndication RSS en format RDF, manipulé par votre navigateur en XSL et stylisé par un fichier CSS exactement comme une page Web conventionnelle. À la différence qu’aucun langage serveur n’est requis ni aucune base de données. Si ce n’est pas cool ça, c’est probablement parce qu’il manque un « j’aime » quelque part ; -))
Le XSL est un langage "complexe" et l’on trouve peu de ressource sur le Web, ce qui explique en partie son impopularité. Je ne vais donc pas vous décrire ici ce langage récursif plutôt difficile à saisir pour le néophyte ou l’amateur de langage-objet que j’adore aussi n’en douter pas. J’ai bien l’intention toutefois de pondre plusieurs tutoriels sur le sujet d’ici peu. Mais pour l’instant, je vais me contenter de démontrer le principe de séparation du contenu, du contenant et de la manipulation à la base de mon travail depuis 20 ans...
La première étape consiste à ajouter à votre fichier XML, de format RSS, l’instruction suivante pour appeler le script XSL :
// Le fichier rss10.xsl pour la version RDF 1.0 (rdf:RDF/channel/item) <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml-stylesheet type="text/xsl" href="http://www.trucsweb.com/css/rss10.xsl"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"... // Ou rss20.xsl pour la version 2.0 plus simple (rss/channel/item) <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml-stylesheet type="text/xsl" href="http://www.trucsweb.com/css/rss20.xsl"?> <rss version="2.0"...
Exemple complet de syndication RSS 2.0
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <?xml-stylesheet type="text/xsl" href="http://www.trucsweb.com/tutoriels/xml/rss-styliser-xsl-css/rss20.xsl"?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:content="http://purl.org/rss/1.0/modules/content/"> <channel> <title>Syndication - Trucsweb.com</title> <link>http://www.trucsweb.com/</link> <atom:link href="http://www.trucsweb.com/tutoriels/xml/rss-styliser-xsl-css/rss20.xml" rel="self" type="application/rss+xml" /> <description>Aide, tutoriels et outils pour Webmestre.</description> <lastBuildDate>Sun, 28 Mar 2021 20:09:00 GMT</lastBuildDate> <!-- docs>http://blogs.law.harvard.edu/tech/rss</docs --> <generator>Neural v7.3.6</generator> <category>Webmasterie</category> <ttl>60</ttl> <image> <title>Syndication - Trucsweb.com</title> <url>http://www.trucsweb.com/img/t_tut3.png</url> <link>http://www.trucsweb.com/</link> </image> <dc:language>fr-ca</dc:language> <dc:creator>Django (Oznog) Blais</dc:creator> <dc:rights>Copyright © 1998-2021 https://neural.quebec/propos/</dc:rights> <dc:date>2021-03-30T07:49:54-04:00</dc:date> <sy:updatePeriod>daily</sy:updatePeriod> <sy:updateFrequency>2</sy:updateFrequency> <sy:updateBase>2000-01-01T12:00+00:00</sy:updateBase> <item> <title>XML - Stylisez vos fichiers RSS avec le langage XSL</title> <link>http://www.trucsweb.com/tutoriels/xml/rss-styliser-xsl-css/</link> <description>Le grand oublié XML ou comment utiliser un script XSL avec CSS pour styliser vos fichiers RSS de format RDF sans aucun langage serveur ni base de données.</description> <dc:creator>Django (Oznog) Blais</dc:creator> <guid>http://www.trucsweb.com/tutoriels/xml/rss-styliser-xsl-css/</guid> <category>XML</category> <enclosure url="http://www.trucsweb.com/documents/images/2021/paul-emile_borduas.jpeg" length="406" type="image/jpeg" /><!-- length="1069871" type="audio/mpeg" --> <media:content medium="image" url="http://www.trucsweb.com/documents/images/2021/paul-emile_borduas.jpeg" /> <source url="http://www.trucsweb.com/documents/syndication/rss.rdf">Syndication RSS - Trucsweb.com</source> <content:encoded><![CDATA[<p>Le grand oublié XML ou comment utiliser un script XSL avec CSS pour styliser vos fichiers RSS de format RDF sans aucun langage serveur ni base de données.</p>]]></content:encoded> <pubDate>Sun, 28 Mar 2021 20:09:00 GMT</pubDate> </item> <item> <title>Bootstrap 5 - Ouvrir une vidéo YouTube dans une fenêtre modale</title> <link>http://www.trucsweb.com/tutoriels/javascript/bootstrap_5_modal_youtube/</link> <description>Une fenêtre modale dynamique avec une vidéo YouTube ou Vimeo avec arrêt automatiquement à la fermeture de la fenêtre.</description> <dc:creator>Django (Oznog) Blais</dc:creator> <guid>http://www.trucsweb.com/tutoriels/javascript/bootstrap_5_modal_youtube/</guid> <category>JavaScript</category> <enclosure url="http://www.trucsweb.com/documents/images/2021/riopelle-70197.webp" length="406" type="image/webp" /> <source url="http://www.trucsweb.com/documents/syndication/rss.rdf">Syndication RSS - Trucsweb.com</source> <content:encoded><![CDATA[<p>Une fenêtre modale dynamique avec une vidéo YouTube ou Vimeo avec arrêt automatiquement à la fermeture de la fenêtre.</p>]]></content:encoded> <pubDate>Sun, 28 Mar 2021 20:00:00 GMT</pubDate> </item> <item> <title>CSS - Personnalisez vos hyperliens avec un pictogramme (icon)</title> <link>http://www.trucsweb.com/tutoriels/css/css_htperliens_avec_pictogramme/</link> <description>Identifier vos documents PDF, Word ou tout autres hyperlien à l’aide d’un pictogramme personnalisé Font Awesome.</description> <dc:creator>Django (Oznog) Blais</dc:creator> <guid>http://www.trucsweb.com/tutoriels/css/css_htperliens_avec_pictogramme/</guid> <category>JavaScript</category> <enclosure url="http://www.trucsweb.com/documents/images/2021/terre_masque.jpg" length="406" type="image/jpeg" /> <source url="http://www.trucsweb.com/documents/syndication/rss.rdf">Syndication RSS - Trucsweb.com</source> <content:encoded><![CDATA[<p>Identifier vos documents PDF, Word ou tout autres hyperlien à l’aide d’un pictogramme personnalisé Font Awesome.</p>]]></content:encoded> <pubDate>Fri, 26 Feb 2021 21:00:00 GMT</pubDate> </item> </channel> </rss>
La feuille de styles rss.css compatible avec les deux versions. Cette feuille de styles offre aussi une version adaptative (responsive).
/* Fichier rss.css */ body { font: 14px 'Open Sans', Helvetica, Arial, sans-serif; margin: 0; } a { color: #3498db; text-decoration: none; } h1 { margin: 0; } #description { background-color: #343a40; color: #FFF; padding: 30px 30px 20px; } #description a { color: #fff; } #content { padding: 0px 0px 0px; background: #fff; } @media (min-width: 768px) {#content {padding: 10px 30px 30px;}} a:hover { border-bottom: 1px solid; } th, td { font-size: 12px; } th { text-align: left; border-bottom: 1px solid #ccc; } th, td { padding: 10px 15px; } tr:hover { background-color: #eeeeee; } .odd { background-color: #eeeeee; } .odd:hover { background-color: #ccc; } #footer { margin: 20px 30px; font-size: 12px; color: #999; } #footer a { color: inherit; } #description a, #footer a { border-bottom: 1px solid; } #description a:hover, #footer a:hover { border-bottom: none; } img.thumbnail { max-height: 100px; max-width: 100px; } .pasmobile, .paspad {display:none;} @media (min-width: 768px) {.pasmobile {display:table-cell;}} @media (min-width: 1000px) {.paspad {display:table-cell;}}
Et le fichier ou script XSL pour la version standard RSS 2.0 rss20.xsl. Noter le « template multiple » pour convertir la date anglaise en français. Et une petite passe pour récupérer le dc:creator
pour un RSS valide, car l’élément author
de base demande une adresse courriel (!). D’ailleurs il y a plein de petits trucs que j’ai acquis au fil des années dans ce petit bout de code :
<?xml version='1.0' encoding='UTF-8'?> <xsl:stylesheet version='2.0' xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/"> <html> <head> <title>Syndication <xsl:value-of select="rss/channel/title"/></title> <link rel="stylesheet" href="/tutoriels/xml/rss-styliser-xsl-css/rss.css" /> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> </head> <xsl:apply-templates select="rss/channel"/> </html> </xsl:template> <xsl:template match="channel"> <body> <div id="description"> <img src="{image/url}" style="max-height:100px;float:right;margin-left:20px;" alt="{image/title}" /> <h1>Syndication <xsl:value-of select="title"/></h1> <p>Fil de nouvelle RSS poussé par <a href="{image/link}"><xsl:value-of select="image/title"/></a></p> <p><small> <xsl:value-of select="description"/><br />Dernière mise à jour : <xsl:apply-templates select="lastBuildDate"/> </small></p> </div> <div id="content"> <table style="width:100%"> <tr> <th class="pasmobile">#</th> <th class="pasmobile">Image</th> <th class="pasmobile">Titre</th> <th class="paspad">Auteur</th> <th class="pasmobile">Date</th> </tr> <xsl:apply-templates select="item"/> </table> </div> <div id="footer"> <img src="/neural/images/l_oz2012.png" style="float:right;margin-left:20px;" alt="Oznogco" /> <p>Généré par <a href="https://neural.quebec" target="_blank">Neural v7.3.0</a></p> </div> </body> </xsl:template> <xsl:template match="item"> <tr> <xsl:choose> <xsl:when test="position() mod 2 != 1"> <xsl:attribute name="class">odd</xsl:attribute> </xsl:when> </xsl:choose> <td class="pasmobile"> <xsl:value-of select = "position()" /> </td> <td> <xsl:if test="enclosure/@url"> <div style="border:1px solid #ccc;background: #ffffff url({enclosure/@url}) center top no-repeat; background-size: cover;width:30px;height:30px;"></div> </xsl:if> </td> <td> <a href="{link}"><xsl:value-of disable-output-escaping="yes" select="title"/></a><br /> <small><xsl:value-of disable-output-escaping="yes" select="description" /></small> </td> <td class="paspad"> <xsl:value-of select="child::*[local-name()='creator']"/> </td> <td class="pasmobile"> <xsl:apply-templates select="pubDate" /> </td> </tr> </xsl:template> <xsl:template match="pubDate|lastBuildDate"> <xsl:choose> <xsl:when test="substring(., 6,2) = '01'"> <xsl:value-of select="substring(., 7,1)" />er </xsl:when> <xsl:when test="substring(., 6,1) = '0'"> <xsl:value-of select="substring(., 7,1)" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="substring(., 6,2)" /> </xsl:otherwise> </xsl:choose> <xsl:text> </xsl:text> <xsl:choose> <xsl:when test="substring(., 9,3) = 'Jan'">janvier</xsl:when> <xsl:when test="substring(., 9,3) = 'Feb'">février</xsl:when> <xsl:when test="substring(., 9,3) = 'Mar'">mars</xsl:when> <xsl:when test="substring(., 9,3) = 'Avr'">avril</xsl:when> <xsl:when test="substring(., 9,3) = 'Mai'">mai</xsl:when> <xsl:when test="substring(., 9,3) = 'Jun'">juin</xsl:when> <xsl:when test="substring(., 9,3) = 'Jui'">juillet</xsl:when> <xsl:when test="substring(., 9,3) = 'Aou'">août</xsl:when> <xsl:when test="substring(., 9,3) = 'Sep'">septembre</xsl:when> <xsl:when test="substring(., 9,3) = 'Oct'">octobre</xsl:when> <xsl:when test="substring(., 9,3) = 'Nov'">novembre</xsl:when> <xsl:when test="substring(., 9,3) = 'Dec'">décembre</xsl:when> <xsl:otherwise>erreur</xsl:otherwise> </xsl:choose> <xsl:text> </xsl:text><xsl:value-of select="substring(., 13, 4)"/> </xsl:template> </xsl:stylesheet>
Fichier ou script XSL pour la version RSS 1.0 RDF rss10.xsl comme les Trucsweb.com. Noter le « template » pour convertir la date ISO en français :
<?xml version='1.0' encoding='UTF-8'?> <xsl:stylesheet version='2.0' xmlns:html='http://www.w3.org/TR/REC-html40' xmlns:sitemap='http://www.sitemaps.org/schemas/sitemap/0.9' xmlns:rss="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.0/" exclude-result-prefixes="#default xsl rdf dc rss" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:output method='html' version='1.0' encoding='UTF-8' indent='yes'/> <xsl:template match="/"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Communiqués (RSS) - <xsl:value-of select="rdf:RDF/rss:channel/rss:title"/></title> <link rel="stylesheet" href="/neural/xsl/rss.css" /> <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/> </head> <body> <div id="description"> <img src="http://www.trucsweb.com/img/t_tut3.png" style="max-height:100px;float:right;margin-left:20px;" alt="{rdf:RDF/rss:channel/rss:title}" /> <h1><xsl:value-of select="rdf:RDF/rss:channel/rss:title"/></h1> <xsl:choose> <xsl:when test='not(sitemap:sitemapindex/sitemap:sitemap)'> <p><strong></strong></p> </xsl:when> </xsl:choose> <p>Fil de nouvelle RSS poussé par <a href="{rdf:RDF/rss:channel/rss:link}"><xsl:value-of select="rdf:RDF/rss:channel/rss:title"/></a></p> <p><small><xsl:value-of select="rdf:RDF/rss:channel/rss:description"/><br /><xsl:value-of select="rdf:RDF/rss:channel/rss:date"/></small></p> </div> <div id='content'> <table style="width:100%"> <tr> <th class="pasmobile">#</th> <th class="pasmobile">Image</th> <th class="pasmobile">Titre</th> <th class="paspad">Auteur</th> <th class="pasmobile">Date</th> </tr> <xsl:for-each select="rdf:RDF/rss:item"> <tr> <xsl:choose> <xsl:when test='position() mod 2 != 1'> <xsl:attribute name="class">odd</xsl:attribute> </xsl:when> </xsl:choose> <td class="pasmobile"> <xsl:value-of select = "position()" /> </td> <td> <xsl:if test="rss:image/@rdf:resource"> <div style="border:1px solid #ccc;background: #ffffff url({rss:image/@rdf:resource}) center top no-repeat; background-size: cover;width:30px;height:30px;"></div> </xsl:if> </td> <td><a href="{rss:link}"><xsl:value-of select="rss:title"/></a><br /><small><xsl:value-of select="rss:description"/></small></td> <td class="paspad"><xsl:value-of select="child::*[local-name()='creator']"/></td> <td class="pasmobile"><xsl:apply-templates select="child::*[local-name()='date']" /></td> </tr> </xsl:for-each> </table> </div> <div id="footer"> <img src="http://www.trucsweb.com/neural/images/l_oz2012.png" style="float:right;margin-left:20px;" alt="Oznogco" /> <p>Généré par <a href="https://neural.quebec" target="_blank">Neural v7.3.0</a></p> </div> </body> </html> </xsl:template> <xsl:template match="child::*[local-name()='date']"> <xsl:choose> <xsl:when test="substring(., 9,2) = '01'"> <xsl:value-of select="substring(., 10,1)" />er </xsl:when> <xsl:when test="substring(., 9,1) = '0'"> <xsl:value-of select="substring(., 10,1)" /> </xsl:when> <xsl:otherwise> <xsl:value-of select="substring(., 9,2)" /> </xsl:otherwise> </xsl:choose> <xsl:text> </xsl:text> <xsl:choose> <xsl:when test="substring(., 6,2) = '01'">janvier</xsl:when> <xsl:when test="substring(., 6,2) = '02'">février</xsl:when> <xsl:when test="substring(., 6,2) = '03'">mars</xsl:when> <xsl:when test="substring(., 6,2) = '04'">avril</xsl:when> <xsl:when test="substring(., 6,2) = '05'">mai</xsl:when> <xsl:when test="substring(., 6,2) = '06'">juin</xsl:when> <xsl:when test="substring(., 6,2) = '07'">juillet</xsl:when> <xsl:when test="substring(., 6,2) = '08'">août</xsl:when> <xsl:when test="substring(., 6,2) = '09'">septembre</xsl:when> <xsl:when test="substring(., 6,2) = '10'">octobre</xsl:when> <xsl:when test="substring(., 6,2) = '11'">novembre</xsl:when> <xsl:when test="substring(., 6,2) = '12'">décembre</xsl:when> <xsl:otherwise>erreur</xsl:otherwise> </xsl:choose> <xsl:text> </xsl:text><xsl:value-of select="substring(., 1, 4)"/> </xsl:template> </xsl:stylesheet>
Noter que les Trucsweb.com utilisent le format RDF. C’est un RSS 1.0 de 2000 format « Resource Description Framework (RDF) » extensible. Il faut ajouter le Type MIME « application/rdf+xml » sur la grande majorité des serveurs, originalité oblige... Il permet entre autres les dates ISO 8601 au lieu du format anglais Sat, 07 Sep 2002 00:00:01 GMT probablement idéale quand on est anglais et localisé directement sur le « Greenwich Mean Time » (Temps moyen de Greenwich ;-)
Conclusion
Le résultat est pas mal : http://www.trucsweb.com/documents/syndication/rss.rdf. Et si vous m’avez suivi, vous pouvez comprendre que chaque tutoriel des Trucsweb.com est généré de la même manière, avec un langage serveur certes, mais sans l’aide d’une base de données...
J’ajouterais en terminant que le XML est par définition un langage extensible. C’est-à-dire qu’il est possible d’ajouter à volonté des noms d’éléments et d’attributs en respectant les règles bien sûr. Et une des règles est essentiellement les espaces de noms (namespaces), par exemple les espaces de noms des Trucsweb.com. Les espaces de noms XML fournissent une méthode simple pour qualifier les balises ou noms d’éléments et d’attributs utilisés dans les documents extensibles (Extensible Markup Language) en les associant à des espaces de noms identifiés par des références URI. La liberté totale en principe. En principe, car le problème avec les espaces de noms XML c’est les valideurs en ligne qui retourne des erreurs si vous n’êtes pas Amazone ou un autre Big Brother du Web. C’est toujours possible de demander d’ajouter vos espaces de noms, mais je n’ai jamais réussi avec les miens. Une incongruité chauvine de Web dit ouvert...
Pourquoi créer ses propres espaces de nom ? La syndication décrit tout type de contenu, c’est déjà une bonne raison. Mais pour les RSS? Les formats RSS 0.98, 0.99, 1.0, 2.0, 2.0.11, dates déjà de 20 ans. Bien avant l’ère du mobile moderne. Juste l’exemple de l’image, une vignette accompagnant un texte. Les experts que j’appelle amicalement appelés les maniaques ; -) Impose d’indiquer le type, mais aussi le poids des images ! Mon gestionnaire compile bien le poids des images, mais pas dans un code HTML. Il ne faut pas se demande pourquoi un géant comme la BBC ne mentionne aucune image dans ses RSS. La BBC n’a pas d’image ?
J’utilise les noms d’espaces d’amazone justement pour ajouter des images, et rester valide (!). Cette fois, c’est les dimensions de l’image, par chance elles ne sont pas requises, probablement par manque de rigueur du valideur. Mais dans un contexte adaptatif (responsive) on n’indique plus les dimensions de l’image qui varie aux pixels prêts en fonction de l’espace disponible ! Il est peut-être le temps de revoir le format RSS ? Ha! c’est vrai, j’oubliais le Big des Bigs qui a sa propre solution ; -))
Références
- W3C Feed Validation Service - W3C
- RDF Site Summary (RSS) 1.0 - W3C
- RSS 2.0 Specification - RSS Advisory Board
- RSS 2.0 Specification - W3C
- The Extensible Stylesheet Language Family (XSL)
- Transformations XSL (XSLT) Version 1.0 - http://xmlfr.org
- What is XSL? W3C
- Namespaces in XML 1.0 (Third Edition) - W3C