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>
Réponses:
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>
la source
<xs:extension
ne peut pas être directement un enfant de<xs:complexType
mais doit également être contenu par un<xs:complexContent
ou<xs:simpleContent
.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'on
xs: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
price
dexs: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 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>
la source
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>
la source
<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.
la source
@value
ne peut pas apparaître surxs:attribute
.xs:attribute
ne peut pas apparaître comme un enfant dexs:element
. Lesxs:
préfixes d'espace de noms nécessaires sont omis. Cette réponse est un désordre et devrait simplement être supprimée.