2009-09-09 6 views
0

J'ai vu XML Schema element with attributes containing only text mais j'ai un élément qui est un xs: dateTime à la place.Comment déclarer un élément non-chaîne comme ayant un contenu optionnel dans le schéma XML

Le document que je suis en train d'écrire un schéma pour ressemble à ceci:

<web-campaigns> 
    <web-campaign> 
    <id>1231</id> 
    <start-at nil="true"/> 
    </web-campaign> 
    <web-campaign> 
    <id>1232</id> 
    <start-at>2009-08-08T09:00:00Z</start-at> 
    </web-campaign> 
</web-campaigns> 

Parfois, l'élément xs: dateTime a un contenu, parfois non.

Ce que j'ai jusqu'à présent (qui ne valide pas encore) est:

<xs:element name="start-at"> 
    <xs:complexType mixed="true"> 
    <xs:simpleContent> 
     <xs:extension base="xs:dateTime"> 
     <xs:attribute name="nil" default="false" type="xs:boolean" use="optional" /> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

Si je remplace xs: dateTime avec xs: string, je peux valider le document très bien, mais je veux vraiment un xs: dateTime, pour indiquer aux consommateurs ce qu'il y a dans cet élément. J'ai essayé avec/sans mixed = "true" ainsi, en vain.

Si cela fait une différence, je valide en utilisant xmllint (sous Mac OS X 10.5) et XML Schema Validator

Répondre

1

Vous avez besoin

<xs:element name="start-at" minOccurs="0"> 

-mode mixte n'est pas pertinent à votre situation, vous n » J'ai besoin de ça. Par défaut, , c'est-à-dire que l'élément est obligatoire.

Avec minOccurs = "0", vous spécifiez l'élément avec le contenu, ou pas du tout. Si vous souhaitez autoriser <start-at/>, vous ne pouvez pas utiliser xs: dateTime.

3

Vous pouvez définir vos propres types comme union de types.

1/définir le type "vide" comme une chaîne qui ne permet "" rien ähm :)

<xs:simpleType name="empty"> 
    <xs:restriction base="xs:string"> 
    <xs:enumeration value=""/> 
    </xs:restriction> 
</xs:simpleType> 

2/définir suivant un type qui permet la date et videz

<xs:simpleType name="empty-dateTime"> 
    <xs:union memberTypes="xs:dateTime empty"/> 
</xs:simpleType> 

3/déclare tous vos éléments datetime NULL comme type="empty-dateTime"

Questions connexes