我有以下XML标记
<price currency="euros">20000.00</price>
如何将currency属性限制为以下值之一:
价格是双倍吗?
我只是得到一个错误,当我尝试在这两个类型,这是我到目前为止:
<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>
发布于 2012-01-19 20:47:31
您的价格定义中似乎缺少该数值。尝试以下操作:
<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>
发布于 2015-10-23 21:07:50
旧问题的新答案
这个老问题的现有答案都没有解决真正的问题。
真正的问题是xs:complexType
在XSD中不能直接将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>
备注
price
的内容类型从xs:string
更改为xs:decimal
,但这不是严格必要的,也不是真正的问题所在。xs:decimal
,但这也不是真正的问题。真正的问题是不能让xs:complexType
在XSD中直接拥有一个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>
发布于 2012-01-19 20:16:02
您需要创建一个类型,并创建该类型的属性:
<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>
https://stackoverflow.com/questions/8925706
复制相似问题