簡單類型
在購買訂單模式文檔中,幾個元素和屬性被聲明爲簡單類型,其中一些簡單類型如 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 也可以應需要使用 。