6 复杂元素描述
复杂元素指包含属性或子元素的XML元素,如:<student name=”Li” sex=”男”>,主要包括下列四类:
l 空元素:只包含属性的元素。如:<student name=”li” />;
l 只包含属性与子元素的元素。如:
<name type=”realname”>
<firstname>Jack</firstname>
<lastname>Tom</lastname>
</name>
l 只包含属性与text的元素。如:
<name type=”firstname”>Jack</name>
l 只包含属性、text和子元素的元素。如:
<name type=”realname”>
Your name is:
<firstname>xxx</firstname>
<lastname>xxx</lastname>
</name>
复杂元素是一种复杂类型,可以使用下面两种描述方式,一是复合结构,二是分离结构。复合结构,则直接将复杂类型定义为复杂元素的子元素;分离结构则是将复杂类型定义在外部,由复杂元素引用。
l 复合结构
<xs:element name="xxx">
<xs:complexType>
...
</xs:complexType>
</xs:element>
l 分离结构
<xs:element name="xxx" type=”yyy” />
<xs:complexType name=”yyy”>
...
</xs:complexType>
这两种描述结构也适合于属性、简单元素的描述。如果XSD元素中存在大量可复用的自定义数据类型时,建议使用分离式的定义结构。
6.1 数据类型
XSD的数据类型包括基本数据类型、简单数据类型、复杂数据类型三类。基本数据类型指W3C标准定义的数据类型,主要包括xs:integer、xs:string、xs:date、xs:boolean等。简单数据类型是基本数据类型的扩展,对取值进行约束;复杂数据类型则是一个复杂的数据结构,通常包含了属性或子元素定义。
(1) 简单类型
简单类型扩展基本数据类型,并对值施加一定的约束。如:
<xs:simpleType name="XSDSimpleType">
<xs:restriction base="dateTime">
<xs:enumeration value="value1" />
<xs:enumeration value="value2" />
<xs:enumeration value="value3" />
</xs:restriction>
</xs:simpleType>
或
<xs:simpleType name="XSDSimpleType">
<xs:list itemType="dateTime">
<xs:enumeration value="value1" />
<xs:enumeration value="value2" />
<xs:enumeration value="value3" />
</xs:list>
</xs:simpleType>
或
<xs:simpleType name="XSDSimpleType">
<xs:union memberTypes="dateTime">
<xs:enumeration value="value1" />
<xs:enumeration value="value2" />
<xs:enumeration value="value3" />
</xs:union>
</xs:simpleType>
(2) 复杂类型
复杂类型通常是复杂元素的数据类型或复杂元素的子元素,描述复杂元素的子元素、属性以及子元素与属性的类型。参看后续各小节的描述。
6.2 约束
约束指对简单类型的元素或属性施加的值约束条件,主要包含范围约束、长度约束、枚举值、模式匹配、空白处理等,是XSD元素或属性值限制的基础。
(1) 范围约束
范围约束主要施加到数值型、日期型等类型,限制取值的范围。如:
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
上述范围约束限定的取值范围是:0<=值<=120。
其他的值范围约束元素主要包括:
l fractionDigits 设置最大小数位数
l totalDigits 指定精确的数值位数
l maxExclusive 设置数值型的最大值(val < xxx)
l maxInclusive 设置数值型的最大值(val <= xxx)
l minExclusive 设置数值型的最小值(val > xxx)
l minInclusive 设置数值型的最小值(val >= xxx)
(2) 长度约束
长度约束施加到任何类型上限制值的长度,包括<xs:length>固定长度、<xs:maxLength>最大长度、<xs:minLength>最小长度三个限定元素。如:
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
<xs:restriction base="xs:string">
<xs:minLength value="5"/>
<xs:maxLength value="8"/>
</xs:restriction>
(3) 枚举值约束
枚举值约束限制元素或属性的值只能在给定的值列表中取值,并使用base属性指示值的数据类型。如:
<xs:restriction base="xs:string">
<xs:enumeration value="CNY"/>
<xs:enumeration value="USD"/>
<xs:enumeration value="JPY"/>
</xs:restriction>
(4) 模式匹配约束
模式匹配约束限制元素或属性的值应满足给定的模式要求,并使用base属性指示值的数据类型。如:
<xs:restriction base="xs:string">
<xs:pattern value="[a-z]"/>
</xs:restriction>
以下是些模式匹配的示例:
l [a-z] a-z间的单个字符;
l [A-Z][A-Z] 两个字符,每个字符都在A-Z间;
l [a-zA-Z] a-z或A-Z间的单个字符;
l [abc] 单个字符 a或b或c;
l ([a-z])* 零个或任意个字符a-z;
l ([a-z][A-Z])+ 一个或任意个字符对,每对字符大小写间隔出现;
l "a"|"b" 值只能是a或b,与枚举类似;
l [a-zA-Z0-9]{8} 精确的八个a-z或A-Z或0-9间的字符。
(5) 空白处理约束
空白处理约束限制XML文档解析器如何处理值的组成空白字符,使用<xs:whitespace>限定元素指示。如:
<xs:restriction base="xs:string">
<xs:whiteSpace value="replace"/>
</xs:restriction>
value可能的取值包括:
l replace 删除内容中的全部空白;
l preserve 保留内容中的全部空白;
l collapse 删除前导、后导空白,替换内容中的一个或多个空白为一个空格;
6.3 属性
属性本身总是定义为简单类型的。属性可以指定缺省值、固定值、强制项、约束等属性。属性定义格式是:<xs:attribute name="xxx" type="ttt" [default="ddd"] [fixed="fff"] [use="required"] >。
如:
<xs:attribute name="orderid" type="xs:string" use="required"/>
或
<xs:attribute name="orderid" >
<xs:simpleType name="orderIdType">
<xs:restriction base="string">
<xs:pattern value="[A-Z]"d{8}" />
</xs:restriction>
</xs:simpleType>
</xs:attribute>
或
<xs:attribute name="orderid" type="orderIdType" />
<xs:simpleType name=" orderIdType">
<xs:restriction base="string">
<xs:pattern value="[A-Z]"d{8}" />
</xs:restriction>
</xs:simpleType>
6.4 空元素描述
空元素通常使用<xs:complexType>描述:
<xs:element name="product">
<xs:complexType>
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
或使用<xs:simpleContent>描述,这种格式通常在元素包含属性和文本时使用。
<xs:element name="product">
<xs:complexType>
<xs:simpleContent>
<xs:restriction base="xs:integer">
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
</xs:element>
或者使用分离结构描述。