简单类型
在购买订单模式文档中,几个元素和属性被声明为简单类型,其中一些简单类型如 string 和decimal 是XML Schema 中内置的。而其他的一些则是源于( 如果使用对象技术的语言,就是继承) 内置的类型。举例来说,partNum 属性的类型称为SKU (Stock Keeping Unit) ,是源于string. 的。内置的简单类型和他们的后继版本都能够被用在所有的元素和属性声明中,下面的列表列举了所有的在XML Schema 中内置的简单类型及其相应的例子。
简单类型( 原子类型) |
值示例 |
备注 |
string |
Confirm this is electric |
|
normalizedString |
Confirm this is electric |
参见 (3) |
token |
Confirm this is electric |
参见 (4) |
byte |
-1, 126 |
参见 (2) |
unsignedByte |
0, 126 |
参见 (2) |
base64Binary |
GpM7 |
|
hexBinary |
0FB7 |
|
integer |
-126789, -1, 0, 1, 126789 |
参见 (2) |
positiveInteger |
1, 126789 |
参见 (2) |
negativeInteger |
-126789, -1 |
参见 (2) |
nonNegativeInteger |
0, 1, 126789 |
参见 (2) |
nonPositiveInteger |
-126789, -1, 0 |
参见 (2) |
int |
-1, 126789675 |
参见 (2) |
unsignedInt |
0, 1267896754 |
参见 (2) |
long |
-1, 12678967543233 |
参见 (2) |
unsignedLong |
0, 12678967543233 |
参见 (2) |
short |
-1, 12678 |
参见 (2) |
unsignedShort |
0, 12678 |
参见 (2) |
decimal |
-1.23, 0, 123.4, 1000.00 |
参见 (2) |
float |
-INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN |
等同于单精度32 位浮点数,其中”NaN ”表示”不是一个数字”。参见 (2) |
double |
-INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN |
等同于双精度64 位浮点数。参见 (2) |
boolean |
true, false,1, 0 |
|
time |
13:20:00.000, 13:20:00.000-05:00 |
参见 (2) |
dateTime |
1999-05-31T13:20:00.000-05:00 |
这个时间表示的含义是:1999 年5 月31 日美东标准时间下午1:20 ,注意后面的-05:00 表示这个时间比格林尼治时间早5 个小时。参见 (2) |
duration |
P1Y2M3DT10H30M12.3S |
这表示经过了1 年2 个月3 天又10 个小时30 分钟12.3 秒 |
date |
1999-05-31 |
参见 (2) |
gMonth |
--05-- |
表示5 月。参见 (2) (5) |
gYear |
1999 |
表示1999 年。参见 (2) (5) |
gYearMonth |
1999-02 |
表示1999 年2 月,而并不关心是几号。参见 (2) (5) |
gDay |
---31 |
表示31 号。参见 (2) (5) |
gMonthDay |
--05-31 |
表示每个5 月31 号。参见 (2) (5) |
Name |
shipTo |
XML 1.0 的Name 类型 |
QName |
po:USAddress |
XML 命名空间的QName 类型 |
NCName |
USAddress |
XML 命名空间的NCName 类型,即一个不带命名空间前缀修饰的QName |
anyURI |
http://www.example.com/, http://www.example.com/doc.html#ID5 |
|
language |
en-GB, en-US, fr |
XML 1.0 中定义的合法语言代码 |
ID |
|
XML 1.0 中定义的ID 属性类型。参见 (1) |
IDREF |
|
XML 1.0 中定义的IDREF 属性类型。参见 (1) |
IDREFS |
|
XML 1.0 中定义的IDREFS 属性类型。参见 (1) |
ENTITY |
|
XML 1.0 中定义的ENTITY 属性类型。参见 (1) |
ENTITIES |
|
XML 1.0 中定义的ENTITYS 属性类型。参见 (1) |
NOTATION |
|
XML 1.0 中定义的NOTATION 属性类型。参见 (1) |
NMTOKEN |
US, Brésil |
XML 1.0 中定义的NMTOKEN 属性类型。参见 (1) |
NMTOKENS |
US UK, Brésil Canada Mexique |
XML 1.0 中定义的NMTOKENS 属性类型,即一个使用空格作为元素分隔的NMTOKEN 列表。参见 (1) |
注意: 1. 为了在XML Schema 和XML 1.0 DTD 之间保持兼容,简单类型ID 、IDREF 、IDREFS 、ENTITY 、ENTITIES 、NOTATION 、NMTOKEN (表由一个或多个字母,数字,句点(.) ,连字号(-) 或底线(_) 所组成的一个名称,除第一个字符外,其属性设置值中也可以包含冒号(:) )、NMTOKENS 只能用在属性定义中; 2. 这个类型的值能够表示为不止一种格式,如100 和1.0E2 都是有效的float 格式,它们都表示”一百”这个数值。然而,对于这个类型而言,已经为其定义了规范的格式规则。 3. 换行符、制表符和回车符在normalizedString 中将会在处理前被转化成空格字符 4. 作为normalizedString ,相邻的空格字符将会被合并为一个空格字符,第一个和最后的空格将被移走 5. “g ”前缀表示罗马历的时间和年代。 |
新的简单类型通过从现有的简单类型( 内置的简单类型以及源于内置简单类型的简单类型) 引出定义。特别的,我们通过重新约束一个现存的简单类型来引出一个新的简单类型。换句话说,新类型的合法值范围是现有类型的值范围的子集。我们使用 simpleType 元素来定义和命名新的简单类型,我们使用 restriction 元素来指出现有的基类型。并且用它来标识约束值范围的细节 。
假设我们希望建立一个新的整数类型称为myInteger ,他的值范围为10000 到99999 。我们的定义应当基于简单类型integer ,然后定义他的值范围为10000 到99999 。为了定义myInteger ,我们这样来约束integer 的范围:
使用基类型来定义新的简单类型
<xsd:simpleType name="myInteger"> <xsd:restriction base="xsd:integer"> <xsd:minInclusive value="10000"/> <xsd:maxInclusive value="99999"/> </xsd:restriction> </xsd:simpleType>
上面的例子显示了一个由一个基本类型定义和两个值域区间方面描述的组合,通过这三个要素来对myInteger 实施了定义。
而先前的购买订单模式文档则包含了其他的更详细的定义简单类型的例子。一个叫SKU 的新简单类型( 见下清单) 是从( 通过约束) 简单类型string 引出的。此外,我们使用一个称为pattern 的描述以及pattern 的正则表达式值"\d{3}-[A-Z]{2}" 来约束SKU 的值。其中,该正则表达式值的语义为:3 个数字后面跟着一个连字号接着跟着两个大写的英文字母" 。
<xsd:simpleType name="SKU"> <xsd:restriction base="xsd:string"> <xsd:pattern value="\d{3}-[A-Z]{2}"/> </xsd:restriction> </xsd:simpleType>
XML Schema 定义了15 种用于简单类型定义描述的词汇。在这些词汇中, enumeration 是特别有用的,他能够被用于约束除boolean 类型之外的几乎每一个简单类型。 enumeration 限制简单类型的值为一系列不同的枚举值。举例来说,我们可以使用enumeration 来定义一个新类型称为 USState( 参见下例) ,USState 是从string 引出的,同时它的值必须为美国州的缩写。
<xsd:simpleType name="USState"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="AK"/> <xsd:enumeration value="AL"/> <xsd:enumeration value="AR"/> <!-- and so on ... --> </xsd:restriction> </xsd:simpleType>
USState 将会在现在使用的state 元素声明中成为string 类型的一个非常好的替换品。通过使用这个替换品可以使state 元素具有合法值的校验能力。举例来说,billTo 和shipTo 元素的子元素state ,将会被限制在AK ,AL ,AR 等等中。注意到对于特定类型的列举值必须是唯一的。
列表类型(List Type)
除了在前面描述简单类型的那个表格中列出的原子类型( 这些原子类型可用于组合成绝大多数的其他类型,包括其他的简单类型和复合类型) 外,XML Schema 中在简单类型范畴中还有列表类型的概念。( 原子类型、列表类型以及组合类型,总称为简单类型 ) 。一个原子类型的值在XML Schema 中是不可分割的。举例来说,NMTOKEN 值US 是不可分割的,US 的任何部分,如字母S 本身都是没有意义的。与之相比较,列表类型则是由一组原子类型组成 ,因此它的每一个部分( 原子) 本身都是有意义的。举例来说NMTOKENS 是个列表类型。这个类型的元素将是NMTOKEN 的列表,不同的 NMTOKEN 值间使用空格分隔,如"US UK FR" 。XML Schema 有三个内置的列表类型,他们是NMTOKENS 、IDREFS 和ENTITIES 。
除了使用内置的列表类型之外,你还可以通过引用现有的原子类型来建立新的列表类型( 你不可以使用现有的列表类型来建立新的列表类型。也不能使用复合类型来建立新的列表类型 ) 。举例来说,我们可以建立一个名为myInteger 的列表类型,并在实例文档中使用它( 参见下图) 。其中下例中的后半部分即为实例文档中与列表类型 listOfMyIntType 相一致的实例元素。
<!-- Schema Fragment --> <xsd:simpleType name="listOfMyIntType"> <xsd:list itemType="myInteger"/> </xsd:simpleType> <!-- Instance Fragment --> <listOfMyInt>20003 15037 95977 95945</listOfMyInt>
一些用于描述的参数能够被应用到列表类型的定义中,它们是:length 、minLength 、maxLength 和enumeration 。举例来说,如果我们想定义一个列表,这个列表正好包含了六个美国的州名(SixUSStates) 。我们首先从USState 定义了一个新的列表类型,称为 USStateList ,然后我们通过限制USStateList 只有六个项来导出SixUSStates 。具体的定义可参见下例。
<!-- Schema Fragment --> <xsd:simpleType name="USStateList"> <xsd:list itemType="USState"/> </xsd:simpleType> <xsd:simpleType name="SixUSStates"> <xsd:restriction base="USStateList"> <xsd:length value="6"/> </xsd:restriction> </xsd:simpleType> <!-- Instance Fragment --> <sixStates>PA NY CA NY LA AK</sixStates>
类型为SixUSStates 的元素必须有六个项,他们中的每一个必须是一个枚举类型USState 的原子类型,在上例后半部分的实例文档中就是一个具体的应用例子。
此时,需要注意的是,可以从原子类型string 导出一个列表类型,然而,在一个string 中也许会带有空格,而空格在一个列表类型实例中是作为分隔符使用的。所以当在使用基类型为string 的列表类型时,应当格外小心 。举例来说,假设我们定义了一个length 取值为3 的列表类型,同时这个列表类型是基于类型string 。以下由三个元素组成的列表是合法的:"Asie Europe Afrique" ,而下面的由三个元素组成的列表则是不合法的:"Asie Europe Am érique Latine" 。
即使"Am érique Latine" 在列表外可以作为单独的一个字符串存在,但当它包含在列表中,在Am érique 和Latine 之间的空格使得第四个项被有效地生成了,因此后面的那个例子不符合只有三个项的列表类型定义。
联合类型(Union Type)
应用原子类型和列表类型,一个元素或者属性的值可以为一个或者多个原子类型( 列表类型) 的实例。与之相比较,如果应用联合类型,一个联合类型包含了多个原子类型或者列表类型,而应用了联合类型的元素或是属性的值可以是这些原子类型或列表类型中的一个类型的实例。为了显示这点,我们建立一个用于表示美国的州的,为两个字母缩写或者数字列表的联合类型。zipUnion 联合类型由一个原子类型和一个列表类型构成的( 参见下例) 。
<!-- Schema Fragment --> <xsd:simpleType name="zipUnion"> <xsd:union memberTypes="USState listOfMyIntType"/> </xsd:simpleType> <!-- Instance Fragment --> <zips>CA</zips> <zips>95630 95977 95945</zips> <zips>AK</zips>
当我们在定义一个联合类型时,元素union 的memberTypes 属性的值包含了联合类型中所有类型的列表 。现在,假定我们声明了一个zipUnion 类型的元素,称为zips ,zips 元素有效的实例可参见上例。
此外,对于联合类型而言,还有两个描述性质的参数pattern 和enumeration 也可以应需要使用 。