旧问题的新答案
对于这个旧问题,所有现有的答案都没有解决真正的问题。
真正的问题在于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
。
一个相关的问题(虽然没有被问到,但可能会混淆其他答案):
如果元素具有属性,如何限制元素内容?
在这种情况下,需要一个单独的全局定义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>