Нова відповідь на старе запитання
Жодна з існуючих відповідей на це старе питання не стосується справжньої проблеми.
Справжня проблема полягала в тому, що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>