Manuel

4 — Déboguer une transformation XSLT

C'est la raison d'être de Debug XML Tool : arrêter une transformation en cours d'exécution, regarder ce que fait réellement le processeur, et avancer instruction par instruction.

Là où un xsl:message vous dit qu'il s'est passé quelque chose, le débogueur vous montre où vous êtes, comment vous y êtes arrivé, et ce que valent vos variables à cet instant précis.

Ce chapitre suppose que vous savez lancer une transformation (voir Prise en main).


4.1 Poser un point d'arrêt

Cliquez dans la marge, à gauche du numéro de ligne, en face de l'instruction où vous voulez que l'exécution s'arrête. Un point rouge apparaît. Cliquez à nouveau pour le retirer.

Posez vos points d'arrêt sur des instructionsxsl:value-of, xsl:for-each, xsl:if, xsl:call-template, xsl:apply-templates. Une ligne qui ne porte aucune instruction exécutable (ligne vide, commentaire, balise fermante) ne sera jamais atteinte.

Les points d'arrêt sont liés à leur fichier. Vous pouvez donc en poser dans une feuille principale et dans les modules qu'elle inclut par xsl:include ou xsl:import : chacun sera respecté dans son propre fichier.

Points d'arrêt conditionnels

Sur un xsl:for-each qui itère cinq mille fois, s'arrêter à chaque tour n'a aucun intérêt. Un point d'arrêt conditionnel ne déclenche que lorsqu'une expression XPath est vraie.

  1. Clic droit sur un point d'arrêt existant (sur le point lui-même, dans la marge).
  2. Le dialogue « Condition XPath (vide = toujours) » s'ouvre.
  3. Saisissez l'expression — par exemple @id = '3', ou price > 50 — puis OK.

Le point passe du rouge à l'orange : il est désormais conditionnel.

La condition est évaluée dans le contexte de l'instruction, exactement comme si vous l'écriviez à cet endroit de la feuille de style. Elle est compilée une seule fois puis réutilisée : une condition sur une boucle de dix mille tours ne pénalise pas l'exécution.

Pour revenir à un point d'arrêt normal, rouvrez le dialogue et cliquez Supprimer condition.

Une condition qui ne s'évalue pas (expression invalide, contexte inattendu) est traitée comme fausse : l'exécution continue sans s'arrêter. Vérifiez votre expression dans l'évaluateur XPath si un point d'arrêt conditionnel semble ignoré.


4.2 Démarrer le débogage

Appuyez sur F5, ou cliquez sur Lancer la transformation (▶).

Il n'y a pas de « mode débogage » distinct : la transformation ordinaire est la session de débogage. Si aucun point d'arrêt n'est posé, elle s'exécute d'un trait.

Le badge d'état de la barre d'outils indique en permanence où vous en êtes :

BadgeSignificationBoutons actifs
IDLEaucune exécution en coursLancer, Profileur
RUNNINGtransformation en coursArrêter
PAUSEDarrêtée sur un point d'arrêttout le pas-à-pas, Reprendre, Arrêter

Quand l'exécution s'arrête, la ligne se surligne en jaune dans l'éditeur, le fichier concerné est mis au premier plan, et les panneaux d'inspection se remplissent.


4.3 Avancer pas à pas

Cinq commandes, disponibles au clavier et dans la barre d'outils. Toutes n'ont de sens qu'à l'arrêt (PAUSED).

CommandeToucheComportement
ReprendreF8repart jusqu'au prochain point d'arrêt, ou jusqu'à la fin
Step OverF10exécute la ligne courante sans entrer dans les templates qu'elle appelle
Step IntoF11entre dans le template ou la fonction appelée
Step OutShift+F11termine le template courant et s'arrête chez l'appelant
Exécuter jusqu'au curseurCtrl+F10repart et s'arrête à la ligne où se trouve votre curseur

Ce qu'il faut savoir

Vos points d'arrêt restent actifs pendant un pas-à-pas. Un Step Over qui survole un template contenant un point d'arrêt s'y arrêtera. C'est voulu : un point d'arrêt posé n'est jamais ignoré silencieusement.

« Exécuter jusqu'au curseur » ne pose pas de point d'arrêt permanent. Placez le curseur sur la ligne visée, appuyez sur Ctrl+F10 : l'exécution reprend et s'arrête là, une fois. Rien n'est laissé dans la marge. C'est le moyen le plus rapide d'atteindre un endroit précis sans polluer vos points d'arrêt.

Step Over et Step Into diffèrent par la profondeur, pas par la ligne. Sur un <xsl:call-template name="format-price">, Step Into vous emmène dans format-price ; Step Over exécute l'appel entier et vous ramène à la ligne suivante du template courant.


4.4 Inspecter l'état à l'arrêt

Quatre panneaux, tous dans le bandeau du bas, se mettent à jour à chaque arrêt.

Variables

Deux sections :

  • NŒUD COURANT — le nœud XML sur lequel porte l'instruction : son nom, son type, son chemin et sa valeur. C'est la réponse à « où suis-je dans le document source ? ».
  • VARIABLES — les variables et paramètres XSLT visibles à cet endroit, avec leur valeur.

Hors pause, le panneau indique Aucune variable — le débogueur n'est pas en pause. À l'arrêt, s'il n'y a réellement aucune variable dans la portée courante, il affiche Aucune variable dans ce contexte — deux situations distinctes, volontairement distinguées.

Pile d'appels

