1/ j'ai testé ta transformation, elle me prend 1 seconde.
Ma config : win 2k, php 4, apache 2, libxml2 et libxslt, pentium 2.8Ghz.
Le point essentiel est libxml2 et libxslt. Si tu n'utilises pas encore ces librairies tu peux gagner ici un facteur significatif sur ton temps de traitement (par rapport notamment aux moteurs java, ou à sablotron).
2/ Mais tu gagnerais encore bien plus si tu réécrivais ta transformation de 0. Tu n'es pas du tout dans l'esprit XSLT. S'il faut retenir 2 choses à propos de XSLT :
- template
- récursivité
or il n'y a aucun apply-templates dans ton code et tu ne laisses pas le moteur "récurser" tranquillement.
Ecrite, correctement cette transformation ne prend pas plus d'1 milliseconde, je suis prêt à parier, mais tu imbriques des boucles à n'en plus finir avec des tonnes de tests à l'intérieur. Je suis sur que le moteur se tape des millions de boucles pour rien. Exemple :
<xsl:for-each select="//NS2:TBul_Eleve/listePeriode/item">
...
<xsl:for-each select="//NS2:TBul_Periode">
...
<xsl:for-each select="listeModMat/item">
...
<xsl:for-each select="//*">
<xsl:if test="@id=$modMat">
<xsl:if test="name()='NS2:TBul_Matiere'">
Au 4ème niveau d'imbrication (déjà il faut le faire), tu demandes à revoir l'intégralité du document (select="//*") tout ça pour imbriquer à nouveau 2 tests. Tu ne pourrais pas demander directement l'élément dont tu as besoin ?
Je crois également que ton document XML laisse apparaître que les données qu'il contient sont issues d'une base de données relationnelle. Donc sa structure n'est pas celle d'un document XML natif mais reflète les relations entre tables : c'est très moche. Normalement il faudrait que la couche qui crée ce doc et qui a accès à la souplesse du relationnel en profite pour constituer un doc dont l'esprit est plus XML.
Sinon tu seras obliger pour être propre d'utiliser <xsl:key>, à moins, comme je le crois, que les éléments de description de la structure (du style <listePeriode> <listeModMat> ...) ne soient parfaitement inutiles du fait de la présence des données ensuite.