XML Schema幫你建模(4)
發(fā)布時間:2008-09-07 閱讀數(shù): 次 來源:網(wǎng)樂原科技
列表類型
除了使用簡單類型中描述的原子類型(這些原子類型可用于組合成絕大多數(shù)的其它類型,包括其它的簡單類型和復(fù)合類型)外,XML Schema中在簡單類型范疇中還有列表類型(List Type)的概念。原子類型、列表類型以及聯(lián)合類型,總稱為簡單類型。一個原子類型的值在XML Schema中是不可分割的。舉例來說,NMTOKEN值US是不可分割的,US的任何部分,如字母S本身都是沒有意義的。與之相比較,列表類型則是由一組原子類型組成,因此它的每一個部分(原子)本身都是有意義的。舉例來說NMTOKENS是個列表類型。這個類型的元素將是NMTOKEN的列表,不同的NMTOKEN值間使用空格分隔,如“US UK FR”。XML Schema有三個內(nèi)置的列表類型,它們是NMTOKENS、IDREFS和ENTITIES。
除了使用內(nèi)置的列表類型之外,還可以通過引用現(xiàn)有的原子類型建立新的列表類型(不可以使用現(xiàn)有的列表類型來建立新的列表類型,也不能使用復(fù)合類型來建立新的列表類型)。舉例來說,我們可以建立一個名為myInteger的列表類型,并在實例文檔中使用它(參見代碼10)。其中代碼10中的后半部分即為實例文檔中與列表類型listOfMyIntType相一致的實例元素。
<!--代碼 0-10 myInteger列表類型的模式定義以及實例應(yīng)用-->
<!-- Schema Fragment -->
<xsd:simpleType name="listOfMyIntType">
<xsd:list itemType="myInteger"/>
</xsd:simpleType>
<!-- Instance Fragment -->
<listOfMyInt>20003 15037 95977 95945</listOfMyInt>
一些用于描述的參數(shù)能夠被應(yīng)用到列表類型的定義中,它們是length、minLength、maxLength和enumeration。舉例來說,如果我們想定義一個列表,這個列表正好包含了六個美國的州名(SixUSStates)。首先從USState定義一個新的列表類型,稱為USStateList,然后通過限制USStateList只有六個項來導(dǎo)出SixUSStates。具體的定義可參見代碼11。
<!--代碼11 列表類型USStateList及其導(dǎo)出的列表類型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的原子類型,在代碼11后半部分的實例文檔中就是一個具體的應(yīng)用例子。
我們需要注意的是,從原子類型string可以導(dǎo)出一個列表類型,然而,在一個string中也許會帶有空格,而空格在一個列表類型實例中是作為分隔符使用的。所以當(dāng)在使用基類型為string的列表類型時,應(yīng)當(dāng)格外小心。舉例來說,假設(shè)我們定義了一個length取值為3的列表類型,同時這個列表類型是基于類型string。下面由三個元素組成的列表是合法的:“Asie Europe Afrique”;而由三個元素這樣組成的列表是不合法的:“Asie Europe Amérique Latine”。即使“Amérique Latine”在列表外可以作為單獨的一個字符串存在,但當(dāng)它包含在列表中,在Amérique和Latine之間的空格使得第四個項被有效地生成了,因此后面的那個例子不符合只有三個項的列表類型定義。
聯(lián)合類型
應(yīng)用原子類型和列表類型,一個元素或者屬性的值可以為一個或者多個原子類型(列表類型)的實例。與之相比較,一個應(yīng)用聯(lián)合類型(Union Type)包含了多個原子類型或者列表類型,而應(yīng)用了聯(lián)合類型的元素或是屬性的值可以是這些原子類型或列表類型中的一個類型實例。為了顯示這一點,我們建立一個用于表示美國州的、為兩個字母縮寫或者數(shù)字列表的聯(lián)合類型。zipUnion聯(lián)合類型由一個原子類型和一個列表類型構(gòu)成的(參見代碼12)。
<!--代碼 12 聯(lián)合類型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>
當(dāng)我們在定義一個聯(lián)合類型時,元素union的memberTypes屬性的值包含了聯(lián)合類型中所有類型的列表?,F(xiàn)在,假定我們聲明了一個zipUnion類型的元素,稱為zips,zips元素有效的實例可參見代碼12。
此外,對于聯(lián)合類型而言,還有兩個描述性質(zhì)的參數(shù)pattern和enumeration也可以應(yīng)需要使用。