Il n'est certainement pas inutile de résumer les derniers billets. Le XML est sans aucun doute un langage d'avenir. Mais à l'exception d'Internet Explorer, les navigateurs web sont encore incapables d'interpréter convenablement des documents XSL. Dans un environnement internet, le XML est donc à utiliser préférentiellement du côté serveur : soit pour structurer des informations (configuration, logs, interactions entre machines distantes : ping, trackbacks, services web...) soit pour produire du code HTML via un processeur XSLT. A cela il faut ajouter deux choses : d'une part l'XML devient incontournable et d'autre part PHP5 met a disposition de nombreux outils pour faciliter la manipulation de ressources XML. Alors, pourquoi s'en priver ? Pourquoi ne pas profiter des toutes dernières technologies?

Concernant phpStudio, la question serait plutôt : pourquoi se lancer dans l'XSL/XSLT ? Voici une liste de "raisons" pour ne pas franchir le pas :

  • un manipulation XSLT requiert des données XML d'un seul tenant : sous forme d'un fichier ou d'un objet stocké en mémoire. Pas simple à obtenir dans le cadre d'un forum de discussion...
  • s'il fallait jouer la carte XML jusqu'au bout, le langage XSL nécessitera de trouver de nombreuses astuces pour transférer des fonctions de présentation de PHP a XSL[1].
  • le concept d'API est difficilement conciliable avec celui d'XSLT. L'un stipule que des données peuvent être manipulées par morceaux, de manière atomique, l'autre exige que les éléments constituent un bloc d'un seul tenant
  • dans le cadre d'une application communautaire, c'est suicidaire de vouloir imposer aux utilisateurs la réalisation de gabarits HTML en XSL (en plus de l'HTML et du CSS).
  • la plupart des lecteurs de ce blog n'ont vraisemblablement rien compris. Et s'ils ont compris quelque chose, ils seraient bien en peine s'ils devaient réaliser un "skin" en XSL[2]...

Dans le cadre du projet phpStudio, du XML sera utilisé, mais pas sous forme d'XSLT. Ce n'est adapté ni au projet, ni au public potentiel.

Juste pour le plaisir, voici un essai trivial réalisé il y a longtemps avec la collaboration de Simous. Le code XSL ci-dessous correspond à l'affichage des informations de debug SQL des forums IPB :

display.xsl
  
<?xml version="1.0" encoding="iso-8859-1" ?>  
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
  
<xsl:variable name="lang" select="document('lang.xml')"/>  
<xsl:template match="/">  
 <html>  
  <head>  
   <title>TEST</title>  
   <meta name="lang" content="fr" />  
   <link href="./css.php?id=1_1" rel="stylesheet" type="text/css" />  
 </head>  
 <body>  
  <xsl:apply-templates select="document_root/root_queries" />  
  <xsl:apply-templates select="document_root/page_debuginfo" />  
 </body>  
 <xsl:apply-templates select="$lang/lang/aaa" />  
 </html>  
</xsl:template>  
  
  
<xsl:include href="lib_replace.xsl"/>  
<xsl:include href="debug_queries.xsl"/>  
<xsl:include href="page_debuginfo.xsl"/>  
</xsl:stylesheet>  
  
debug_queries.xsl
  
<?xml version="1.0" encoding="iso-8859-1"?>  
<xsl:stylesheet  
 version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  
<xsl:output method="html" encoding="ISO-8859-1" indent="yes" />  
  
<xsl:template match="root_queries">  
 <h1>SQL details</h1><br />  
 <xsl:for-each select="querylog">  
  <div class="logBox">  
  <xsl:choose>  
   <xsl:when test="comment!=''">  
    <div class="logBoxComment"><xsl:apply-templates select="comment" /></div>  
   </xsl:when>  
   <xsl:otherwise>  
    <xsl:choose>  
     <xsl:when test="time=''">  
      <div class="logBoxShutdown">Shutdown Query</div>  
      <div class="logQueryShutdown"><xsl:apply-templates select="query" /></div>  
     </xsl:when>  
     <xsl:otherwise>  
      <xsl:choose>  
       <xsl:when test="select!='1'">  
        <div class="logBoxNonSelect">Non Select Query</div>  
        <div class="logQueryNonSelect"><xsl:apply-templates select="query" /></div>  
       </xsl:when>  
       <xsl:otherwise>  
        <div class="logBoxSelect">Select Query</div>  
        <div class="logQuerySelect"><xsl:apply-templates select="query" /></div>  
       </xsl:otherwise>  
      </xsl:choose>  
     </xsl:otherwise>  
    </xsl:choose>  
   </xsl:otherwise>  
  </xsl:choose>  
  <xsl:if test="time!=''">  
   <xsl:if test="description!=''">  
    <xsl:apply-templates select="description" />    </xsl:if>    <div class="logTime"><span style="font-weight:bold;">time : </span><xsl:apply-templates select="time" />s</div>  
   <div class="logTimePercent"><xsl:apply-templates select="percent" /> %</div>  
  </xsl:if>  
  </div><br />  
 </xsl:for-each>  
</xsl:template>  
  
  
<xsl:template match="description">  
 <xsl:choose>  
  <xsl:when test="row/Comment!=''">  
   <div class="logWarning"><xsl:apply-templates select="row/Comment" /></div>  
  </xsl:when>  
  <xsl:otherwise>  
   <div class="logSelectTitles">  
   <div class="logSelectInfoTable">table</div>  
   <div class="logSelectInfoType">type</div>  
   <div class="logSelectInfoPossiblesKeys">possible keys</div>  
   <div class="logSelectInfoKey">key</div>  
   <div class="logSelectInfoKeylen">key_len</div>  
   <div class="logSelectInfoRef">ref</div>  
   <div class="logSelectInfoRows">rows</div>  
   <div class="logSelectInfoExtra">Extra</div>  
   </div>  
   <xsl:for-each select="row">  
    <div class="logSelect">  
     <div class="logSelectInfoTable"><xsl:apply-templates select="table" />&#160;</div>  
     <div class="logSelectInfoType"><xsl:apply-templates select="type" />&#160;</div>  
     <div class="logSelectInfoPossiblesKeys"><xsl:apply-templates select="possible_keys" />&#160;</div>  
     <div class="logSelectInfoKey"><xsl:apply-templates select="key" />&#160;</div>  
     <div class="logSelectInfoKeylen"><xsl:apply-templates select="key_len" />&#160;</div>  
     <div class="logSelectInfoRef"><xsl:apply-templates select="ref" />&#160;</div>  
     <div class="logSelectInfoRows"><xsl:apply-templates select="rows" />&#160;</div>  
     <div class="logSelectInfoExtra"><xsl:apply-templates select="Extra" />&#160;</div>  
    </div>  
   </xsl:for-each>  
  </xsl:otherwise>  
 </xsl:choose>  
  
</xsl:template>  
</xsl:stylesheet>  
  

Pour modifier l'apparence graphique de phpStudio, auriez-vous été prêt à personnaliser vos propres feuilles XSL ? Sincèrement, moi... non. Trop compliqué.

C'est sur cette conclusion que prend fin la parenthèse XSLT de ce blog. Passons à autre chose.



[1] Je suis toujours intéressé par un équivalent XSL à la fonction sprintf()
[2] Si un artiste de Kloobik.com veut relever le défi, merci de me tenir informé...