2009-03-09 12 views
59

Le problème est le suivant:Ajouter des attributs à une simpleType ou restriction à un complexType dans Xml schéma

Je l'extrait de code XML suivant:

<time format="minutes">11:60</time> 

Le problème est que je ne peux pas ajouter à la fois l'attribut et la restriction en même temps. Le format d'attribut ne peut avoir que les valeurs minutes, heures et secondes. Le temps a restrictionpattern \d{2}:\d{2}

<xs:element name="time" type="timeType"/> 
... 
<xs:simpleType name="formatType"> 
<xs:restriction base="xs:string"> 
    <xs:enumeration value="minutes"/> 
    <xs:enumeration value="hours"/> 
    <xs:enumeration value="seconds"/> 
</xs:restriction> 
</xs:simpleType> 
<xs:complexType name="timeType"> 
    <xs:attribute name="format"> 
     <xs:simpleType> 
      <xs:restriction base="formatType"/> 
     </xs:simpleType> 
    </xs:attribute> 
</xs:complexType> 

Si je fais un type complexe de TIMETYPE, je peux ajouter un attribut, mais pas la restriction, et si je fais un type simple, je peux ajouter la restriction, mais pas l'attribut . Y at-il un moyen de contourner ce problème. Ce n'est pas une restriction très étrange, ou est-ce?

Répondre

110

Pour ajouter des attributs, vous devez dériver par extension, pour ajouter des facettes que vous devez déduire par restriction. Par conséquent, cela doit être fait en deux étapes pour le contenu enfant de l'élément. L'attribut peut être définie en ligne:

<xsd:simpleType name="timeValueType"> 
    <xsd:restriction base="xsd:token"> 
    <xsd:pattern value="\d{2}:\d{2}"/> 
    </xsd:restriction> 
</xsd:simpleType> 

<xsd:complexType name="timeType"> 
    <xsd:simpleContent> 
    <xsd:extension base="timeValueType"> 
     <xsd:attribute name="format"> 
     <xsd:simpleType> 
      <xsd:restriction base="xsd:token"> 
      <xsd:enumeration value="seconds"/> 
      <xsd:enumeration value="minutes"/> 
      <xsd:enumeration value="hours"/> 
      </xsd:restriction> 
     </xsd:simpleType> 
     </xsd:attribute> 
    </xsd:extension> 
    </xsd:simpleContent> 
</xsd:complexType> 
+0

Merci beaucoup! – t1gor

1

Je voudrais proposer mon exemple avec des explications plus détaillées qui ont réellement besoin pour mélanger le type hérité avec des restrictions tout en ajoutant attribut.

C'est l'endroit où vous définissez votre type hérité (dans mon cas c'est xs: string basé sur une restriction de longueur de champ 1024 appliquée). Vous ne pouvez pas utiliser ce type comme standard pour votre champ car vous allez ajouter un "attribut" à votre champ.

<xs:simpleType name="string1024Type"> 
    <xs:restriction base="xs:string"> 
     <xs:maxLength value="1024"/> 
    </xs:restriction> 
    </xs:simpleType> 

c'est l'endroit où votre élément est défini en fonction de votre type privé (dans mon cas, il est « string1024Type ») et l'attribut nécessaire en annexe:

<xs:element maxOccurs="unbounded" name="event"> 
    <xs:complexType> 
    <xs:simpleContent> 
     <xs:extension base="string1024Type"> 
     <xs:attribute default="list" name="node" type="xs:string"/> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 
</xs:element> 

les deux blocs pourraient être dans des endroits complètement séparés de votre schéma. le point important ne fait que suivre une fois de plus - vous ne pouvez pas mélanger l'héritage et l'attribuer dans la même définition d'élément.

Questions connexes