web-dev-qa-db-fra.com

Ajouter des attributs à un type simple ou une restriction à un type complexe dans le schéma Xml

Le problème est le suivant:

J'ai l'extrait 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 le motif de restriction \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 crée un type complexe de timeType, je peux ajouter un attribut, mais pas la restriction, et si je crée un type simple, je peux ajouter la restriction mais pas l'attribut. Existe-t-il un moyen de contourner ce problème. Ce n'est pas une restriction très étrange, n'est-ce pas?

64
Ikke

Pour ajouter des attributs, vous devez dériver par extension, pour ajouter des facettes, vous devez dériver 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éfini 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>
117
Richard

Je voudrais proposer mon exemple avec une explication plus détaillée de ce qui nécessite réellement pour mélanger le type hérité avec des restrictions tout en ajoutant un attribut.

c'est l'endroit où vous définissez votre type hérité (dans mon cas, c'est xs: une chaîne basée sur une restriction de longueur de champ 1024). vous ne pouvez pas avoir ceci comme type standard pour votre champ car vous allez aussi 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, c'est "string1024Type") et de l'attribut nécessaire ajouté:

<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 peuvent se trouver à des endroits complètement séparés de votre schéma. le point important ne fait que suivre à nouveau - vous ne pouvez pas mélanger l'héritage et l'attribution dans la même définition d'élément.

2
Oleg Kokorin