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>
Luke
la source
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>
user998692
la source
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>
kjhughes
la source
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>
ABCade
la source
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.

Nachiket Kulkarni
la source
@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