Re: Interdire les espaces dans un noeud texte en RelaxNG

Eric van der Vlist <[email protected]> Wed, 24 Jan 2007 19:19:13 +0100
Newsgroups gmane.text.xml.french.tech
Organization Dyomedea (http://dyomedea.com)
Message-ID <[email protected]>
Bonjour,
Le mardi 23 janvier 2007 à 22:24 +0100, Stephane Bortzmeyer a écrit :
> On Tue, Jan 23, 2007 at 08:42:31AM +0100,
>  Eric van der Vlist <[email protected]> wrote 
>  a message of 161 lines which said:
> 
> > Si rnv et xmllint disent le contraire, c'est un bug.
> 
> Hmmm, bon, je vais leur signaler, alors. Toutefois, j'ai beau lire
> http://www.w3.org/TR/xmlschema-2/, je ne vois pas clairement où cette
> différence entre xsd:string et les autres est indiquée. Si vous avez
> une référence précise, pour le rapport de bogue ? 

C'est défini dans la description de la facette whiteSpace:

http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#rf-whiteSpace

xsd:string est le seul type prédéfini dont cette facette a la valeur
"preserve", xsd:normalizedString est le seul type prédéfini dont cette
facette à la valeur "replace". Pour tout les autres types la valeur de
cette facette est "collapse" ce qui justifie cette différence de
comportement.

> Votre livre, que
> vous citez, n'en donne apparemment pas.

Je détaille beaucoup plus ce sujet dans mon livre sur W3C XML Schema qui
n'est malheureusement pas disponible en ligne de manière gratuite.

> > 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 :
> 
> De toute façon, NMTOKEN, que j'employais, devrait être réservé aux
> attributs, non ?

Pas nécessairement : W3C XML Schema ne l'impose pas mais fait remarquer
que si vous voulez rester compatible avec les DTDs, vous devriez
effectivement ne l'utiliser que pour des attributs.   

> > element code {xsd:string { minLength = "2" maxLength = "3" pattern = "[a-z]+"} }
> 
> OK, ça marche, merci.
>  
> > 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*" } }
> 
> Comme je veux autoriser les espaces à l'intérieur, j'ai mis :
> 
> name = element name {xsd:string { pattern="\S.*\S"}}
> 
> qui semble donner ce que je veux (en prime, il impose au moins deux
> caractères).
> 
> > La seule solution est, ici encore, d'utiliser xsd:string!
> 
> Oui, ça marche, mais ce n'est pas vraiment beau à lire :
> 
> salary = element salary {xsd:string {pattern="[0-9]+"}}
> 
> Le lecteur du schéma va bondir : "Mais pourquoi ce type n'a t-il pas
> utilisé xsd:integer ? En prime, son pattern ne permet pas +33 ou
> autres nombres qui seraient légaux avec xsd:integer !"

Effectivement, je ne le conseillerais pas dans le cas général...

Est-ce que les espaces sont vraiment gênants pour votre application? 

> > 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.
> 
> Dommage. Mais merci beaucoup pour l'aide.

You're welcome!

Eric

-- 
GPG-PGP: 2A528005
If you have a XML document, you have its schema.
                                                  http://examplotron.org
------------------------------------------------------------------------
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)

iD8DBQBFt6MhDvn+ZCpSgAURAqxQAJ9Mjm3PVHqxb2d/pPNOO0mESsSxwgCgmhA0
dizmlCAvE3wRawnZgVCCORI=
=qkfb
-----END PGP SIGNATURE-----