Moteur de template xsl utilisant la classe xsltprocessor et domnodes (avec fils)

Description

Bonjour tout le monde !
Je me lance dans une tentative de moteur de template en xml/xsl(t), car légion sont les moteurs de template en mode parseur, mais peu sont ceux en mode xml/xsl :)

Pour instancier la classe, vous avez plusieurs paramètres possibles :
  • le premier, permet de choisir le nom de l'élément racine (de base : root)
  • le second permet de choisir l'adresse du cache (et oui ! ya un cache :))
  • les deux suivants permettes de choisir la version et l'encodage de l'élément XML


Alors, une fois l'élément instancié, il est possible d'ajouter des elements xml de deux manières :
soit par la méthode append (TagName, Content, bCDATA), qui ajoute l'élément xml TagName, contenant Content, en mode CDATA si bCDATA est à true
ou par la méthode appendXml (DOMDocument oDDXml), qui ajoute l'élément DOMDocument oDDXml
La méthode appendXml est la plus agréable à utiliser, car vous pouvez retourner un objet domdocument depuis vos autres classes, et les imbriquer à la suite dans le moteur de template

Une fois le travail terminé, vous n'avez plus qu'a faire
$objetXSLT->transform ('Adresse/nomdufichier.xsl', bShow);

la fonction transform va vérifier dans le cache (si on utilise le cache (parametre $objetXSLT->useCache à true (défault : true))) si le fichier existe
(le fichier est encodé de cette manière sha1($sel.$fileName), biensur, le sel est modifiable : $objetXSLT->salt))

Mais j'ai opté pour une autre manière plus subtile pour la gestion du cache.
Au lieu de s'amuser avec la date du cache, au risque de ne pas être tout de suite à jour, je suis parti sur une autre méthode :
je met l'élément xml, suivi d'un délimiteur, suivit du document xsl transformé.
Quand j'ouvre le fichier en cache, je le découpe par rapport au délimiteur. Si le xml (première partie) et identique à mon xml courant, alors je n'ai pas besoin de transformer le fichier xsl, je n'ai juste qu'à retourner la deuxieme partie du fichier. Sinon je le transforme.

L'avantage de cette méthode, c'est que le cache se gere indépendement. Le désavantage, c'est que j'utilise une fonction d'acces et de lecture au fichier, fonctions en plus comparé une simple vérification de version de fichier.

Voici les propriétés que vous pouvez modifier
$XSLTransform->delimiter = 'Le délimiteur qui sépare le XML du XSLTransformé';
$XSLTransform->salt = 'Le sel qui permet l\'encodage du nom du fichier';
$XSLTransform->extension = 'L\'extension du fichier en cache (sans le point)';
$XSLTransform->useCache = true/false; (Si on utilise le cache ou pas (ca ne sert à rien dans le cas ou, par exemple, on affiche l'heure sur la page en passant par un xml :p)
$XSLTransform->cachePath = 'L\'adresse du cache/';

$XSLTransform->transformOnClose = true/false; (Si on transforme le document à la fermeture (__destruct))
// Dans ce cas, la variable
$XSLTransform->XslPathFile doit contenir l'adresse et le nom du fichier xsl
--> Ces deux derniers paramètres seront remplis lors de l'appel de la fonction
$XSLTransform->transformOnClose ('Adresse et nom du fichier xsl');
(par contre ca ne marche pas, la fonction is_file ne trouve pas le fichier alors qu'il existe, (ca marche pour ->transform et pas pour ca), je ne sais pas pourquoi ! :/)

Voila je vous ai tout dit, je vous laisse voir un exemple, et le code est dans le zip, bien entendu :)

Source / Exemple :


<?php
// On inclu la classe de traitement
require_once ('view/xsltransform.class.php');

// On l'instancie
$xslt = new XSLTransform ('page');

// On prépare un object DOMDocument
$oDom = new DOMDocument ();
$bibli = $oDom->createElement ('bibli');

$rootNode = $oDom->createElement ('mp3');
$rootNode->appendChild ($oDom->createElement('artiste', 'artiste1'));
$rootNode->appendChild ($oDom->createElement('titre', 'titre1'));
$bibli->appendChild ($rootNode);

$rootNode = $oDom->createElement ('mp3');
$rootNode->appendChild ($oDom->createElement('artiste', 'artiste2'));
$rootNode->appendChild ($oDom->createElement('titre', 'titre2'));
$bibli->appendChild ($rootNode);

$rootNode = $oDom->createElement ('mp3');
$rootNode->appendChild ($oDom->createElement('artiste', 'artiste3'));
$rootNode->appendChild ($oDom->createElement('titre', 'titre3'));
$bibli->appendChild ($rootNode);

$oDom->appendChild ($bibli);
// Objet qui sera du type <bibli><mp3><artiste>xxx</artiste><titre>yyy</titre></mp3><mp3>...</mp3>....</bibli>
// (pour l'exemple :) )

// On l'ajoute à notre objet
$xslt->appendXml ($oDom);

// Et on le transforme
echo $xslt->transform ('test.xsl');

// On peux aussi faire $xslt->transform ('test.xsl', true);
// Ce qui affichera tout seul le résultat
?>

Conclusion :


N'hésitez pas à me proposer des modifications, des optimisations, je suis à votre écoute :)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.