Re: Interdire les espaces dans un noeud texte en RelaxNG
Eric van der Vlist <[email protected]> Tue, 23 Jan 2007 08:42:31 +0100
| Newsgroups | gmane.text.xml.french.tech |
|---|---|
| Organization | Dyomedea (http://dyomedea.com) |
| Message-ID | <[email protected]> |
Bonjour,
Le lundi 22 janvier 2007 à 21:38 +0100, Stephane Bortzmeyer a écrit :
> Je cherche à interdire les espaces (au sens "whitespace" donc y
> compris le saut de ligne) dans certains élémnts, pour faciliter les
> transformations ultérieures vers des documents non-XML.
>
> C'est en RelaxNG mais avec la bibliothèque de types des W3C Schema
> donc les gourous XSD peuvent répondre aussi :-)
>
> Ici, par exemple, pour des codes ISO 639, c'est facile :
>
> code = element code {xsd:NMTOKEN { minLength = "2" maxLength = "3"
> pattern = "[a-z]+"} }
>
> Et avec ça, j'ai bien
>
> <code>fr</code>
>
> qui est accepté et
>
> <code> fr</code>
>
> ou
>
> <code>
> fr</code>
>
> qui sont refusés (jai tout testé avec rnv et xmllint pour minimiser
> les risques que la bogue soit dans mon schéma).
Et pourtant...
<code> fr</code> et <code>
fr</code> sont valides pour ce schéma!
Si rnv et xmllint disent le contraire, c'est un bug.
En effet, pour tout les types W3C XML Schema à l'exception de xsd:string
et xsd:normalizedString, les espaces sont normalisés (au sens de XPath)
avant que les valeurs soient testées.
voir
http://books.xmlschemata.org/relaxng/relax-CHP-8-SECT-1.html#relax-CHP-8-SECT-1.1
Il n'y a aucun moyen d'empêcher cela et la seule solution pour interdire
les espaces en début et en fin d'une valeur est d'utiliser le type
xsd:string :
element code {xsd:string { minLength = "2" maxLength = "3" pattern = "[a-z]+"} }
> Maintenant, si je veux accepter presque tout Unicode (donc, pattern ne
> convient pas) mais en interdisant les "whitespaces" au début et à la
> fin, comment-puis-je faire ? Je voudrais autoriser :
>
> <name>Stéphane Bortzmeyer</name>
>
> mais en interdisant :
>
> <name>Stéphane Bortzmeyer </name>
> ou
> <name>
> Stéphane Bortzmeyer</name>
>
> Je n'ai pas trouvé comment interdire certains caractères en autorisant
> tous les autres. Sans compter qu'il existe pas mal de sortes d'espaces
> dans Unicode...
Si normalize-space vous convient, c'est que par "espace" vous ne voulez
dire que space #x20, tab #x09, linefeed #x0A, et carriage return #x0D.
Dans ce cas, vous pouvez utiliser \s pour désigner les espaces et \S
pour désigner les caractères qui ne le sont pas!
voir
http://books.xmlschemata.org/relaxng/relax-CHP-9-SECT-4.html#relax-CHP-9-SECT-4.3
Par contre, pour interdire ces caractères en début et fin de valeurs, il
faut utiliser là encore le type xsd:string :
name = element name {xsd:string { pattern="\S*" } }
> Notez que, si la transformation est faite avec XSLT, la fonction
> normalize-space fait tout à fait ce que je veux mais je préférerai
> mettre la règle dans le schéma pour simplifier la vie du programmeur.
>
> Deuxième défi : si je mets dans mon schéma :
>
> salary = element salary {xsd:integer}
>
> alors,
>
> <salary>4000</salary>
>
> est accepté
>
> mais aussi des trucs comme
>
> <salary> 4000</salary>
>
> que je voudrais interdire. Le fait que le nombre précédé d'espaces
> soit autorisé est logique (dans la plupart des langages de
> programmation, le sous-programme de transformation d'une chaîne de
> caractères en entier ignore les espaces du début et de la fin) mais me
> gêne personnellement. Une idée ?
>
> La moins mauvaise que j'ai trouvée est :
>
> salary = element salary {xsd:integer {pattern="[0-9]+"}}
>
> Est-ce recommandé ? rnv ignore le pattern et accepte :
>
> <salary> 4000</salary>
>
> mais xmllint a le comportement attendu. Bogue de rnv ?
>
Non, de xmllint pour les mêmes raisons (xsd:integer suppose une
normalisation des espaces avant test des valeurs).
La seule solution est, ici encore, d'utiliser xsd:string!
En fait, W3C XML Schema a décidé pour nous que les espaces ne sont pas
significatifs dans la majorité des cas et nous impose ce comportement
que cela nous plaise ou non.
Eric van der Vlist
--
GPG-PGP: 2A528005
Le premier annuaire des apiculteurs 100% XML!
http://apiculteurs.info/
------------------------------------------------------------------------
Eric van der Vlist http://xmlfr.org http://dyomedea.com
(ISO) RELAX NG ISBN:0-596-00421-4 http://oreilly.com/catalog/relax
(W3C) XML Schema ISBN:0-596-00252-1 http://oreilly.com/catalog/xmlschema
------------------------------------------------------------------------
-- Attached file included as plaintext by Ecartis --
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.3 (GNU/Linux)
iD8DBQBFtbxnDvn+ZCpSgAURAoLbAKCQ9+d87qu2QV8VcV119Ezgza9vawCeNKYO
VQWNG5cr9CBsCOXlU5hX/tc=
=Bbi/
-----END PGP SIGNATURE-----