XML-схема Как ограничить атрибут путем перечисления
У меня есть следующий тег XML
<price currency="euros">20000.00</price>
Как ограничить атрибут валюты одним из следующих:
И цена удваивается?
Я просто получаю сообщение об ошибке, когда я пытаюсь установить тип на обоих, вот что у меня до сих пор:
<xs:element name="price">
<xs:complexType>
<xs:attribute name="currency" type="xs:string">
<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:complexType>
</xs:element>
Ответы
Ответ 1
Числовое значение, по-видимому, отсутствует в определении цены.
Попробуйте следующее:
<xs:simpleType name="curr">
<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:extension base="xs:decimal">
<xs:attribute name="currency" type="curr"/>
</xs:extension>
</xs:complexType>
</xs:element>
Ответ 2
Новый ответ на старый вопрос
Ни один из существующих ответов на этот старый вопрос не затрагивает реальную проблему .
Реальная проблема заключалась в том, что 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>
Ответ 3
вам нужно создать тип и сделать атрибут этого типа:
<xs:simpleType name="curr">
<xs:restriction base="xs:string">
<xs:enumeration value="pounds" />
<xs:enumeration value="euros" />
<xs:enumeration value="dollars" />
</xs:restriction>
</xs:simpleType>
тогда:
<xs:complexType>
<xs:attribute name="currency" type="curr"/>
</xs:complexType>
Ответ 4
<xs:element name="price" type="decimal">
<xs:attribute name="currency" type="xs:string" value="(euros|pounds|dollars)" />
</element>
Это позволит полностью исключить необходимость перечисления.
При необходимости вы можете изменить тип, чтобы удвоить.