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
|