复杂类型
复杂类型可以是命名的,也可以是匿名的。命名的复杂类型可以被多个元素所引用,他们总是在全局范围内被定义(父元素总是xs:schema或xs:redefine);匿名的复杂类型总是在元素声明内部定义,只能被该声明所引用。
一.从简单类型到复杂类型:
之前说过简单类型就是只含有字符数据,所以要想把简单类型转换成复杂类型就是在简单类型的基础上添加属性或者子元素。大家都知道,复杂类型要么具有简单内容,要么具有复杂内容。所以将简单类型转化为复杂类型就有两个方向,一个是向简单内容方向转化,也就是在原来基础上添加属性,schema中使用xs:simpleContent元素定义;一个就是向复杂内容方向转化,就是要至少添加子元素,使用xs:complexContent标签。
Ø
永远不变的前两行省略
<xs:complexType>
</xs:complexType>
</xs:element>
Ø
<xs:complexContent>
<xs:restriction base=”XXXX”>若base为xs:anyType则此句和上一句可省略。
<xs:sequnence>
……
</xs:sequnence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
二.xs:attribute元素的use、default和fixed属性:
use属性是用来规定该属性在实例文档中出现的必要性。它有三个属性:
Ø
Ø
Ø
|
schema中可以通过default属性对该属性提供一个默认值,在实例文档中若没指定该属性,则该属性就使用默认值。所以若用default,则use属性是optional才有意义。若想让属性值固定下来,则可使用fixed提供一个默认值,若使用此属性,则use属性的值应是optional,若属性出现必须是fixed值指定的值。
三.anyType
anyType是派生所有简单和复杂类型的基类型,是他XML Schema中所有类型的祖先类型,它没有任何形式的约束。若声明成anyType,则可以是属性,可以是纯字符数据,可以是带有子元素的,都可以。不推荐使用。
四.纯元素内容:
纯元素内容就是该元素的内容只包含子元素,而没有字符数据,我们可以使用模型组来构建纯元素内容模型,模型组有三种:
Ø
Ø
Ø
五.元素的出现指示符:
在all组中生命的元素都不能出现超过一次。
全局声明的元素不能够包含minOccurs、maxOccurs属性。
一.元素的默认值和固定值:
除了属性能有默认值外,元素也可以有默认值。元素的默认值使用xs:element元素的default属性来定义。需要注意的是:只有当元素在实例文档中出现且内容为空时,元素的值才等于声明中default属性的值;如果元素在实例文档中并不出现,模式处理器则根本不认为该元素出现。例:<format></format>或者<format/>此两种都为空。若需要强制指定一个属性则使用fixed属性,元素即使有值,也会使用默认值。
default和fixed属性不能同时使用。
二.空元素:
即声明一个复杂类型,其中只有属性的声明。
三.混合内容:
如果一个元素既可以包含子元素,又可以包含字符数据,那么称元素的内容为混合的内容。
例如
模式文档中,声明如下:
<xs:complextype name=”empType” mixed=”true”>
<xs:sequence>
<xs:element name=”name” type=”xs:token”/>
…
实例文档中,可以是如下的形式:
<employee>
…
四.元素组:
在模式定义时,默写元素可能作为多个元素的子元素使用,那么我们可以通过<xs:group>元素来声明,元素组中的元素应该声明为全局元素。
我们来看个例子:
<xs:group name=”empGroup”>
<xs:sequnence>
<xs:element name=”name” type=”xs:token”/>
<xs:element name=”age” type=”xs:positiveInteger”/>
</xs:sequnence>
</xs:group>
<xs:complexType name=”empType”>
<xs:sequnence>
<!--引用元素组-->
<xs:group ref=”empGroup”/>
…
在xs:group元素中不能直接包含xs:element元素,必须使用模型组;并且xs:group元素本身和它内部的模型组都不能使用出现指示符,如果希望模型组的内容多次出现,则可在引用元素组时使用出现指示符。
十.属性组:
与元素组相对,可以使用attributeGroup元素来声明元素组。
需要注意的是,对属性组的引用必须在复杂类型定义最后。
十一. 通配符:
在schema中有两类通配符:元素通配符和属性通配符。
1.元素通配符:
元素通配符使用xs:any元素作为占位符使用,它有4个属性:
Ø
Ø
以上两个属性,不会限定子元素的出现次数。
Ø
namespace还有其他三个值:
ü
ü
ü
Ø
该属性的有效值如下:
²
²
²
2.属性通配符: