Nowa odpowiedź na stare pytanie
Żadna z istniejących odpowiedzi na to stare pytanie nie rozwiązuje rzeczywistego problemu.
Prawdziwym problemem było to, żexs:complexType
nie można bezpośrednio miećxs:extension
dziecka w XSD. Poprawką jest użycie jakoxs:simpleContent
pierwsze. Szczegóły poniżej ...
Twój XML,
<price currency="euros">20000.00</price>
będzie obowiązywał w stosunku do jednego z następujących poprawionych XSD:
Typ atrybutu zdefiniowany lokalnie
<?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>
Globalnie zdefiniowany typ atrybutu
<?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>
Uwagi
- Jak skomentował @Paul , zmieniają one typ zawartości
price
z xs:string
na xs:decimal
, ale nie jest to absolutnie konieczne i nie stanowiło prawdziwego problemu.
- Jak odpowiedział @ user998692 , możesz oddzielić definicję waluty i zmienić na
xs:decimal
, ale to też nie był prawdziwy problem.
Prawdziwym problemem było to, że xs:complexType
nie można bezpośrednio mieć xs:extension
dziecka w XSD; xs:simpleContent
jest potrzebny jako pierwszy.
Powiązana sprawa (która nie została zadana, ale mogła pomieszać inne odpowiedzi):
Jak można price
było ograniczyć, biorąc pod uwagę, że ma atrybut?
W takim przypadku priceType
potrzebna byłaby oddzielna, globalna definicja ; nie można tego zrobić tylko z definicjami typu lokalnego.
Jak ograniczyć zawartość elementu, gdy element ma atrybut
<?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>