Élément - déclaration D'attribut obligatoire dans le schéma XSD:

je veux déclarer un élément à inclure dans une déclaration de type complexe, et l'élément a un attribut obligatoire: "option=MyOption", mais la valeur de l'attribut "option" peut être n'importe quoi, selon le contexte.

C'est: l'attribut "option" avec une valeur inconnue devrait être obligatoire dans tout document à l'aide du type complexe contenant cet élément.

Exemple:

    <xs:element name="SpecialOption" type="xs:string"/>

    <xs:complexType name="SpecialOptions">
        <xs:sequence>
            <xs:element ref="SpecialOption" minOccurs="1" maxOccurs="100"/>
            <xs:element ref="XXX"/>     
        </xs:sequence>
    </xs:complexType>   

dans ce cas, la "SpecialOption"" élément du type complexe "SpecialOptions" devrait avoir cet attribut obligatoire.

je ne sais pas comment déclarer un attribut obligatoire pour un élément XSD, ou la façon de spécifier que l'attribut doit avoir une valeur qui n'est pas encore connu.

10
xsd
demandé sur dbank 2011-10-07 21:48:26

4 réponses

vous devez modifier la définition de L'élément "SpecialOption" pour inclure l'attribut requis. Mise à jour de ce code:

<xs:element name="SpecialOption" type="xs:string"/>

à:

<xs:element name="SpecialOption">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="Option" type="xs:string" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

avec ce changement, votre type complexe contiendra l'attribut requis "Option" sur toutes les instances de L'élément "SpecialOption" du type complexe "SpecialOptions". Déclarer que l'attribut "Option" est de type xs:string permet de passer n'importe quelle valeur dans ce champ.

24
répondu pmartin 2011-10-10 13:00:02

1) Il s'agit d'un attribut de chaîne de caractères simple

<xs:element name="SpecialOption">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Option" type="xs:string" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element> 

2) Pour exiger exactement un d'une liste de valeurs autorisées:

<xs:element name="SpecialOption">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Option" use="required">
                    <xs:simpleType>  
                        <xs:restriction base="xs:string">  
                            <xs:enumeration value="DE"/>  
                            <xs:enumeration value="EN"/>  
                        </xs:restriction>  
                    </xs:simpleType>  
                </xs:attribute>  
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element> 

3) on peut utiliser une plage comme restriction, comme dans l'exemple ci-dessous.

<xs:element name="SpecialOption">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Option" use="required">
                    <xs:simpleType>  
                        <xs:restriction base="xs:integer">  
                            <xs:minInclusive value="95"/>  
                            <xs:maxInclusive value="137"/>  
                        </xs:restriction>  
                    </xs:simpleType>  
                </xs:attribute>  
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element> 

4) ci-Dessous, l'attribut est déclaré comme une liste contenant les valeurs décimales. Cela permet à un attribut de contenir un sous-ensemble des valeurs spécifiées, par exemple Option="6 77 95".

<xs:simpleType name="Items">  
    <xs:restriction base="xs:decimal">  
        <xs:enumeration value="137"/>  
        <xs:enumeration value="95"/>  
        <xs:enumeration value="6"/>  
        <xs:enumeration value="77"/>  
    </xs:restriction>  
</xs:simpleType>  
<xs:element name="SpecialOption">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Option" use="required">
                    <xs:simpleType>  
                        <xs:list itemType="Items"/>  
                    </xs:simpleType>  
                </xs:attribute>  
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element> 

5) ici l'attribut est déclaré optionnel, mais fourni avec une valeur par défaut ("test"), qui est parfois suffisante:

<xs:element name="SpecialOption">
    <xs:complexType>
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="Option" type="xs:string" use="optional" default="test"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:element> 
15
répondu mousio 2011-10-21 20:00:26

Pour marquer un attribut obligatoire vous utilisez <xs:attribute use="required" />.

comme pour le type, vous avez le choix des types xsd intégrés (xs: string etc), ou vous pouvez définir votre propre <xs:simpleType /> et l'utiliser.

UPDATE

je ne suis pas certain de ce que tu veux dire par l'attribut doit avoir une valeur qui n'est pas encore connue. Est-ce à dire que la valeur est une chaîne, mais peut être n'importe quelle chaîne? Ou une virgule?

Parce que c'est une valeur d'attribut nous parlons de vous sont limités à l'utilisation des types xsd intégrés, ou de définir votre propre xs:simpleType type basé sur l'un des types intégrés. C'est là que vous pouvez appliquer des règles plus strictes à la valeur autorisée, par exemple en étendant xs:string et ajouter une contrainte d'expression régulière aux valeurs autorisées.

<xsd:simpleType name="UKDate">
    <xsd:restriction base="xsd:string">
        <xsd:pattern value="(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)\d\d"/>
    </xsd:restriction>
</xsd:simpleType>

cependant, s'il n'y a absolument aucun moyen de savoir quelle valeur sera utilisée, alors vous avez le paradoxe temporel bien connu par lequel vous ne pouvez pas restreindre quelque chose à la conception-temps à une valeur que vous connaissez seulement à l'exécution. Dans ce cas, il est seulement nécessaire de préciser que l'attribut doit au moins être présent?

<xs:attribute use="required" />

J'espère que cela répondra un peu plus clairement à votre question.

3
répondu tom redfern 2011-10-10 12:28:43

Simplement, vous pouvez le faire comme suit

<xs:element name="SpecialOption">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:whiteSpace value="replace"/>
          <xs:minLength value="1"></xs:minLength>
        </xs:restriction>
      </xs:simpleType>
    </xs:element>

par ce code vous forcez pour insérer une valeur sur la balise xml et aussi la restriction d'espace blanc traitera pour enlever l'espace blanc de la balise xml.

0
répondu Ahmad Hindash 2013-10-20 14:56:10