除了通过扩展派生复杂类型外,还可以通过限制派生新的复杂类型。复杂类型的限制跟简单类型的限制基本上是一致,唯一的区别是复杂类型需要对类型声明。
限制简单内容
与扩展内容不同的是,限制简单内容的基类型必须是具有简单内容的复杂类型,而不是简单类型。因为简单类型的限制是另外一个简单类型,而不是复杂类型。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="telephone" type="restrictedTelType"/>
<xs:complexType name="telType">
<xs:simpleContent>
<xs:extension base="xs:token">
<xs:attribute name="type" type="xs:token"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="restrictedTelType">
<xs:simpleContent>
<xs:restriction base="telType">
<xs:pattern value="\d{3,4}-\d{7,8}"/>
<xs:attribute name="type">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="Office"/>
<xs:enumeration value="Home"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
限制纯元素内容
对纯元素内容进行限制,可以限制元素的内容或属性的取值,以及删除元素和属性,对从基类型保留下来的元素和内容需要重新声明。如果要删除元素,需要注意minOccurs的取值,如果是1,则对该元素的限制不起作用。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="people" type="restrictionPeopleType"/>
<xs:complexType name="peopleType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer" minOccurs="1"/>
<xs:element name="email" type="xs:token" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="restrictionPeopleType">
<xs:complexContent>
<xs:restriction base="peopleType">
<xs:sequence>
<xs:element name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Jwt"/>
<xs:enumeration value="Xhn"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="normal"/>
<xs:enumeration value="temp"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:schema>
限制混合内容
从具有混合内容的复杂类型限制派生,可以得到混合内容的复杂类型、纯元素的复杂类型、简单内容的复杂类型,甚至是空内容的复杂类型。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="emp" type="empType"/>
<xs:complexType name="empType" mixed="true">
<xs:sequence>
<xs:element name="name" type="xs:string" minOccurs="0"/>
<xs:element name="age" type="xs:integer" minOccurs="0"/>
<xs:element name="email" type="xs:token" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<!--混合内容的复杂类型-->
<xs:complexType name="resEmpType1" mixed="true">
<xs:complexContent>
<xs:restriction base="empType">
<xs:sequence>
<xs:element name="name">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Jwt"/>
<xs:enumeration value="Hnw"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!--纯元素复杂类型-->
<xs:complexType name="resEmpType2">
<xs:complexContent>
<xs:restriction base="empType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="email" type="xs:token" minOccurs="1"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<!--简单类型的复杂类型-->
<xs:complexType name="resEmpType3" mixed="true">
<xs:complexContent>
<xs:restriction base="empType"/>
</xs:complexContent>
</xs:complexType>
<!--空内容-->
<xs:complexType name="resEmpType4">
<xs:complexContent>
<xs:restriction base="empType"/>
</xs:complexContent>
</xs:complexType>
</xs:schema>
限制空内容
限制空内容只能对基类型的属性进行限制,派生内容也必须有空内容。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLschema">
<xs:element name="employee" type="empType"/>
<xs:complexType name="empType">
<xs:simpleContent>
<xs:attribute name="number" type="xs:string"/>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="resEmpType1">
<xs:simpleContent>
<xs:restriction base="empType"/>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="resEmpType2">
<xs:complexContent>
<xs:restriction base="empType">
<xs:attribute name="number" type="xs:string" use="required"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:schema>