J’ai profité de l’occasion de la mise à niveau de mon système de commentaire pour optimiser mon vieux code. Déjà en XML, le contenu était toujours manipulé en ASP. J’ai donc révisé l’ensemble des codes pour exploiter la capacité récursive du XSL. Le résultat, un petit bijou de programmation, en pure récursion, basé sur le format XML de commentaires DISQUS. Simple à première vue, j’ai quand même passé une bonne fin de semaine sur cet « appel de paterne XSL »!
- Lire l’introduction aux fonctions récursives « Fonctions récursives - Optimiser vos calculs »
Fichier XML
Le fichier source est basé sur le format de commentaires « DISQUS » utilisé par Wordpress entre autre. J’utilise le format comme fichier externe contrairement à Wordpress mais à des fins de compatibilité, j’ai récupéré le format, question de ne pas réinventer ce qui se réinvente déjà beaucoup trop! Le format c’est un <item>
avec un nombre illimité de commentaire <wp:comment>
(en fait la limite est en méga octets, 500Mo je pense) un en dessous de l’autre.
- Commentaire id = 1
- Commentaire id = 2
- Commentaire id = 3 (enfant de id = 1)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!--« Commentaires » sur les tutoriels pour le site des Trucsweb.com--> <!--Format XML Basé sur le réseau de commentaire DISQUS/WP pour une meilleurs portabilité--> <rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dsq="http://www.disqus.com/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wp="http://wordpress.org/export/1.0/"> <channel> <item> <title>Récursion XSL sur le nœud parent</title> <link>http://www.trucsweb.com/tutoriels/xml/xslt-parent-recursion/</link> <pubDate>2014-12-25 15:23:21 +0000</pubDate> <dc:date.created>2014-12-25T10:23:21-05:00</dc:date.created> <dc:date.modified>2014-12-25T10:23:21-05:00</dc:date.modified> <language>fr-CA</language> <dc:creator>Oznog</dc:creator> <dsq:thread_identifier>xslt-parent-recursion</dsq:thread_identifier> <wp:post_date_gmt>2014-12-25 15:23:21</wp:post_date_gmt> <wp:comment_status>open</wp:comment_status> <wp:comment> <dsq:remote> <dsq:id>Oznog</dsq:id> <dsq:avatar>http://...</dsq:avatar> </dsq:remote> <wp:comment_id>1</wp:comment_id> <wp:comment_author>Django</wp:comment_author> <wp:comment_author_email>email@hotmail.com</wp:comment_author_email> <wp:comment_author_url>http://trucsweb.com</wp:comment_author_url> <wp:comment_author_IP>104.111.111.199</wp:comment_author_IP> <wp:comment_date_gmt>2014-12-25 15:23:21</wp:comment_date_gmt> <wp:comment_approved>0</wp:comment_approved> <wp:comment_parent>0</wp:comment_parent> <wp:comment_content><![CDATA[Mon premier commentaire]]></wp:comment_content> </wp:comment> <wp:comment> <dsq:remote> <dsq:id>Oznog</dsq:id> <dsq:avatar>http://...</dsq:avatar> </dsq:remote> <wp:comment_id>2</wp:comment_id> <wp:comment_author>Oznog</wp:comment_author> <wp:comment_author_email>email@hotmail.com</wp:comment_author_email> <wp:comment_author_url>http://trucsweb.com</wp:comment_author_url> <wp:comment_author_IP>104.111.111.199</wp:comment_author_IP> <wp:comment_date_gmt>2014-12-25 15:23:33</wp:comment_date_gmt> <wp:comment_approved>1</wp:comment_approved> <wp:comment_parent>0</wp:comment_parent> <wp:comment_content><![CDATA[Mon deuxième commentaire]]></wp:comment_content> </wp:comment> <wp:comment> <dsq:remote> <dsq:id>Oznog</dsq:id> <dsq:avatar>http://...</dsq:avatar> </dsq:remote> 3</wp:comment_id> <wp:comment_author>Luc Tremblay</wp:comment_author> <wp:comment_author_email>email@hotmail.com</wp:comment_author_email> <wp:comment_author_url>http://www.trucsweb.com</wp:comment_author_url> <wp:comment_author_IP>67.111.111.233</wp:comment_author_IP> <wp:comment_date_gmt>2014-12-26 14:11:55</wp:comment_date_gmt> <wp:comment_approved>1</wp:comment_approved> <wp:comment_parent>1</wp:comment_parent> <wp:comment_content><![CDATA[Mon troisième commentaire en réponse au premier commentaire.]]></wp:comment_content> </wp:comment> </item> </channel> </rss>
Il suffit d’afficher les commentaires un en dessous de l’autre. Un opération toute simple vous me direz. Mais qu’arrive t’il si on désire afficher le commentaire #3 sous le #1 puisqu’il s’agit d’une réponse au premier commentaire? C’est à dire entre le #1 et le #2.
Fichier XSL
On veut donc le résultat suivant.
- Commentaire id = 1
- Commentaire id = 3 (enfant de id = 1)
- Commentaire id = 2