Les petites cases

Traiter un espace de nom par défaut avec XSLT 1.0

Il fait vraiment trop chaud pour bloguer, mais je vais faire un effort ce soir pour honorer une promesse que j'ai faite dans la journée. En guise de billet, je vous propose une petite astuce pour gérer en XSLT 1.0 les espaces de noms (namespaces) par défaut. J'ai mis deux bonnes heures avant de trouver la solution, cela évitera à d'autres de perdre autant de temps et d'après l'expérience de la journée, d'autres connaissent le même problème.

Le problème se pose clairement avec la nouvelle version de la TEI, la P5. Comme la grammaire est définie par un XML schéma ou un Relax NG, l'élément racine comprend un espace de noms par défaut : <TEI xmlns="http://www.tei-c.org/ns/1.0">.

Si on applique une feuille de style XSLT 1.0 à un document XML de ce genre, la première réaction est de former les expressions Xpath normalement, par exemple /TEI/teiHeader/fileDesc/titleStmt/title. Dans ce cas, vous aurez la désagréable surprise de constater que cette expression ne fonctionne pas. Ne vous énervez pas ! C'est normal. Il n'est pas prévu de gérer les espaces de noms par défaut en XSLT 1.0. XSLT 2.0 le prévoit, mais cette version n'est qu'au stade de candidate recommandation et n'est donc pas implémenté dans tous les parsers.

Mais, rassurez-vous, il existe une solution. Dans l'élément racine de la feuille de style XSL, vous définissez l'espace de noms tei avec la même URI définie dans le fichier XML, ce qui donne : <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tei="http://www.tei-c.org/ns/1.0" version="1.0">. Dans ce cas, les expressions Xpath auront cette forme tei:TEI/tei:teiHeader/tei:fileDesc/tei:fileDesc/tei:title. Et, là miracle (enfin, non, c'est juste de l'informatique), tout fonctionnera parfaitement. L'espace de noms doit être indiqué seulement pour les éléments, il n'est pas requis pour les attributs. Si jamais vous avez un problème qui apparaît, vérifiez que l'espace de noms est bien présent pour tous les éléments, on a tendance à les oublier et à s'énerver sans trouver la cause du problème, alors qu'il est juste là sous notre nez (ce genre d'erreurs bêtes fait perdre un temps infini quand on programme, nous l'avons tous vécu...).

Voilà, c'était l'astuce du jour et promis, je vais finir par reprendre l'écriture régulière de billets surtout que la journée m'a aussi démontré qu'il fallait que je termine ma série sur la conservation du document numérique...

Édition électronique TEI XSLT Geekeries — 

Commentaires

Comme on dit dans ces cas-là : merci ! ;)
Bonjour, J'ai exactement le souci et la méthode de ce billet ne fonctionne pas. Seule différence, mon fichier TEI référence une DTD, et pas un schema RelaxNG... Une idée ?
Comme ça, là, je ne vois pas. A-priori, je ne vois pas en quoi la différence de syntaxes pour exprimer le schéma poserait un problème, le système des espaces de noms est le même. Vous avez bien précisé l'espace de nom pour tous les éléments dans les expressions XPath ? Si vous voulez et que vous coincez, je peux jeter un coup d'œil sur vos fichiers, envoyez-les moi par mail.
Mon problème est réglé (c'était en fait un problème de validation XML). Par contre, j'ai de nouveau un souci. Ma feuille de style fonctionne sur des fichiers utilisant la déclaration : ... Mais elle ne fonctionne plus avec des versions TEI plus anciennes , comme par exemple : ... Suis-je obligé d'avoir des feuilles de style, une pour chaque cas (mon soucis vient du fait que je ne sais pas à l'avance le format TEI en entrée) ?