Ét.Nadji.fr/

Du code, des mots, des livres.

Utiliser Vim comme éditeur XML/XSL(T)

03/12/2015 à 08h

Dans le cadre de mes études à l’Université de Bretagne-Sud, je dois manipuler des fichier XML, écrire des feuilles de transformation XSLT1 L’université utilise Oxygen et Xmlcopyeditor; pour ma part, si je n’ai pas à utiliser la chère usine à gaz qu’est Oxygen (198€ pour un usage personnel), je préfère Vim à Xmlcopyeditor.

Ce billet liste donc des modifications possibles dans la configuration de Vim pour le rendre plus agréable pour éditer du XML/XSL. Il n’a pas pour but d’apprendre à utiliser Vim et ses principes de fonctionnement.

Utiliser Vim comme éditeur XML/XSL(T)

Sommaire

  1. Options générales
    1. Les tabulations
    2. Les replis
  2. Modèles
  3. Utiliser XPath
    1. Installer vim-xpath
    2. Utiliser vim-xpath
  4. Snippets
  5. Effectuer une transformation XSLT

Options générales

Les tabulations

En premier lieu, il peut être utile de définir la taille d’une tabulation à deux espaces, au lieu des 4 espaces traditionnellement utilisés en programmation.

Dans un langage de programmation, une tabulation large de 4 espaces ne pose pas de problèmes tant que le code est bien organisé. Mais avec le format XML, on peut manipuler des structures de données très imbriquées, du fichier XML de configuration sans schéma défini au fichier XML de 10.000 lignes utilisant un schéma de la Text Encoding Initiative. Puisque la complexité de la représentation de l’information est à ce point variable, définir une taille de tabulation à deux espaces est un bon compromis.
au filetype xml set sw=2

Les replis

Le repli de lignes peut être manuel, ce qui est très bien quand on crée à la main un fichier XML, ou être automatique, en utilisant l’indentation. C’est ce que je préfère personnellement: si le fichier XML est bien conçu, il devient très simple de naviguer dedans. Autrement, les replis peuvent paraître parfois… aléatoires.

au filetype xml set foldmethod=indent

Modèles

On peut utiliser des autocommandes pour insérer un modèle dans un nouveau fichier XML /  XSL.

au bufNewFile *.xml 0r ~/.vim/templates/xml
au bufNewFile *.{xsl,xslt} 0r ~/.vim/templates/stylesheet.xsl

Ajustements pour XSLT

Si Vim détecte sans problème le type de fichier d’un fichier XML, il n’en est pas de même pour un fichier XSL. Il faut donc demander à Vim de traiter un fichier XSL comme un fichier XML.

au bufNewFile,BufRead *.{xsl,xslt} set filetype=xml

Utiliser XPath

Get //child:: the things

Pour naviguer dans le fichier XML avec l’aide d’XPath, on peut créer ses propres fonctions en VimL, ou utiliser le plugin vim-xpath d’actionshrimp.

Installer vim-xpath

Vim-Plug

Plug 'actionshrimp/vim-xpath'

Vundle

Bundle 'actionshrimp/vim-xpath'

Utiliser vim-xpath

En utilisant le buffer du fichier XML dans lequel la recherche doit s’effectuer, on utilise la commande :XPathSearchPrompt. Ceci ouvre deux nouveaux buffers, un pour taper l’expression XPath, un autre qui affiche les résultats et permet de naviguer parmi-eux.

Snippets

Les snippets permettent d’insérer rapidement des modèles de code. Actuellement, le plugin pour Vim le plus avancé dans ce domaine est Ultisnips.

GIF Ultisnips
Ultisnips en action avec un code-source en Python

Installer Ultisnips

Ultisnips est fourni sans snippets. Il faut également les installer.

Vim-Plug

Plug 'SirVer/ultisnips'
Plug 'honza/vim-snippets'

Vundle

Bundle 'SirVer/ultisnips'
Bundle 'honza/vim-snippets'

Utiliser Ultisnips

Le format XML étant particulièrement divers, le fichier fourni par honza ne propose que des snippets de base: création d’une balise, etc.

Avec ces fichiers, on peut étendre Ultisnips assez bien2.

Par contre, il s’agit de mes propres snippets, donc tous les fichiers ne sont pas à utiliser avec du XML. Il y a un README pour une raison.

Effectuer une transformation XSLT

Pour effectuer une transformation XSLT, il faut installer un logiciel approprié tel que xmlstarlet, Xalan ou encore Saxon, et l’utiliser dans une commande.

Ma préférence va vers xmlstarlet, qui a des fonctionnalités plus diverses.

Des exemples3 avec respectivement Xalan, xmlstarlet, Saxon 6 et Saxon 8 HE4 :

:!Xalan -o %:r.html % style.xsl
:!xml tr -o style.xsl % > %:r.html
:!java -jar /usr/share/java/saxon6/saxon.jar -o %:r.html % style.xsl
:!java -jar /usr/share/java/saxon/saxon.jar -o:"%:r.html" % style.xsl

Bien entendu, il est possible d’effectuer ce genre de commande dans une fonction et affecter cette fonction à une touche.

Notes

  1. Par exemple, nous transformons ce dictionnaire en TEI. Et bon sang, vive UTF-8 qui comprend les s longs!  
  2. Je dis « assez bien » parce qu’ils sont certainement améliorables, et même pour le cas des snippets de la TEI, incomplets. Il faut dire que la TEI possède un nombre de balises monstrueux, et qu’un document TEI n’exploite ordinairement qu’une portion du schéma TEI global.  
  3. Ici, % correspond au nom du buffer courant, et %:r correspond au nom du buffer sans son extension. Il est peu probable que le fichier XSL ait le même nom que le fichier XML  
  4. Saxon 6 gère XSLT 1, Saxon 8 HE XSLT 2 et ultérieurs. Et ils n’ont pas la même syntaxe en ligne de commande. Et c’est n’importe quoi.  

Sources

Commentaires

Pour commenter ce billet, envoyez un mail sur etnadji (at) eml.cc, ou créez-vous votre blog.