67 votes

Ajouter des attributs à un type simple ou une restriction à un type complexe dans Xml Schema

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 l'attribut et la restriction en même temps. Le format de l'attribut ne peut avoir que les valeurs minutes, heures et secondes. L'heure a le modèle 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 ? Cette restriction n'est pas très étrange, n'est-ce pas ?

123voto

Richard Points 54016

Pour ajouter des attributs, il faut dériver par extension, pour ajouter des facettes, il faut dériver par restriction. Il faut donc procéder 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>

2voto

Oleg Kokorin Points 396

J'aimerais proposer mon exemple avec une explication plus détaillée de ce qui est réellement nécessaire pour mélanger le type hérité avec les restrictions tout en ajoutant l'attribut.

c'est l'endroit où vous définissez votre type hérité (dans mon cas, il s'agit d'un type basé sur xs:string avec une restriction de longueur de champ de 1024 appliquée). vous ne pouvez pas avoir ceci comme type standard pour votre champ car vous allez ajouter un "attribut" à votre champ aussi.

  <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 sur la base de votre type privé (dans mon cas, c'est "string1024Type") et où les attributs nécessaires sont ajoutés :

<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 se trouver à des endroits complètement différents de votre schéma. le point important est seulement de suivre une fois de plus - vous ne pouvez pas mélanger l'héritage et l'attribution dans la même définition d'élément.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X