当从简单类型或具有简单内容的复杂类型派生复杂类型时(注意:简单内容直接或间接派生出来的复杂类型也必须是简单内容,简单内容不能派生复杂内容),使用xs:simpleContent元素,如果是扩展派生,使用xs:extension元素,如果是限制派生,使用xs:restriction元素。
扩展派生
通过扩展派生的复杂类型,他的有效内容模型是基类型的内容模型加上扩展的内容模型。
扩展简单内容
扩展简单内容可以从简单类型或具有简单内容的复杂类型扩展。由于不能通过扩展简单内容来得到复杂内容,因此对简单内容的扩展只能是添加新的属性。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="employee" type="expandEmpType"/>
<xs:complexType name="empType">
<xs:simpleContent>
<xs:extension base="xs:token">
<xs:attribute name="number" type="xs:token" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="expandEmpType">
<xs:simpleContent>
<xs:extension base="empType">
<xs:attribute name="birthdate" type="xs:date" use="required"/>
</xs:extension>
</xs:simpleContent>
</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="expandEmpType"/>
<xs:complexType name="expandEmpType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="number" type="xs:string" use="required"/>
<xs:attribute name="birthdate" type="xs:date" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
从简单类型扩展
扩展纯元素内容
从纯元素内容的复杂类型扩展,我们可以在基类型的内容模型最后添加新的与元素或属性。模式处理器会把基类型的内容模型和新增的内容模型合并到一个sequence中。注意不能对一个all组的基类型进行扩展添加新的元素(添加属性是可以的)。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="fruit" type="expandedFruitType"/>
<xs:complexType name="fruitType">
<xs:complexContent>
<xs:restriction base="xs:anyType">
<xs:sequence>
<xs:element name="Apple" type="xs:string"/>
<xs:element name="Pear" type="xs:string"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="expandedFruitType">
<xs:complexContent>
<xs:extension base="fruitType">
<xs:sequence>
<xs:element name="Banane" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
扩展混合内容
混合内容的扩展跟纯元素的扩展类似,唯一的要求是派生类型也必须具有混合内容,也就是mixed=true。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="employee" type="expandedEmpType"/>
<xs:complexType name="empType" mixed="true">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="expandedEmpType" mixed="true">
<xs:complexContent>
<xs:extension base="empType">
<xs:sequence>
<xs:element name="salary" type="xs:integer"/>
</xs:sequence>
</xs:extension>
</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="extendedEmpType"/>
<xs:complexType name="empType">
<xs:attribute name="number" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="extendedEmpType" mixed="true">
<xs:complexContent>
<xs:extension base="empType">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
<xs:attribute name="remark" use="required"/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>