Cliquez ici.
Accueil
 chercher             Plan du site             Info (English version) 
L'histoire de XML s'écrit en ce moment même. XMLfr vous aide à la suivre et à en dégager les tendances.Les listes de discussions XMLfr sont à votre disposition pour réagir sur nos articles ou simplement poser une question.Si vous ètes passionnée(e) par XML, pourquoi ne pas en faire votre métier ?XMLfr n'est heureusement pas le seul site où l'on parle de XML. Découvrez les autres grâce à XMLfr et à l'ODP.Les partenaires grâce auxquels XMLfr peut se développer.Pour tout savoir sur XMLfr.XMLfr sans fil, c'est possible !Pour ceux qui veulent vraiment en savoir plus sur XML.L'index du site.
 Si vous vous posez une question, vous n'êtes peut-être pas le premier...Les traductions en français des bibles XML.Ces articles sont des références dans leur domaine.Tout ce qu'il faut savoir pour démarrer sur un sujet XML...

 
Cliquez ici.

Ignorer casse (majuscules/minuscules) et diacritique (accents) avec XPath/XSLT 1.0

Est-il possible avec XPath et XSLT 1.0 d'ignorer la casse (majuscules/minuscules) et les diacritiques (accents)?

Eric van der Vlist, Dyomedea (vdv@dyomedea.com).
mardi 04 janvier 2005

Table des matières

Question

Réponse

Principe

Implémentations

Conversion de majuscules en minuscules basée sur les tables Unicode

Utilisation de chaînes de caractères générées à partir des tables Unicode

Références

Question

Est-il possible avec XPath et XSLT 1.0 d'ignorer la casse (c'est à dire le fait qu'un caractère soit en majuscules ou en minuscules) et les diacritiques (c'est çà dire les accents) et de considérer par exemple que "Modéré" est égal à "modere" ?

Comment faire?

Réponse

Principe

La fonction XPath 1.0 qui convient le mieux pour cette opération est la fonction "translate" qui permet des remplacements caractère par caractère.

Ainsi pour ignorer les accents sur le caractère "e" dans la chaîne "$ma-chaine", il faudra remplacer les caractères "é", "ê" et "è" par le caractère "e" au moyen de l'expression XPath :

translate($ma-chaine, "éêè", "eee")

Pour ignorer la casse de ce même caractère "e", il faudra également remplacer les caractères "E", "É", "È" et "Ê" par le caractère "e" :

translate($ma-chaine, "éêèEÉÈÊ", "eeeeeee")

Si le principe est simple, son application correcte pour prendre en compte l'ensemble des variations liées à la casse et aux diacritiques est laborieuse et source d'erreurs.

De plus, pour la gérer complètement, il faudrait pouvoir gérer les transformations d'un caractère unique en plusieurs caractères (tel le "ß allemand, qui devient "ss").

On peut donc également chercher à effectuer une transformation plus rigoureuse partant des tables de "case mapping" Unicode.

Implémentations

Conversion de majuscules en minuscules basée sur les tables Unicode

Paul Terray a publié une implémentation convertissant les majuscules en minuscules et partant des tables Unicode.

Elle est disponible à l'adresse http://www.h2o.be/Telechargements/CaseFolding.zip et utilisable librement à la condition d'en conserver les en-têtes.

Cette implémentation fonctionne sur un transcodage XML de la table de conversion Unicode et gère l'ensemble des transcodages. Elle porte sur l'ensemble des caractères caractères latins, grecs, cyrilliques et arméniens.

Pour pouvoir gérer les conversions générant plusieurs caractères, elle utilise un template nommé récursif qui traite les caractères les uns après les autres et est donc assez lente.

Utilisation de chaînes de caractères générées à partir des tables Unicode

Si l'on ne s'intéresse pas aux conversions générant plusieurs caractères, il est plus simple d'utiliser des chaînes de caractères générées une fois pour toute à partir des tables Unicode.

Les chaînes suivantes ont été générées à partir de la table UnicodeData-4.0.1.txt en ne s'intéressant qu'aux blocs Basic Latin et Latin-1 Supplement qui comprennent les caractères usuels en français.

  • Liste des caractères en majuscules :
ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ
  • Liste des caractères en minuscules :
abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ
  • Liste des caractères accentués :
ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöùúûüýÿ
  • Liste des caractères sans accents :
AAAAAACEEEEIIIINOOOOOUUUUYaaaaaaceeeeiiiinooooouuuuyy
  • Liste des caractères en majuscules et minuscules, avec ou sans accents :
AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzÀàÁáÂâÃãÄäÅåÆ
æÇçÈèÉéÊêËëÌìÍíÎîÏïÐðÑñÒòÓóÔôÕõÖöØøÙùÚúÛûÜüÝýÞþ
  • Liste des caractères en minuscules, sans accents :
aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzzaaaaaaaaaaaaæ
æcceeeeeeeeiiiiiiiiððnnooooooooooøøuuuuuuuuyyþþ

Ces chaînes peuvent être copiées/collées dans des transformations XSLT et elles permettent de gérer les cas courants, par exemple :

  • Pour convertir en minuscules en gardant les accents :
translate($ma-chaine, "ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ
ÐÑÒÓÔÕÖØÙÚÛÜÝÞ", "abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóô
õöøùúûüýþ")
  • Pour enlever les accents en gardant la casse :
translate($ma-chaine, "ÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïñ
òóôõöùúûüýÿ", "AAAAAACEEEEIIIINOOOOOUUUUYaaaaaaceeeeiiiinooooouuu
uyy")
  • Pour enlever les accents et convertir en minuscules en une seule opération :
translate($ma-chaine, "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUu
VvWwXxYyZzÀàÁáÂâÃãÄäÅ寿ÇçÈèÉéÊêËëÌìÍíÎîÏïÐðÑñÒòÓóÔôÕõÖöØøÙùÚúÛûÜ
üÝýÞþ", "aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzzaaaa
aaaaaaaaææcceeeeeeeeiiiiiiiiððnnooooooooooøøuuuuuuuuyyþþ")

Lorsque l'on utilise ces chaînes plusieurs fois dans une transformation, on pourra les placer dans une variable, par exemple :

<xsl:variable name="majuscules">ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆ
ÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ</xsl:variable>
<xsl:variable name="minuscules">abcdefghijklmnopqrstuvwxyzàáâãäåæ
çèéêëìíîïðñòóôõöøùúûüýþ</xsl:variable>
...
<xsl:value-of select="translate($ma-chaine, $majuscules, $minuscu
les)"/>

Références

Copyright 2005, Eric van der Vlist


 

Mots clés.



L'histoire de XML s'écrit en ce moment même. XMLfr vous aide à la suivre et à en dégager les tendances.


Cliquez ici.
Cliquez ici.

Devenez rédacteur <XML>fr et contribuez au développement du xml francophone !
Les documents publiés sur ce site le sont sous licence "Open Content"
Conception graphique
  l.henriot  

Conception, réalisation et hébergement
Questions ou commentaires
  redacteurs@xmlfr.org