如果subtype
为"percent"
,有没有办法强制basetype
成为"percent"
?
我的意思是,如果basetype
为"percent"
但subtype
不是"percent"
,则验证失败?
<quantity name="abc" basetype="percent" value="2" subtype="percent"/>
<xs:element name="thing">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="basetype" type="basetype" use="required"/>
<xs:attribute name="value" type="xs:double" use="required"/>
<xs:attribute name="subtype" type="subtype" use="required"/>
</xs:complexType>
</xs:element>
<xs:simpleType name="basetype">
<xs:restriction base="xs:string">
<xs:enumeration value="fixed"/>
<xs:enumeration value="percent"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="subtype">
<xs:restriction base="xs:string">
<xs:enumeration value="foo"/>
<xs:enumeration value="percent"/>
<xs:enumeration value="bar"/>
</xs:restriction>
</xs:simpleType>
答案 0 :(得分:1)
XSD 1.0无法代表您的约束。
XSD 1.1可以使用xs:assert
表示您的约束:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
vc:minVersion="1.1">
<xs:element name="quantity">
<xs:complexType>
<xs:attribute name="name" type="xs:string" use="required"/>
<xs:attribute name="basetype" type="basetype" use="required"/>
<xs:attribute name="value" type="xs:double" use="required"/>
<xs:attribute name="subtype" type="subtype" use="required"/>
<xs:assert test="(@basetype != 'percent') or (@subtype = 'percent')"/>
</xs:complexType>
</xs:element>
<xs:simpleType name="basetype">
<xs:restriction base="xs:string">
<xs:enumeration value="fixed"/>
<xs:enumeration value="percent"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="subtype">
<xs:restriction base="xs:string">
<xs:enumeration value="foo"/>
<xs:enumeration value="percent"/>
<xs:enumeration value="bar"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>