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

Blog - Utiliser des fonctions PHP en XSL

Utiliser des fonctions PHP en XSL

Une des grandes nouveautés de PHP5 est que la classe de parsing XML/XSL XSLTProcessor permet nativement d'utiliser PHP pour effectuer des transformations lourdes et fastidieuses auparavant. Dorénavant, plus besoin de faire de template pour effectuer un ucwords(), il vous suffit d'un tout petit peu de paramétrage et on est bon.

Au niveau PHP :

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

// On précise au parseur que l'on veut utiliser des fonctions PHP en XSL
$proc->registerPHPFunctions();

$proc->importStyleSheet($xsl); 
echo $proc->transformToXML($xml);
?>

Et au niveau XSL :

<!--
- Simple test pour appeler une fonction php
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl"
 version="1.0">
<!-- On ajoute surtout le xmlns PHP -->
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:template match="root">
    <html>

      <!-- On utilise le préfixe php pour appeler la fonction ucwords() -->
      <xsl:value-of select="php:function('ucwords','php peut désormais être utilisé en xsl')" />
      <!-- Output: 'Php Peut Désormais Etre Utilisé En Xsl' -->

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

On peut même utiliser des fonctions statiques de classe, au niveau PHP :

<?php
class XSL
{
  /**
  * Traite une chaine pour la passer dans l'url
  *
  * @param $string la chaine a modifier
  * @param $delimiter le caractère d'implode
  * @return $string la chaine modifie
  * @see self::fullTrim
  * @see self::removeSpecialCaracteres
  * @see self::removeAccents
  */
  static function stringToUrl($string,$delimiter=" ")
  {
    return self::fullTrim(self::removeSpecialCaracteres(strtolower(self::removeAccents($string)))
    ,$delimiter);		
  }

  /**
  * Enleve les caractères accentuées d'une chaine
  *
  * @param $string la chaine a modifier
  * @return $string la chaine modifie	 
  */
  static function removeAccents($string)
  {
    static $search = array ("à", "á", "â", "ã", "ä", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï",
                            "ñ", "ò" ,"ó", "ô", "õ", "ö", "ù", "ú", "û", "ü", "ý", "ÿ", "À", "Á",
                            "Â", "Ã", "Ä", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ñ", "Ò",
                            "Ó", "Ô", "Õ", "Ö", "Ù", "Ú", "Û", "Ü", "Ý");
    static $replac = array ("a", "a", "a", "a", "a", "c", "e", "e", "e", "e", "i", "i", "i", "i",
                            "n", "o", "o", "o", "o", "o", "u", "u", "u", "u", "y", "y", "A", "A",
                            "A", "A", "A", "C", "E", "E", "E", "E", "I", "I", "I", "I", "N", "O",
                            "O", "O", "O", "O", "U", "U", "U", "U", "Y");		
    return str_replace($search,$replac,$string);			
  }

  /**
  * Enleve les caractères spéciaux d'une chaine
  *
  * @param $string la chaine a modifier
  * @return $string la chaine modifie	 
  */
  static function removeSpecialCaracteres($string)
  {
    static $search = array ("²", "&", "~", "#", "{", "(", "[", "-", "|", "`", "\\", "^", "'", ")",
                            "]", "}", "^", "¨", "£", "¤", "%", "*", ",", "?", ";", ".", ":",
                            "/", "!", "§", "<", ">", "»", "«", "\n", "\r", "  ");
    static $replac = " ";
    return str_replace($search,$replac,$string);
  }

  /**
  * Enlève tous les espaces d'une chaine de caractères
  *
  * @param string $element la chaine dont on veut hoter les espaces
  * @param $delimiter le caractère d'implode
  * @return string la chaine sans espaces	 
  */
  static function fullTrim($element,$delimiter="")
  {		
    return implode($delimiter,self::processFunction(explode(' ',$element),'trim'));
  }

}
?>

Et au niveau XSL :

<!--
- Test plus complexe pour appeler des fonctions de classe
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl"
 version="1.0">
  <xsl:output method="html" version="XHTML 1.0" encoding="UTF-8" indent="yes" />
  <xsl:template match="root">
    <html>

      <!-- On utilise le préfixe php pour appeler la fonction de classe stringToUrl() -->
      <xsl:value-of select="php:function('XSL::stringToUrl','une_superstring-àÔ|modifier')" />
      <!-- Output: 'une_superstring ao modifier' -->

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

On peut donc aisément appliquer des transformations PHP à même nos gabarits XSL.

Tags:  phpxmlxsl.
Posté le Lundi 04 mai 2009 17:49:31

Commentaires :

reskp91, le vendredi 12 juin 2009 10:10:33
excellent ! :)