web-dev-qa-db-fra.com

Schéma XML Comment limiter un attribut par énumération

J'ai la balise XML suivante

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

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

  • euros
  • livres sterling
  • dollars

ET le prix d'un double?

Je viens de recevoir une erreur lorsque j'essaie de taper sur les deux types, voici ce que j'ai jusqu'à présent:

<xs:element name="price">
    <xs:complexType>
        <xs:attribute name="currency" type="xs:string">
            <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>
82
Luke

La valeur numérique semble être absente de 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>
111
user998692

Nouvelle réponse à une vieille question

Aucune des réponses existantes à cette ancienne question ne traite du problème réel .

Le vrai problème était que xs:complexType _ ne peut pas avoir directement un xs:extension en tant qu'enfant dans XSD. Le correctif est d'utiliser xs:simpleContent première. Les détails suivent ...


Votre XML,

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

sera valable contre soit 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 commenté par @Paul , ils changent 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.
  • En tant que avec @ user998692 , vous pouvez séparer la définition de devise et vous pouvez passer à xs:decimal _, mais ce n'était pas non plus le vrai problème.

Le vrai problème était que xs:complexType _ ne peut pas avoir directement un xs:extension en tant qu'enfant dans XSD; xs:simpleContent est nécessaire en premier.

Une question connexe (qui n’a pas été posée mais peut avoir confondu d’autres réponses):

Comment pourrait-on restreindre price étant donné qu'il possède un attribut?

Dans ce cas, une définition globale distincte de priceType serait nécessaire; il n'est pas possible de faire cela avec seulement des définitions de types locaux.

Comment restreindre le contenu d'un élément lorsque cet é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>
21
kjhughes

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>
7
A.B.Cade