基于 XSD 中的另一个属性强制验证次要属性
Enforcing validation of a secondary attribute based on another attribute in XSD
问题
如果 basetype
是 "percent"
,有没有办法强制 subtype
成为 "percent"
?
我的意思是,如果 basetype
是 "percent"
但 subtype
不是 "percent"
,验证会失败吗?
XML部分
<quantity name="abc" basetype="percent" value="2" subtype="percent"/>
XSD 相关部分
<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>
XSD 1.0
XSD 1.0 不能代表你的约束。
XSD 1.1
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>
问题
如果 basetype
是 "percent"
,有没有办法强制 subtype
成为 "percent"
?
我的意思是,如果 basetype
是 "percent"
但 subtype
不是 "percent"
,验证会失败吗?
XML部分
<quantity name="abc" basetype="percent" value="2" subtype="percent"/>
XSD 相关部分
<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>
XSD 1.0
XSD 1.0 不能代表你的约束。
XSD 1.1
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>