旧问题的新答案
这个老问题的现有答案都无法解决真正的问题。
真正的问题是在XSD中xs:complexType
不能直接拥有xs:extension
一个孩子。解决方法是使用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
,但这也不是真正的问题。
真正的问题是在XSD中xs:complexType
不能直接拥有xs:extension
一个孩子。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>