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。