Manuel

6 — Naviguer & refactorer

Dès qu'une feuille de style dépasse quelques centaines de lignes et se répartit sur plusieurs modules xsl:include / xsl:import, la question n'est plus « que fait ce template ? » mais :

  • où est-il déclaré ?
  • qui l'appelle ?
  • que se casse-t-il si je le renomme ?

Ce chapitre couvre les cinq outils qui y répondent : aller à la définition, chercher les références, renommer, rechercher-remplacer dans tout le workspace, et lire le graphe des modules.

Les trois premiers ne fonctionnent que sur les onglets .xsl / .xslt : ils comprennent le vocabulaire XSLT, ils ne cherchent pas du texte.


6.1 Aller à la définition

Placez le curseur sur un symbole et appuyez sur F12. Ou, sans toucher au clavier : Ctrl + clic directement sur le symbole. Le menu contextuel de l'éditeur propose la même chose, sous Aller à la définition.

Le fichier de déclaration s'ouvre et le nom exact est sélectionné.

Quatre familles de symboles sont reconnues :

SymboleExemple de curseur
Template nommé<xsl:call-template name="format-price">
Fonctionmy:format($price)
Variable / paramètre$price, $devise
Modemode="resume"

Trois comportements à connaître :

  • la navigation traverse la clôture xsl:include / xsl:import, dans les deux sens : un template appelé depuis le module A et déclaré dans le module B est atteint ;
  • la portée est respectée : sur un $price local à un template, F12 mène à la déclaration locale, pas à une variable globale homonyme ;
  • elle travaille sur ce que vous voyez, y compris non enregistré : un template ajouté il y a trois secondes est déjà navigable.

Si le curseur n'est sur aucun symbole — un commentaire, du texte libre — le geste est inerte : rien ne s'ouvre, aucune erreur n'apparaît.

Quand plusieurs déclarations sont candidates

Si le symbole peut renvoyer à plusieurs déclarations, l'application ne choisit pas à votre place : l'onglet Références s'ouvre avec l'en-tête format-price — 2 déclaration(s) candidate(s) et une rangée Déclaration ligne N par candidate. Cliquez celle qui vous intéresse.

Les templates match ne sont volontairement pas couverts. Le template appliqué à un nœud se décide à l'exécution, selon le motif, le mode et la priorité : aucune analyse statique ne peut honnêtement répondre. C'est le débogueur qui donne la réponse, en s'arrêtant dans le template réellement retenu.


6.2 Trouver toutes les références

Shift+F12 sur un symbole — ou Rechercher les références dans le menu contextuel — remplit l'onglet Références du panneau bas, qui passe au premier plan.

L'en-tête annonce le compte : format-price — 2 référence(s). En dessous, les occurrences sont groupées par fichier, chacune avec son numéro de ligne et un extrait.

Un simple clic sur une occurrence ouvre le fichier et sélectionne le nom — pas besoin de double-cliquer.

Le geste fonctionne aussi bien depuis la déclaration que depuis n'importe lequel de ses appelants : le résultat est le même.

Deux cas particuliers :

  • aucun usage → Aucune référence pour « … ». — un template nommé jamais appelé, par exemple ;
  • une occurrence homonyme appartenant à un autre graphe de modules est signalée Hors clôture include/import. Elle est montrée, mais elle ne désigne pas le même symbole.

Avant tout usage, le panneau affiche Aucune référence à afficher.


6.3 Renommer un symbole

Renommer un template à la main, c'est chercher ses appels un par un et en oublier un. F2 — ou Renommer le symbole dans le menu contextuel — le fait à travers tous les modules concernés.

Le dialogue Renommer « format-price » s'ouvre.

Le dialogue

ÉlémentRôle
Nouveau nom :le champ de saisie, validé au fil de la frappe
2 occurrence(s) dans 2 fichier(s)l'ampleur exacte du changement
Prévisualisationl'arbre des occurrences, par fichier — ligne 8 · déclaration, ligne 30
Renommerapplique ; désactivé tant que le nom saisi est invalide

