[0]
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:root="http://www.xmlValidation.com/root"
xsi:schemaLocation="./schema_strict.xsd">
Cette ligne est en elle-même déjà non valide. xsi est un namespace qu'on nomme parfois un namespace dit bien-connu. Et ça veut dire qu'on n'a pas besoin de fournir explicitement un schéma pour xsi et le moteur de validation pourrait valider des infos relatés à ce namespace. Mais, ce n'est pas forcé, et pour certaines implémentataions, le moteur peut ne pas le faire: donc, un peu de dépendant d'implémentation s'introduit par là.
La syntaxe en question est ceci
xsi:schemaLocation="./schema_strict.xsd"
ce qui est fausse. La syntaxe propre est ceci
xsi:schemaLocation="http://www/xmlValidation.com/root ./schema_strict.xsd"
si on pense il s'agit que le seul namespace explicitement montré soit en question.
msxml2 version 6.0 ou d'autres intervient pro-activement en validant aussi le namespace bien-connu; par conséquence, il refuse de valider totalement la combinaison xml et xsd, déjà à ce niveaux.
libxml2, non: il va laisser passer, il me semble.
[1]
Il faut absolument mettre le facet ? dans le pattern. Ce qui est fourni est faux.
1 2
| <!-- xs:pattern value="\d\p{Lu}\p{Lu}\p{Lu}\d\d\d\p{Lu}\p{Lu}(\p{Lu}|\d|)"/ -->
<xs:pattern value="\d\p{Lu}\p{Lu}\p{Lu}\d\d\d\p{Lu}\p{Lu}(\p{Lu}|\d)?"/> |
msxml2 v6 et libxml2 ont tout deux raison.
[2]
Juste une remarque supplémentaire pour ceux qui se sentissent confus si l'élément root est dans un namespace ou dans un namespace dit nul. La ligne peut sentir royalement confus. L'élément root est sans namespace (ou dans un namespace nul) et c'est pour ça, dans le schéma, on ne met pas un @targetNamespace et c'est correctement fait.
Pourtant, on a la main libre aussi de déclarer un préfixe root par xmlns:root. On peut le servit un jour ou dans un xml plus complet mais dans le cas montré il n'intervient aucunement nul part - et c'est permit aussi, si on veut.
Voilà !
Partager