> (le 1er conseil de perf en XSL
> semble etre d'eviter les variables...)
A ma connaissance, le nombre de variables pose peu de problèmes en XSL,
du moins beaucoup moins que par exemple des templates récursifs mal
pensés, d'autant plus que l'algorythme de cache de cocoon est ici
puissant, il sait conserver tous les états différents d'une
transformation selon chaque valeurs que peuvent prendre des paramètres.
Evidemment, cela dépends des valeurs passées, s'il s'agit par exemple du
nom de la personne connectée, différent pour chacun, cela n'aurait pour
effet que de multiplier les versions conservées.
> Mon idee aujourd'hui est d'ajouter ceci dans ma XSL :
> <cinclude:include src="cocoon://stylesheets/header"/>
Pour faire une xsl dynamique ? Alors là il faut oublier toute
possibilité de cache.
Par contre il est possible de mettre en générateur d'entrée à cette
transformation un <map:aggregate> qui donne le matériel nécessaire à
transformer. L'algorythme de cache fonctionne sans problème à cet
endroit, du moins, cocoon détermine selon les URIs en entrée ce qui peut
être cacheable pour la suite. cinclude ou xinclude peuvent désormais
fonctionner aussi de même, cependant, il est parfois plus difficile
d'avoir une vue claire des tuyaux à l'oeuvre, puisque à l'intérieur
d'une xsl ou d'un générateur xml, contrairement à un aggregate dans un
sitemap.
Pour régler ce genre de problème, j'adopte généralement la logique suivante.
Poursuivre le plus longtemps possible des tuyaux droits sur du statique,
rendus cacheable, par exemple, une transformation complexe de
présentation sur une source xml est générée dans son tuyau, de manière à
conserver un état xhtml cacheable qui est par la suite aggrégée.
J'isole les morceaux dynamiques dans des tuyaux à part, sachant
qu'aucune cache ne peut être attendue.
Enfin, l'assemblage final est effectué avec une seule xsl sur un
map:aggregate, sachant qu'à cet endroit aucune cache n'est à attendre,
cette transformation s'occupe par exemple d'aller réécrire des liens
selon le contexte. Il en résulte quelque chose de ce genre
<!-- Attrape tout ce qui est demandé en .html -->
<map:match type="regexp" pattern="(.*/)?(.*)\.html">
<map:aggregate element="aggregate">
<!-- un template de page statique -->
<map:part src="cocoon:/theme/modele.xhtml" element="modele"/>
<!-- la part cacheable du contenu présenté, qui réponds à une url
de convenance .xhtml -->
<map:part src="cocoon:/{1}{2}.xhtml" element="contenu"/>
<!-- une barre de côté personnalisée avec nom, prénom, paramètre
etc -->
<map:part src="cocoon:/{1}menu.xhtml" element="menu"/>
</map:aggregate>
<!-- la transformation d'assemblage, avec différentes infos de
contexte utiles -->
<map:transform src="transform/presentation/presentation.xsl">
<map:parameter name="home" value="{baselink:SitemapBaseLink}"/>
<!-- liens pour css et images -->
<map:parameter name="theme" value="{baselink:SitemapBaseLink}theme/"/>
</map:transform>
<!-- langue de l'utilisateur pour les messages i18n -->
<map:act type="locale">
<map:transform type="i18n">
<map:parameter name="locale" value="{locale}"/>
</map:transform>
</map:act>
<map:serialize type="xhtml"/>
</map:match>
En souhaitant que ces habitudes puissent donner des pistes.
--
Frédéric Glorieux (AJLSM, http://ajlsm.com)
---------------------------------------------------------------------
Liste francophone Apache Cocoon -- http://cocoon.apache.org/fr/
Pour vous desinscrire : mailto:[EMAIL PROTECTED]
Autres commandes : mailto:[EMAIL PROTECTED]