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:complexType
ne pouvait pas avoir directementxs:extension
un enfant dans XSD. Le correctif consiste à utiliser enxs:simpleContent
premier. 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:complexType
ne pouvait pasxs:extension
un enfant dans XSD; xs:simpleContent
est 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>