Ajouter des attributs à un simpletype ou une restriction à un complextype 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 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 complexe de type 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. Est-il aucun moyen de contourner ce problème. Ce n'est pas une restriction très étrange, ou est-ce?

61
demandé sur Ikke 2009-03-09 16:52:36

2 réponses

Pour ajouter des attributs que vous avez à tirer, par extension, pour ajouter des facettes 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>
114
répondu Richard 2009-03-09 14:11:26

Je voudrais proposer mon exemple avec une explication plus détaillée de ce qui nécessite réellement de 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, il s'agit de xs:string avec une restriction de longueur de champ 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 en fonction de votre type privé (dans mon cas, c'est "string1024Type") et 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 ê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'attribution dans la même définition d'élément.

2
répondu Oleg Kokorin 2017-04-28 09:33:29