> (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]

Répondre à