La chaîne des templates et fonctions qui ont mené jusqu'au point d'arrêt, du plus récent au plus ancien.

Chaque ligne affiche sa position d'exécution réelle : pour le sommet de la pile, la ligne où vous êtes arrêté ; pour un appelant, la ligne d'où part l'appel — le xsl:call-template ou xsl:apply-templates concerné, et non la ligne de déclaration du template. C'est la sémantique standard d'un débogueur : vous voyez le chemin parcouru, pas la table des matières.

Double-cliquez sur une ligne pour ouvrir le fichier correspondant et surligner cette position.

Hors pause : Aucune pile d'appels — le débogueur n'est pas en pause.

Évaluateur XPath

Le panneau XPath Evaluator évalue une expression sur votre document. À l'arrêt, il bascule automatiquement dans le contexte vivant de la pause : un badge DEBUG affiche le nœud courant (par exemple DEBUG — /catalog/book[1]), et vos expressions s'évaluent exactement comme si elles étaient écrites à cet endroit de la feuille de style.

Vous pouvez donc y tester @id, ../title, count(following-sibling::book) — tout ce dont vous avez besoin pour comprendre pourquoi votre xsl:if ne se déclenche pas.

  • Saisissez l'expression, validez par Entrée.
  • Les résultats de type nœud sont cliquables : un double-clic ouvre le fichier source et surligne la ligne d'origine en bleu.
  • ↑ / ↓ rappellent vos expressions précédentes ; Ctrl+Espace ouvre l'historique complet.

Hors débogage, le panneau évalue sur le document XML de la transformation courante. Tant qu'aucune transformation n'a été lancée, il indique Aucun fichier XML configuré dans la transformation — lancez une fois la transformation pour le renseigner.

Watch XPath

L'évaluateur répond à une question ponctuelle. Le panneau Watch XPath répond à la même question à chaque arrêt, automatiquement.

  • Saisissez une expression dans le champ « Ajouter une expression XPath… » et validez.
  • À chaque pause — point d'arrêt ou pas-à-pas — toutes les watches actives sont réévaluées dans le contexte courant.
  • La case à cocher de chaque ligne active ou désactive sa réévaluation.
  • Pendant l'exécution, les valeurs affichées sont grisées : elles datent du dernier arrêt.
  • Un clic sur une valeur de type nœud navigue vers sa source.
  • Le clic droit propose Supprimer, Copier l'expression, Copier la valeur.

La liste est conservée par workspace et survit au redémarrage de l'application : vos expressions de surveillance habituelles sont là au prochain lancement.


4.5 Arrêter

Shift+F9, ou le bouton Arrêter. L'exécution est interrompue immédiatement, le badge revient à IDLE, les panneaux d'inspection se vident et le surlignage jaune disparaît.

Vos points d'arrêt, eux, restent en place pour la session suivante.


4.6 Exemple complet

Soit une feuille de style qui met en forme un catalogue de cinq livres, avec un template nommé pour le prix :

XML
<xsl:template match="/">
    <xsl:for-each select="catalog/book">
        <tr>
            <td><xsl:value-of select="@id"/></td>
            <td>
                <xsl:call-template name="format-price">
                    <xsl:with-param name="price" select="price"/>
                </xsl:call-template>
            </td>
        </tr>
    </xsl:for-each>
</xsl:template>

Objectif : comprendre pourquoi le prix du troisième livre s'affiche mal.

  1. Posez un point d'arrêt sur la ligne <xsl:call-template name="format-price">.
  2. Clic droit dessus, condition position() = 3, OK. Le point passe à l'orange.
  3. F5. L'exécution s'arrête directement à la troisième itération — les deux premières sont passées sans interruption.
  4. Le panneau Variables montre le nœud courant /catalog/book[3]. Dans l'évaluateur XPath, tapez price pour lire la valeur réellement transmise.
  5. F11 (Step Into) entre dans format-price. La pile d'appels affiche maintenant deux niveaux : format-price au sommet, et en dessous le template racine positionné sur la ligne de l'appel.
  6. Inspectez le paramètre $price dans Variables. S'il ne vaut pas ce que vous attendiez, le problème est dans le xsl:with-param ; sinon, il est dans format-price.
  7. Shift+F11 (Step Out) vous ramène chez l'appelant, F8 passe au livre suivant s'il y a lieu, Shift+F9 met fin à la session.

4.7 Limites à connaître

  • Le surlignage cible la ligne entière, jamais 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.
  • Le débogage impose le traçage au processeur XSLT et désactive ses optimisations. Une transformation lancée avec des points d'arrêt est donc plus lente qu'en exécution simple — c'est attendu, et sans effet sur le résultat produit.
  • Le moteur est Saxon-HE : les transformations schema-aware et le streaming des éditions Professional/Enterprise ne sont pas disponibles.
  • Un point d'arrêt sur une ligne non exécutable n'est jamais atteint. Si un point d'arrêt reste muet, vérifiez qu'il porte bien sur une instruction, et que le fichier concerné participe réellement à la transformation lancée.

Et ensuite

  • Analyser — profileur, couverture des templates, et retour de la sortie vers l'instruction qui l'a produite.
  • Transformer & exporter — formats de sortie, paramètres, scénarios réutilisables.
  • Valider & comparer — vérifier qu'une sortie n'a pas changé, tester une feuille de style avec XSpec.
  • Référence — tous les raccourcis, boutons, menus et gestes, en tables.

Sommaire du manuel