Nuova risposta alla vecchia domanda
Nessuna delle risposte esistenti a questa vecchia domanda affronta il vero problema.
Il vero problema era chexs:complexType
non può avere direttamentexs:extension
un figlio in XSD. La soluzione è usarexs:simpleContent
prima. Seguono i dettagli ...
Il tuo XML,
<price currency="euros">20000.00</price>
sarà valido contro uno dei seguenti XSD corretti:
Tipo di attributo definito localmente
<?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>
Tipo di attributo definito a livello globale
<?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>
Appunti
- Come commentato da @Paul , questi cambiano il tipo di contenuto
price
da xs:string
a xs:decimal
, ma questo non è strettamente necessario e non era il vero problema.
- Alla risposta di @ user998692 , potresti separare la definizione di valuta e potresti passare a
xs:decimal
, ma anche questo non era il vero problema.
Il vero problema era che xs:complexType
non può avere direttamente xs:extension
un figlio in XSD; xs:simpleContent
è necessario prima.
Una questione correlata (che non è stata richiesta ma potrebbe aver confuso altre risposte):
Come potrebbe price
essere limitato dato che ha un attributo?
In questo caso, priceType
sarebbe necessaria una definizione globale separata di ; non è possibile farlo solo con definizioni di tipo locale.
Come limitare il contenuto dell'elemento quando l'elemento ha un attributo
<?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>