Software is like sex... It's better when it's free.

Blog - Tag 'xsl'

Comme tout le monde a pu le voir, ce n'est guère évident de trouver le temps pour rédiger des news mais..

Ca y'est, l'année 2011 a commencé, l'occasion rêvée pour faire un 1er bilan après plus de 3 années intensives consacrées au développement Web au côté de SillySmart et dorénavant de Wandi.

3 ans de développement Web

La 1ère année de Wandi a été très riche avec la réalisation de plus d'une trentaine de sites.

Un grand merci à tous ceux qui nous font confiance et qui permettent de faire progresser l'aventure Wandi et SillySmart chaque jour.

Sans oublier tous ceux qui nous accompagnent au quotidien : les Wandiz, Charly, Jerem, Mickey, Chatton, les Nsn guys et tous les autres..

Bonne année à tous !

Tags:  ajaxjsonmysqlphpsillysmartwandixmlxpathxsl.
Posté le Lundi 03 janvier 2011 15:56:16 - 0 commentaire

Pour les amateurs du combo XML/XSL/xPath, une petite astuce lorsque l'on pousse le générique assez loin pour former une expression xPath dynamiquement.

Supposons qu'une variable xsl contienne un "bout" de l'expression xPath, cela nous donnerait ça :

<!--
  - Selectionne un noeud XML à l'aide d'une expression xPath formée dynamiquement
  -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" xmlns="http://www.w3.org/1999/xhtml">
  <xsl:template match="root">
    <xsl:variable name="dynamicNode" select="'user_name'" />

    <!-- xPath formé = "//root/bdd/users[1]/user_name" -->
    <xsl:value-of select="bdd/users[1]/*[name()=$dynamicNode]" />

  </xsl:template>
</xsl:stylesheet>
Tags:  xmlxpathxsl.
Posté le Mardi 28 avril 2009 20:39:02 - 0 commentaire

SillySmart est un framework MVC flexible écrit en PHP5 et se basant sur du parsing XML / XSL.

SillySmart est un framework gratuit et open-source depuis 2007.

Il a été développé dans plusieurs optiques :

  • Aucun framework PHP ne permettait d'une manière naturelle d'utiliser une couche View basée sur XML/XSL.
  • Permettre aux différents collaborateurs d'un projet (avec des compétences différentes et complémentaires) de travailler de façon autonome à plusieurs niveaux du code (PHP au niveau du contrôleur, MySQL au niveau du modèle, XSL au niveau de la vue, JavaScript côté client, etc), sans interférer ni dépendre du travail de vos collaborateurs.
  • Mettre en œuvre une véritable séparation des couches MVC à travers différentes technologies et un langage spécifique à chaque couche
  • Permettre une implémentation lisible de vue couche qui tire profit des templates PHTML en sémantique XML, afin d'obtenir avec modularité, une puissante dimension de maintenance évolutive et corrective.
  • Fournir un framework qui, grâce à son squelette XML peut générer facilement N types distincts de sorties (RSS, Atom, Web services, Ajax, etc.) sans aucun problème de casting/parsing.
  • Fournir un framework léger qui n'embarquent pas des centaines de composants, mais qui reste extensible afin de répondre aux besoins individuels de chacun grâce à des plugins additionnels.

Principales fonctionnalités :

  • MVC
  • XML / XSL / xPATH
  • DAO / Persistence / CRUD
  • PDO / QueryBuilder / ExprBuilder
  • i18n
  • HMI
  • Admin Generator
  • Theming 
  • URL Rewriting / Disptaching / URL Mapping
  • Multi domains
  • Multi databases
  • Plugins
  • et bien d'autres encore...

Consulter http://www.sillysmart.org pour plus d'informations, téléchargement, api, getting started, documentation et forum.

Tags:  frameworkmvcphpxmlxsl.
Posté le Mercredi 22 août 2012 17:36:29 - 0 commentaire

Si vous débutez en XSL, au delà des features basiques (select, for-each, choose, if, variable), vous avez dû être surpris de ne pas trouver de simple boucle for, alors que le for-each était présent ; or le for-each ne permet pas toujours de tout faire. Ainsi, si vous souhaitez faire une petite boucle for, plusieurs solutions s'offrent à vous. Pour les illustrer, nous allons prendre un exemple simple : une note/5 d'article (en float) en partant du fait que vous avez cette note dans votre flux xml, et que vous souhaitez afficher le nombre d'étoiles correspondant à cette note.

1ère solution, vous utilisez PHP5 et à l'aide de la fonction registerPHPFunctions() de la classe XSLTProcessor(), vous pouvez simplement utiliser l'une de vos fonctions PHP pour réaliser le traitement.

<?php
$xml = new DOMDocument()
$xml->load('flux.xml');
$xsl = new DOMDocument()
$xsl->load('flux.xsl');
$proc = new XSLTProcessor();
$proc->registerPHPFunctions();
$proc->importStyleSheet($xsl); 
echo $proc->transformToXML($xml);

function displayStars($note)
{
  $html = "";
  for($i=0 ; $i<floor($note) ; $i++)
    $html .= '<img src="Public/Styles/Img/star.gif" title="'.floor($note).'/5" />';
  echo $html;
}
?>

Ainsi, en XSL, vous n'avez qu'à appeler directement votre fonction PHP grâce au xmlns php, en ommettant pas l'attribut disable-output-escaping afin d'interpréter le HTML retourné pas votre fonction.

