XML Schema如何通过枚举限制属性
我有以下的XML标签
<price currency="euros">20000.00</price>
如何限制货币属性为以下一种:
- 欧元
- 英镑
- 美元
价格是双倍的?
当我尝试使用两种types时,我只是得到一个错误,这是迄今为止:
<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>
数值似乎从您的价格定义中缺失。 尝试以下操作:
<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:complexType
在XSD中不能直接拥有xs:extension
作为子项。 解决方法是先使用xs:simpleContent
。 详细信息…
你的XML,
<price currency="euros">20000.00</price>
将针对以下任一更正的XSD生效:
本地定义的属性types
<?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>
全局定义的属性types
<?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
的内容types从xs:string
更改为xs:decimal
,但这不是严格必要的,也不是真正的问题。 - 正如@ user998692所回答的那样 ,您可以将货币的定义分开,您可以将其更改为
xs:decimal
,但这也不是真正的问题。
真正的问题是, xs:complexType
不能直接在XSD中有一个xs:extension
作为子项; 首先需要xs:simpleContent
。
一个相关的问题(这是没有问,但可能混淆了其他答案):
考虑到它有一个属性, price
怎么能被限制呢?
在这种情况下,需要一个单独的priceType
全局定义; 只有本地types定义才能做到这一点。
元素具有属性时如何限制元素内容
<?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>
你需要创build一个types,并创build该types的属性:
<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>
这将完全消除枚举的需要。 如果需要,你可以改变types。