派生复杂类型
一.扩展,限制派生复杂类型:
复杂类型都是通过限制或扩展其他的类型来派生,通过限制派生的新类型的值范围是基类型值范围的自己,新类型的所有实例对于基类型也是有效的,而扩展则可以为现有类型添加新的元素和属性,基类型的实例对于扩展类型不一定有效。
从简单类型或另一个具有简单内容的复杂类型派生复杂类型时,使用xs:simpleContent元素。如果是扩展派生(泰安家属性),则再xs:simpleContent元素内部使用xs:extension元素。如果是限制派生,则在xs:simpleContent元素内部使用xs:restricton元素。
如果复杂类型具有简单内容,那么所直接或间接派生于它的类型也必须具有简单内容。
复杂内容包括3中内容类型:纯元素类型,混合类型和空元素类型。
当从具有复杂内容的另一个复杂类型来派生复杂类型时,使用xs:complexContent元素。如果是扩展派生(添加元素或属性),则再xs:complexContent元素内部使用xs:extension元素;如果是限制派生(限制基类型的内容模型或属性),则再xs:complexContent元素内部使用xs:restriction元素。
|
需要注意的是:
1.
2.
3.
4.
二.在实例文档中使用派生类型:
我们可以使用xsi:type属性可以直接为元素制定及类型,xsi:type属性是Schema实例名称空间http://www.w3.org/2001/XMLSchema-instance的一部分。因此在使用type属性前,声明schema实例名称空间。
三.替换组:
使用替换组,允许在内容模型中声明的某个元素被其他元素所替换。替换组由头元素和替换成员组成,头元素和他的替换元素都必须作为全局元素声明,替换成员必须和头元素有相同的类型,或者他们的类型是头元素派生类型。头元素是普通的全局元素,但他的替换元素则需使用一个特殊的属性substitutionGroup,该属性用于指定要替换的头元素的名字。
四.抽象元素和类型:
可以使用xs:element和xs:complexType元素的abstract属性设置为true,来将元素或者类型声明成抽象的。抽象的元素和类型不能在实例文档中使用。将一个元素声明成抽象的,就需要使用替换组,在实例文档中用替换组成员来代替抽象元素。将一个元素对应的类型定义声明为抽象的,那么该元素所有实例必须使用xsi:type属性类指定一个非抽象的派生类型。
五.控制派生类型的创建和使用:
可以使用xs:complexType元素的final属性来控制类型的派生,使用xs:block属性来控制再试文档中使用派生元素。
除了在xs:complexType元素使用block属性,还可以在xs:element元素上使用,他的取值除了包含xs:complexType元素的block属性外,还可以包含值substitution,表示阻止替换组中的成员来替换该元素。