2010-12-10 32 views
20

Ceci est mon code XML exemple:Élément XSD non nul ou vide Contrainte pour Xml?

<bestContact> 
<firstName><![CDATA[12345]]></firstName> 
<lastName /> 
</bestContact> 

J'utilise:

<xs:element name="lastName" type="xs:string" minOccurs="1" nillable="false"/> 

Le XSD doit-être valider lastName ne pas nul ou vide.

Répondre

42

Essayez

<xs:element name="lastName" minOccurs="1" nillable="false"> 
    <xs:simpleType> 
    <xs:restriction base="xs:string"> 
     <xs:minLength value="1"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:element> 
+3

bonne réponse - le 'nillable' est une pensée redondante. –

+0

@Nic - D'accord. J'ai simplement copié et collé la ligne de la question :) – Kamal

+0

En utilisant ceci, j'obtiens "Element 'lastName' a à la fois un attribut 'type' et un type 'type anonyme', seul un d'entre eux est autorisé pour un élément." Je pense qu'il y a un problème sur l'utilisation de type = "xs: string" dans l'élément conteneur. –

9

@Kamal vous a donné réponse essentiellement ici. C'est pourquoi - nillable semble toujours causer des problèmes. Effectivement, vous pouvez considérer nillable comme signification permettre l'attribut xsi:nil sur cet élément. Le XML Schema spec décrit nillable comme un signal hors bande - il est essentiellement utilisé pour indiquer NULL aux bases de données.

Ce que vous voulez est un élément qui doit être au moins un caractère tant que donnée par @Kamal

13
<xsd:element name="lastName" type="NonEmptyString" nillable="false"/> 

<xsd:simpleType name="NonEmptyString"> 
    <xsd:restriction base="xs:string"> 
    <xsd:minLength value="1" /> 
    <xsd:pattern value=".*[^\s].*" /> 
    </xsd:restriction> 
</xsd:simpleType> 
+0

J'aime ça mieux que les 2 offertes par Gab, celle-ci fonctionne pour moi. Depuis que je cherchais une expression qui vient de se débarrasser des espaces de début, pas les espaces entre les textes – ycomp

+2

Je pense que vous pouvez simplement remplacer cette regex par '\ S +' comme l'a souligné Gab. – bvdb

8

Ceci est à mon humble avis un meilleur modèle:

<xs:simpleType name="NonEmptyString"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="^(?!\s*$).+" /> 
    </xs:restriction> 
</xs:simpleType> 

ou

<xs:simpleType name="NonEmptyStringWithoutSpace"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="\S+"/> 
    </xs:restriction> 
</xs:simpleType> 
+0

Y at-il un avantage à votre première proposition sur le second? – ycomp

+0

Eh bien, une chaîne blanche (non vide) sera autorisée par le 1er mais pas le 2ème. Cela dépend de vos besoins – Gab

0

C'était ma solution préférée.

<xs:simpleType name="NonEmptyString"> 
    <xs:restriction base="xs:string"> 
     <xs:pattern value="[\s\S]*[^ ][\s\S]*"/> 
    </xs:restriction> 
</xs:simpleType>`