Interdire les espaces dans un noeud texte en RelaxNG
Stephane Bortzmeyer <[email protected]> Mon, 22 Jan 2007 21:38:48 +0100
| Newsgroups | gmane.text.xml.french.tech |
|---|---|
| Message-ID | <[email protected]> |
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).
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...
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 ?