Un nom refusé bloque le bouton et affiche pourquoi : Nom invalide (NCName attendu, sans « : »), Nom réservé interdit (#all, #default), ou Le nouveau nom est identique à l'ancien.

Des avertissements, eux non bloquants, apparaissent le cas échéant :

  • ⚠ « format-money » existe déjà dans la clôture (conflit possible) — à vous de juger ;
  • ⚠ main.xsl est modifié non enregistré (édité en mémoire — sauvegardez après le rename) ;
  • ⚠ Hors clôture — non renommées (N) — un groupe en fin de prévisualisation, sous-groupé par fichier, qui liste nommément les occurrences homonymes d'un autre graphe de modules. Elles vous sont montrées précisément parce qu'elles ne seront jamais touchées.

Ce qui est renommé

La déclaration et toutes ses références, dans toute la clôture xsl:include / xsl:import — templates nommés, fonctions, variables et paramètres (portée respectée), modes.

Renommer un xsl:param met aussi à jour les xsl:with-param des appelants : pas de rupture silencieuse au prochain run.

Ce qui se passe à la validation

Les fichiers ouverts dans un onglet sont modifiés dans l'éditeur : l'onglet devient modifié « • », et un seul Ctrl+Z annule tout le renommage de cet onglet — après quoi l'onglet redevient propre.

Les fichiers fermés sont réécrits directement sur le disque.

La console rend compte des deux :

Renommé « format-price » → « format-money » : 2 occurrence(s), 2 fichier(s) (dont 1 sur disque)

Le renommage est tout-ou-rien : si un fichier a changé entre l'ouverture du dialogue et la validation, rien n'est écrit et la console affiche Fichier en cours de modification — réessayez. Vous n'obtiendrez jamais un renommage à moitié appliqué.

Attention à l'annulation. Ctrl+Z n'annule que les onglets ouverts. Les fichiers fermés réécrits sur disque ne sont pas restaurés. Sur un renommage large, ouvrez d'abord les fichiers concernés — la prévisualisation vous les nomme — ou travaillez sous contrôle de version.

Sur un paramètre, positionnez-vous sur une référence ($price dans le corps du template) plutôt que sur sa déclaration : F2 y est inerte.


6.4 Chercher dans tout le workspace

Ctrl+Shift+F amène l'onglet Recherche au premier plan et place le curseur dans le champ Rechercher dans les fichiers…. Tapez, validez par Entrée.

Les résultats arrivent groupés par fichier, avec le compte en clair : 17 résultat(s) dans 5 fichier(s).

Trois bascules affinent la recherche ; changer l'une d'elles relance immédiatement :

BasculeEffet
Respecter la casseBook ne trouve plus book
Mot entierbook ne trouve plus bookstore
Expression régulièrela saisie devient une regex — id="\d"

Un simple clic sur une correspondance ouvre le fichier et sélectionne le texte trouvé.

Réponses possibles du panneau :

  • Aucun résultat ;
  • Erreur d'expression : … — une regex mal formée, une parenthèse non fermée ;
  • Saisissez un terme et appuyez sur Entrée — avant toute recherche.

Deux points de comportement importants :

  • la recherche porte sur les mêmes fichiers que l'explorateur — ni vos images, ni vos dossiers cachés ;
  • elle porte sur le contenu courant, pas sur le disque : les buffers des onglets ouverts priment. Une modification non enregistrée est donc trouvée, et une occurrence effacée en mémoire n'est plus listée.

6.5 Remplacer dans les fichiers

Le remplacement se déplie depuis le même panneau.

  1. Cliquez le chevron ▸ à gauche du champ de recherche : la rangée Remplacer par… apparaît.
  2. Saisissez le texte de remplacement. La prévisualisation se met à jour dans les résultats : l'ancien texte barré en rouge, le nouveau en vert. Aucun fichier n'a encore été touché.
  3. Cliquez Remplacer tout — le bouton n'est actif que s'il y a des résultats.
  4. Confirmez : Remplacer 3 occurrence(s) dans 2 fichier(s) ? Si des onglets non enregistrés sont concernés, le dialogue les liste sous Des onglets non enregistrés seront modifiés :.

Le bilan part en console, et les résultats sont recalculés :

Remplacé : 3 occurrence(s) dans 2 fichier(s) (dont 1 sur disque)

Remplacement par expression régulière

Avec Expression régulière cochée, le texte de remplacement accepte les groupes capturés : chercher (\d+)-(\d+) et remplacer par $2/$1 permute les deux nombres.

Une référence à un groupe qui n'existe pas est refusée en bloc : Expression de remplacement invalide, et aucun fichier n'est modifié. Comme le renommage, le remplacement est tout-ou-rien.

Où le remplacement s'applique

Exactement comme le renommage : buffer pour les onglets ouverts — un Ctrl+Z annule tout le remplacement dans cet onglet —, disque pour les fichiers fermés, non annulable.

Un remplacement trop large est refusé plutôt que tronqué : Trop d'occurrences à remplacer (plafond atteint). Affinez la recherche et recommencez.


6.6 Voir le graphe des includes et imports

Quels modules cette feuille tire-t-elle réellement ? Et si je modifie celui-ci, qui casse ?

Clic droit dans l'explorateur sur un .xsl, un .xslt ou un .xsdHiérarchie/dépendances. L'onglet Hiérarchie du panneau bas s'ouvre.

Deux sens, deux boutons :

BoutonQuestion poséeEn-tête
Hiérarchiece que ce fichier inclut, en cascadea.xsl — 3 inclusion(s) directe(s)
Dépendancesqui inclut ce fichierbase.xsl — 2 dépendance(s) directe(s)

Un bouton rafraîchir recalcule l'arbre.

Chaque rangée porte un badge include ou import, le nom du fichier et le numéro de ligne de la directive. Double-cliquez : le fichier porteur de la directive s'ouvre à la ligne de cette directive — pas le fichier cible. C'est ce qu'il faut pour corriger un chemin.

Trois signalements :

  • (introuvable) suivi du chemin brut — la cible n'existe pas. Le double-clic reste utile : il vous emmène sur la directive fautive ;
  • (cycle) — la branche reboucle sur un fichier déjà traversé ; elle est marquée et non développée ;
  • un xs:import sans schemaLocation est étiqueté par son espace de noms.

La vue couvre XSL ↔ XSL et XSD ↔ XSD.


6.7 Le plan de la feuille de style

Pour se déplacer à l'intérieur d'un fichier plutôt qu'entre fichiers, le panneau de droite affiche le plan de la feuille active — templates match, templates nommés, fonctions, variables/params globaux, clés, modules — et le double-clic y sélectionne le nom.

Il est décrit au chapitre L'interface §1.5. À retenir ici : il suit votre frappe, sans enregistrement.


6.8 Limites à connaître

  • La navigation par symboles ne concerne que les onglets .xsl / .xslt. Sur un .xml ou un .xsd, F12, Shift+F12 et F2 sont sans effet.
  • Les templates match en sont exclus (§6.1) : leur résolution est l'affaire du débogueur.
  • Le renommage ne sort jamais de la clôture xsl:include / xsl:import. Les homonymes des autres modules vous sont listés, mais jamais modifiés.
  • Renommage et remplacement ne sont annulables que dans les onglets ouverts. Les fichiers fermés sont réécrits sur disque sans undo applicatif.
  • La recherche ignore les fichiers de plus de 2 Mo et ceux qui ne sont pas lisibles en UTF-8. Au-delà de 5 000 résultats, l'affichage est tronqué et le signale — limite atteinte.
  • La hiérarchie ne croise pas les types : un graphe XSL et un graphe XSD restent séparés.

Et ensuite

  • Analyser — profileur, couverture des templates, back-mapping.
  • Valider & comparer — validation par lot, comparaison structurelle, tests XSpec.
  • Référence — tous les raccourcis, boutons, menus et gestes, en tables.
  • Éditer — complétion, formatage, validation au fil de la frappe.

Sommaire du manuel