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