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:
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>
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>
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:
<?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>
<?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>
price
de xs:string
à xs:decimal
, mais ce n'est pas strictement nécessaire et ce n'était pas le vrai problème.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.
<?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>
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>