2010-11-19 28 views
6

je suis en train de définir une règle de régime en XSD, pour lequel une chaîne est de 8 caractères:XSD modèle d'expression régulière: ceci ou rien

<PostedDate>42183296</PostedDate> 

et l'espace de remplissage est également autorisé:

<PostedDate>  </PostedDate> 

qui m'a conduit à la XSD:

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:length value="8" />   //exactly 8 characters long 
</xs:simpleType> 

mais la valeur peut également e Mpty (c.-à-d. zéro caractères):

<PostedDate></PostedDate> 
<PostedDate /> 

ce qui m'a amené à essayer: naïvement

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:length value="8" />   //exactly 8 characters long 
     <xs:length value="0" />   //exactly 0 characters long 
</xs:simpleType> 

Ce qui bien sûr n'est pas autorisé.

Comme est souvent le cas dans XSD, la plupart des formats ne peuvent pas être représentés facilement avec XSD, donc je choisi de tenter une règle d'expression régulière:

.{8} | "" 

qui essaie de convertir au type I xsd:

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value=".{8}|''" /> 
    </xs:restriction> 
</xs:simpleType> 

Mais il ne fonctionne pas:

''20101111' is not facet-valid with respect to pattern '.{8}|''' for type 'DateFormat' 

J'ai aussi essayé

  • <xs:pattern value="[0-9]{8}|''" />
  • <xs:pattern value="([0-9]{8})|('')" />
  • <xs:pattern value="(\d{8})|('')" />

Quelqu'un peut-il autre chose d'un modèle qui permet de résoudre la question correspondant soit - un certain modèle spécifique - vide

Bonus: peut Quelqu'un pointe vers l'endroit dans the XSD documentation qui dit que \d correspond à des chiffres? Ou quels sont les autres codes de motif spéciaux?

+0

Je pense que '\ d {8}?' Devrait fonctionner. '?' signifie que tout ce qui précède est optionnel. –

Répondre

11

Je devine que les modèles devraient ressembler à \d{8}| qui signifie "huit chiffres ou rien", mais pas huit chiffres ou deux guillemets. Cependant ceci n'explique pas, pourquoi 20101111 ne correspond pas. Êtes-vous sûr qu'il n'y a pas d'espaces blancs ou d'autres symboles supplémentaires dans la valeur de l'élément?
\d est dit correspondre les chiffres dans la section « F.1.1 caractère de classe Escapes »

+0

C'est l'astuce que je n'aurais jamais imaginé '\ d {8} |' signifie * "huit chiffres | rien" *. Sournois. Et tu as raison; Je ne sais pas pourquoi mon motif '. {8} | ''' ne correspondait pas à '20101111' avant - il le fait maintenant.Bien qu'avant j'utilisais un site Web pour valider xml + xsd. Depuis l'heure du déjeuner, j'ai écrit un programme xml-studio pour donner plus de retours interactifs. –

+2

Il est également important de noter qu'une restriction 'xs: totalDigits' doit venir ** après ** une restriction' xs: pattern'. Dans le cas contraire, l'analyseur convertit en interne le texte '000001' en un seul chiffre' 1', qui échoue alors à valider par rapport au motif '(\ d) {6}', car ce n'est pas 6 caractères! –

3

J'ai aussi dans la même situation comme une chaîne vide, est autorisé, sinon il doit 6 numéros de longueur. Enfin, j'ai utilisé comme suit. Cela fonctionne pour moi

<xs:simpleType name="DateFormat"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="|[0-9]{8}" /> 
    </xs:restriction> 
</xs:simpleType>