Новый ответ на старый вопрос
Ни один из существующих ответов на этот старый вопрос не решает реальной проблемы.
Настоящая проблема заключалась в том, чтоxs:complexType
нельзя напрямую иметьxs:extension
дочерний элемент в XSD. Исправление заключается в использовании вxs:simpleContent
первую очередь. Подробности следуют ...
Ваш XML,
<price currency="euros">20000.00</price>
будет действителен для любого из следующих исправленных XSD:
Локально определенный тип атрибута
<?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>
Примечания
- Как прокомментировал @Paul , они действительно меняют тип содержимого
price
с xs:string
на xs:decimal
, но это не является строго необходимым и не является реальной проблемой.
- Как ответил @ user998692 , вы могли выделить определение валюты и изменить на
xs:decimal
, но это тоже не было реальной проблемой.
Настоящая проблема заключалась в том, что xs:complexType
нельзя напрямую иметь xs:extension
дочерний элемент в XSD; xs:simpleContent
нужен в первую очередь.
Связанный вопрос (который не задавали, но, возможно, запутали другие ответы):
Как можно price
ограничить, учитывая, что у него есть атрибут?
В этом случае priceType
потребуется отдельное глобальное определение ; это невозможно сделать только с определениями локального типа.
Как ограничить содержимое элемента, если у элемента есть атрибут
<?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>