Bonjour,
Ça fait un petit moment que je suis abonné à la liste, mais ceci est mon
premier message. Petite présentation donc : je suis développeur d'appli
basée sur le framework de Mozilla (C++/XPCOM/XUL etc..), fondateur du
site http://xulfr.org, co-fondateur du site http://openweb.eu.org.
Je réalise actuellement un validateur RelaxNG, et j'ai un petit souci
avec le pattern <text />.
Si j'ai bien compris les specs (et le livre d'Eric sur RelaxNG ;-), le
pattern <text /> est "positif" quand :
- il y a un noeud texte (ou cdata) avec du texte
- il y a un noeud texte (ou cdata) avec seulement des caractères "blancs"
- quand il n'y a pas de noeud texte.
(cf :
* http://books.xmlschemata.org/relaxng/ch05s02.html#id2821949 "More
precisely, it matches zero or more text nodes"
* http://www.relaxng.org/spec-20011203.html#text-pattern "a text element
matches zero or more strings" )
Imaginons ce bout de schema RelaxNG (que l'on retrouve dans le schema
RelaxNG de RelaxNG : http://www.relaxng.org/spec-20011203.html#IDA5MCS
au niveau du <define name="other"/>)
<element>
....
<zeroOrMore>
<choice>
<attribute>
<anyName/>
</attribute>
<text/>
</choice>
</zeroOrMore>
</element>
Ce schema indique que l'élément peut contenir n'importe quel attribut OU
un noeud text, et ce en un nombre indéterminé. D'une manière générale,
le problème existe avec ce schema :
<element>
....
<zeroOrMore>
<choice>
<pattern_quelconque />
<text/>
</choice>
</zeroOrMore>
</element>
ou même
<element>
<zeroOrMore>
<text/>
</zeroOrMore>
</element>
imaginons alors par exemple cette balise :
<foo />
comme il n'y a pas d'attribut le pattern <text /> s'applique, et est
finalement positif (puisque valide l'absence de noeud text).
Du coup <zeroOrMore> est valide.
Bien sûr, puisque "zero ou plus", il faut vérifier une nouvelle fois
que les sous-patterns de zeroOrMore ne valident pas encore une fois.
D'où, une boucle dans mon implementation.
Mais voilà, dans ce cas précis : ça tourne en boucle indéfiniement
puisque le pattern <text /> valide toujours.
Donc je m'interroge :
- un "bug" dans les specs de RelaxNG ?
- une mauvaise interpretation de ma part au sujet de <text/> ou de
<zeroOrMore /> ? (ou même <oneOrMore> puisque le problème existe aussi
avec lui)
- mon implémentation est-elle incorrecte ? Mais alors, quand arreter
cette boucle ? Quand est ce que le pattern <zeroOrMore> ne devrait-il
plus "matcher" dans ce cas ?
Merci d'avance pour vos idées..
Laurent Jouanneau
|