<!--
- Test passant par PHP
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="root">
    <html>
      <head></head>
      <body>
        <xsl:value-of select="php:function('displayStars',//article/note)" disable-output-escaping="yes" />
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

La 2eme solution se base uniquement sur XSL et consiste en l'utilisation de templates récursifs afin de simuler une boucle for.

<!--
- Template récursif
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl"" version="1.0">
  <xsl:template name="displayStars">
    <xsl:param name="i" />
    <xsl:param name="length" />

    <!-- Traitement du for -->
    <img src="Public/Styles/Img/star.gif" alt="{concat($length,'/5')}" title="{concat($length,'/5')}" />
    <!-- /Traitement du for -->

    <!-- Tant que length n'est pas atteint, l'on rappele le template pour continuer la boucle -->
    <xsl:if test="$i < $length">
      <xsl:call-template name="displayStars">
        <xsl:with-param name="i" select="$i + 1" />
        <xsl:with-param name="length" select="$length" />
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Que l'on appellera comme ceci :

<!--
- Test d'appel du template récursif
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="root">
    <html>
      <head></head>
      <body>
        <xsl:call-template name="displayStars">
          <xsl:with-param name="i" select="'1'" />
          <xsl:with-param name="length" select="round(//article/note)" />
        </xsl:call-template>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

A noter que même si la boucle for reste exploitable en XSL, il devient vite fastidieux de rédevelopper des templates spécifiques à chaque traitement de boucles.

Une 3e solution, pour les gros projets, si l'on conserve le même exemple de la note, est de s'arranger pour modifier légèrement la structure de son flux XML formé par PHP pour pouvoir réaliser son traitement avec seulement le for-each.

Ici, au lieu de former :

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <article>
    <note><![CDATA[3.4]]></note>
  </article>
</root>

On aurait pu former :

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <article>
    <note>
      <item><![CDATA[]]></item>
      <item><![CDATA[]]></item>
      <item><![CDATA[]]></item>
    </note>
  </article>
</root>

où le nombre d'item correspondant au floor() php afin de pouvoir "foreacher" tranquillement sur notre note et simuler une boucle for :

<!--
- For-each détourné
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="root">
    <html>
      <head></head>
      <body>
        <xsl:variable name="note" select="count(//article/note/item)" />

        <xsl:for-each select="//article/note/item">
          <img src="Public/Styles/Img/star.gif" alt="{concat($note,'/5')}" title="{concat($note,'/5')}" />
        </xsl:for-each>

      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Vous pouvez voir que plusieurs solutions vous permettent de réaliser votre boucle, libre à vous de choisir celle qui vous convient le mieux, en rapport avec votre envirronnement technique et vos choix en matière d'architecture.

Tags:  phpxmlxsl.
Posté le Mercredi 06 mai 2009 19:32:22 - 1 commentaire
Si vous voulez afficher une liste d'entités en XSL en appliquant du style css sur les lignes du tableau, vous pouvez jouer sur les modulos à l'aide de la fonction position() en XSL.

Supposons le flux XML suivant listant un ensemble d'utilisateurs :

<?xml version="1.0" encoding="UTF-8"?>
<users>
  <user>
    <id>1</id>
    <login>lo</login>
    <email>laurent@sillysmart.org</email>
  </user>
  <user>
    <id>2</id>
    <login>flo</login>
    <email>florian@sillysmart.org</email>
  </user>
  <user>
    <id>3</id>
    <login>charly</login>
    <email>charly@sillysmart.org</email>
  </user>
</users>

Le css suivant :

table.bo_table_visible {	
  border:1px solid #000;
  border-spacing: 0px;
  margin-top:10px;
  margin-bottom:10px;
}
table.bo_table_visible tr.summary th {
  background:#2E2D2D;
  color:#E45A49;
}
table.bo_table_visible tr td, table.bo_table_visible tr th {
  padding:0 10px;
}
table.bo_table_visible tr.even td {
  background-color:#FFF;
  color:#000;	
}
table.bo_table_visible tr.even:hover td {
  background-color:#FF8ABC;
  color:#FFF;
}
table.bo_table_visible tr.odd td {
  background-color:#DFDFDF;
  color:#000;
}
table.bo_table_visible tr.odd:hover td {
  background-color:#64B8FE;
  color:#FFF;
}

Il vous suffit d'appliquer le script XSL suivant pour appliquer les styles sur votre liste d'utilisateurs :

<!--
- Apply css with XSL
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl" version="1.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="root">
    <html>
      <head></head>
      <body>
        <table class="bo_table_visible">
          <tr>
            <th>Id</th>
            <th>Login</th>
            <th>Email</th>
          </tr>
          <xsl:for-each select="//users/user">
            <xsl:variable name="cssClass">
              <xsl:choose>
                <xsl:when test="(position() mod 2) = 0">
                  even
                </xsl:when>
                <xsl:otherwise>
                  odd
                </xsl:otherwise>
              </xsl:choose>
            </xsl:variable>
            <tr class="{$cssClass}">
              <td><xsl:value-of select="id" /></td>
              <td><xsl:value-of select="login" /></td>
              <td><xsl:value-of select="email" /></td>
            </tr>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Ce qui produira :

Id Login Email
1 lo laurent@sillysmart.org
2 flo florian@sillysmart.org
3 charly charly@sillysmart.org
Tags:  cssxmlxsl.
Posté le Mardi 08 septembre 2009 17:20:44 - 0 commentaire