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-----