5 — Analyser
Le débogueur répond à la question « que fait ma feuille de style, instruction par instruction ? ». Ce chapitre en couvre trois autres, qu'on se pose une fois la transformation correcte :
- où passe le temps — quel template coûte réellement, et pourquoi ;
- quels templates servent — et lesquels ne sont jamais déclenchés ;
- d'où vient cette ligne de sortie — quelle instruction XSLT et quel nœud source l'ont produite.
Les deux premières s'appuient sur le profileur, la troisième sur le back-mapping.
5.1 Profiler une transformation
Cliquez sur Exécuter avec le Profiler Saxon (⏱) dans la barre d'outils. Le bouton n'est actif qu'à l'état IDLE — un profilage ne se lance pas pendant une session de débogage.
Le profileur réutilise exactement la configuration de F5 : la feuille de style désignée (ou celle de l'onglet actif), le document XML, les paramètres XSLT et le point d'entrée. Vous mesurez donc bien ce que vous exécutez.
La console trace le run :
--- Lancement du Profiler Saxon ---
XML : C:\...\input.xml
XSLT : C:\...\main.xsl
--- Profilage terminé en 412 ms ---
[profiler] 4 templates profilés, 6 appels au total.
[templates] 4 déclarés, 2 jamais déclenchés sur ce run.
À la fin du run, l'onglet Profileur passe automatiquement au premier plan. L'onglet Templates est renseigné en même temps, par le même run.
Deux différences avec F5
- Le profilage ignore vos points d'arrêt. Il ne s'arrête jamais : s'arrêter fausserait la mesure. Laissez vos points d'arrêt en place, ils ne gênent pas.
- Le profilage n'écrit aucun fichier : ni la sortie principale, ni les fichiers d'un
xsl:result-document. Profiler une feuille ne produit aucun effet de bord sur votre disque. Pour obtenir la sortie, lancez la transformation avec F5.
Les diagnostics du profileur s'affichent dans la console, et non dans le message d'état :
[ERREUR] Profiler : configurez un fichier XSLT via ⚙ ou ouvrez un .xsl dans l'éditeur.,[ERREUR] Profiler : aucun fichier XML trouvé dans le workspace., ou[ERREUR] Profiler : fichier XSLT introuvable — ….
5.2 Lire les points chauds
La partie haute de l'onglet Profileur affiche Points chauds (par temps propre) : un tableau d'une ligne par template ou fonction exécuté, trié par défaut du plus coûteux au moins coûteux, les lignes les plus chaudes étant les plus colorées.
| Colonne | Ce qu'elle donne |
|---|---|
| Template / Fonction | le nom du template nommé, de la fonction, ou le motif d'un template match |
| Emplacement | le fichier et la ligne de sa déclaration |
| Appels | le nombre d'invocations sur ce run |
| Total (ms) | temps inclusif — ce template et tout ce qu'il appelle |
| Propre (ms) | temps propre — ce template seul, hors appelés |
| Moy (µs) | durée moyenne d'un appel |
La distinction Total / Propre est la clé de lecture. Un template racine affiche presque toujours le plus gros Total — il englobe toute la transformation, ce qui n'apprend rien. Le tri par défaut porte donc sur le temps propre : c'est lui qui désigne le coupable réel.
Un en-tête résume le run : 4 templates · 6 appels · 412.0 ms.
Double-cliquez sur une ligne pour ouvrir sa déclaration dans l'éditeur, surlignée en bleu. La touche Entrée sur la ligne sélectionnée fait la même chose. Cliquez sur un en-tête de colonne pour changer le tri — par nombre d'appels, par exemple.
5.3 L'arbre d'appels
Sous les points chauds, Arbre d'appels montre les mêmes mesures dans leur contexte d'appel : la racine à 100 %, puis chaque template appelé avec sa part du temps total.
C'est ce qui distingue deux situations que la table des points chauds confond :
- un template lent en lui-même, appelé une fois ;
- un template rapide appelé cinq mille fois, dont le coût cumulé domine le run.
Le second se repère à sa colonne Appels et à sa place dans l'arbre — sous le xsl:for-each qui
le déclenche.
Double-cliquez sur un nœud pour sauter à la déclaration correspondante.
5.4 Couverture : l'onglet Templates
L'onglet Templates répond à une autre question : tout ce que j'ai écrit sert-il ?
Il liste tous les templates et fonctions déclarés par la feuille de style, modules
xsl:include / xsl:import compris — et non pas seulement ceux qui se sont exécutés.
| Colonne | Contenu |
|---|---|
| État | ✔ vert Déclenché sur ce run / ⚠ orange Jamais déclenché sur ce run |
| Template / Fonction | le nom ou le motif match |
| Mode | le mode du template, s'il en a un |
| Emplacement | fichier et ligne de la déclaration |
| Appels | nombre d'invocations sur ce run |
| Propre (ms) | son temps propre |
Un en-tête résume : 4 déclarés · 2 non déclenchés · 6 appels.
La case Non déclenchés uniquement ne laisse que les lignes ⚠ — la liste de travail directe. Double-cliquez sur une ligne pour ouvrir sa déclaration.
Ce que « jamais déclenché » veut dire — et ne veut pas dire
La couverture est relative au document que vous avez profilé. Un template non déclenché sur
input.xml peut être indispensable à autre.xml.
La méthode qui donne un vrai verdict de code mort : profiler successivement plusieurs documents représentatifs. Ce qui n'est déclenché par aucun d'entre eux est un candidat sérieux.
Chaque run remplace le précédent : les compteurs ne se cumulent pas d'un profilage à l'autre.
Avant tout profilage, les deux onglets affichent leur invite — Lancez le profileur (⏱) pour analyser les performances. et Lancez le profileur (⏱) pour analyser la couverture des templates.
5.5 Remonter de la sortie vers sa source
Vous regardez une ligne du résultat et vous vous demandez qui l'a écrite. Le back-mapping répond en un geste.
Après une transformation en HTML, XML ou Texte, dans l'onglet de sortie :
Ctrl + clic sur une ligne du résultat.
Deux surlignages violets apparaissent aussitôt :
- dans la feuille de style, la ligne de l'instruction XSLT qui a produit cette sortie ;
- dans le document source, la ligne du nœud XML qui servait de contexte à ce moment-là.
La correspondance est établie itération par itération : dans une boucle sur cinq livres,
Ctrl+clic sur la ligne du troisième livre désigne la même instruction, mais le troisième
<book>. Les modules xsl:include / xsl:import sont traversés — l'instruction désignée peut se
trouver dans un autre fichier, qui est ouvert au besoin.
La console confirme la capture à la fin de chaque run :
[Back-mapping] 36 segment(s) capturé(s) — Ctrl+clic dans la sortie pour remonter à la source
Les sorties secondaires produites par xsl:result-document sont mappées comme la sortie
principale : ouvrez-en une depuis l'explorateur, le Ctrl+clic y fonctionne.
Le nœud source surligné est le nœud de contexte de l'instruction, pas nécessairement celui dont la valeur s'affiche. Dans un
xsl:for-each select="book", c'est l'élément<book>de l'itération courante qui est désigné, pas son enfant<title>.
5.6 Le sens inverse : « Voir la sortie générée »
La question symétrique — cette instruction produit-elle vraiment quelque chose, et quoi ? — se pose depuis la feuille de style.
- Clic droit sur une ligne d'un onglet
.xsl. - Voir la sortie générée.
L'onglet de sortie passe au premier plan et toutes les plages produites par cette ligne y sont surlignées — cinq plages si l'instruction s'est exécutée cinq fois.
Si la ligne n'a rien produit — un xsl:message, une instruction jamais atteinte — la console le
dit sans ambiguïté :
[Back-mapping] Aucune sortie générée connue pour cette ligne
C'est un moyen rapide de confirmer qu'une branche xsl:if est bien morte.
5.7 Activer ou couper le back-mapping
Le réglage Back-mapping de la sortie du menu Paramètres l'active ou le coupe. Il est actif par défaut.
Le mapping est capturé pendant la transformation, pas après. Réactiver le réglage n'ajoute donc rien à une sortie déjà produite, et la console le rappelle :
[Back-mapping] Activé — relancez la transformation pour capturer le mapping
Relancez, et le Ctrl+clic redevient opérant.
L'onglet de sortie est refermé et régénéré à chaque exécution, back-mapping actif ou non : ce que vous lisez correspond toujours au dernier run.
5.8 Limites à connaître
- Le back-mapping n'est pas disponible sur l'export PDF. Il couvre les sorties HTML, XML et Texte, principales comme secondaires.
- Une balise ouvrante hérite de la provenance de son premier contenu. Ctrl+clic sur une ligne qui ne porte qu'une balise ouvrante peut donc désigner l'instruction du contenu qui suit.
- Les surlignages portent sur la ligne entière, jamais sur une plage de colonnes : le moteur Saxon-HE ne fournit qu'un point de ligne. Sur une ligne portant plusieurs instructions, le surlignage ne désigne pas laquelle.
- La couverture des templates est relative au document d'entrée (§5.4). Un template inliné par l'optimiseur peut par ailleurs apparaître comme non déclenché alors que son code a bien été exécuté.
- Les temps absolus sont indicatifs : le profilage instrumente le moteur, ce qui coûte un peu. Ce sont les écarts relatifs entre templates qui font foi, et ils sont fiables.
- Le profileur n'écrit aucune sortie : il mesure, il ne produit pas. Utilisez F5 pour obtenir le fichier de résultat.
Et ensuite
- Naviguer & refactorer — définitions, références, renommage, recherche dans le workspace, graphe des includes.
- Déboguer — points d'arrêt, pas-à-pas, inspection.
- Valider & comparer — validation par lot, comparaison structurelle, tests XSpec.