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:complexTypenie można bezpośrednio miećxs:extensiondziecka w XSD. Poprawką jest użycie jakoxs:simpleContentpierwsze. 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
pricez xs:stringna 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:complexTypenie można bezpośrednio mieć xs:extensiondziecka w XSD; xs:simpleContentjest potrzebny jako pierwszy.
Powiązana sprawa (która nie została zadana, ale mogła pomieszać inne odpowiedzi):
Jak można pricebyło ograniczyć, biorąc pod uwagę, że ma atrybut?
W takim przypadku priceTypepotrzebna 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>