Schéma XML Comment restreindre l'attribut par énumération


85

J'ai la balise XML suivante

<price currency="euros">20000.00</price>

Comment limiter l'attribut de devise à l'un des éléments suivants:

  • euros
  • livres sterling
  • dollars

ET le prix d'un double?

Je reçois juste une erreur lorsque j'essaye de taper sur les deux, voici ce que j'ai jusqu'à présent:

<xs:element name="price">
    <xs:complexType>
        <xs:attribute name="currency">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="pounds" />
                    <xs:enumeration value="euros" />
                    <xs:enumeration value="dollars" />
                </xs:restriction>
            </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
</xs:element>

1
Si vous faites cela, vous devez également supprimer type = "xs: string" de l'élément <xs: attribute>. Vous ne pouvez pas donner le type lorsque simpleType ou complexType est présent.
Sal

Réponses:


116

La valeur numérique semble manquer dans votre définition de prix. Essayez ce qui suit:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>



<xs:element name="price">
        <xs:complexType>
            <xs:extension base="xs:decimal">
              <xs:attribute name="currency" type="curr"/>
            </xs:extension>
        </xs:complexType>
</xs:element>

3
Comme l'a répondu @kjhughes, le <xs:extensionne peut pas être directement un enfant de <xs:complexTypemais doit également être contenu par un <xs:complexContentou <xs:simpleContent.
HankCa

22

Nouvelle réponse à l'ancienne question

Aucune des réponses existantes à cette vieille question n'aborde le vrai problème.

Le vrai problème était qu'onxs:complexTypene pouvait pas avoir directementxs:extensionun enfant dans XSD. Le correctif consiste à utiliser enxs:simpleContentpremier. Les détails suivent ...


Votre XML,

<price currency="euros">20000.00</price>

sera valide pour l' un des XSD corrigés suivants:

Type d'attribut défini localement

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

Type d'attribut défini globalement

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="currencyType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="pounds" />
      <xs:enumeration value="euros" />
      <xs:enumeration value="dollars" />
    </xs:restriction>
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:decimal">
          <xs:attribute name="currency" type="currencyType"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

Remarques

  • Comme l'a commenté @Paul , cela change le type de contenu de price de xs:stringà xs:decimal, mais ce n'est pas strictement nécessaire et ce n'était pas le vrai problème.
  • Comme l'a répondu @ user998692 , vous pouvez séparer la définition de la devise, et vous pouvez changer pour xs:decimal, mais ce n'était pas non plus le vrai problème.

Le vrai problème était qu'il xs:complexTypene pouvait pasxs:extension un enfant dans XSD; xs:simpleContentest nécessaire en premier.

Une question connexe (qui n'a pas été posée mais qui a peut-être confondu d'autres réponses):

Comment pourriez price être restreint étant donné qu'il a un attribut?

Dans ce cas, une définition globale distincte de priceType serait nécessaire; il n'est pas possible de le faire avec uniquement des définitions de type locales.

Comment restreindre le contenu de l'élément lorsque l'élément a un attribut

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:simpleType name="priceType">  
    <xs:restriction base="xs:decimal">  
      <xs:minInclusive value="0.00"/>  
      <xs:maxInclusive value="99999.99"/>  
    </xs:restriction>  
  </xs:simpleType>

  <xs:element name="price">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="priceType">
          <xs:attribute name="currency">
            <xs:simpleType>
              <xs:restriction base="xs:string">
                <xs:enumeration value="pounds" />
                <xs:enumeration value="euros" />
                <xs:enumeration value="dollars" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
</xs:schema>

8

vous devez créer un type et créer l'attribut de ce type:

<xs:simpleType name="curr">
  <xs:restriction base="xs:string">
    <xs:enumeration value="pounds" />
    <xs:enumeration value="euros" />
    <xs:enumeration value="dollars" />
  </xs:restriction>
</xs:simpleType>

puis:

<xs:complexType>
    <xs:attribute name="currency" type="curr"/>
</xs:complexType>

Bonjour, Malheureusement, cela ne me permet pas de restreindre le type de prix à "doubler" ET l'énumération de restriction sur l'attribut "devise" en même temps
Luc

-2
<xs:element name="price" type="decimal">
<xs:attribute name="currency" type="xs:string" value="(euros|pounds|dollars)" /> 
</element> 

Cela éliminerait complètement le besoin de dénombrement. Vous pouvez changer le type pour doubler si nécessaire.


@valuene peut pas apparaître sur xs:attribute. xs:attributene peut pas apparaître comme un enfant de xs:element. Les xs:préfixes d'espace de noms nécessaires sont omis. Cette réponse est un désordre et devrait simplement être supprimée.
kjhughes
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.