XML Schema幫你建模(二)

2021-03-31 08:56:58 字數 3832 閱讀 8762

xml schema幫你建模(2)

復合型別定義、元素和屬性宣告

在xml schema中,對於那些允許元素有自己的內容,以及可以攜帶自身屬性的復合型別與那些不能夠有元素內容和屬性的簡單型別,它們的表示形式有著本質的不同。在例項文件中,對於能建立新的型別(無論簡單和複雜)的定義和允許元素和屬性有特定的名字和型別(無論是簡單還是複雜)的宣告,它們之間也有著顯著的差別。在這一節中,將針對如何定義復合型別,以及如何宣告使用復合型別的元素及其屬性做較詳細的描述。

在乙個模式文件中,當需要定義新的復合型別的時候,應當使用***plextype元素來定義,這樣的典型定義包括元素宣告、元素引用和屬性宣告。這些元素宣告與其說是它們自身的型別,不如說是一由相關模式控制的元素名與控制這些元素名在例項文件中的表現形式的型約束之間的關聯。元素是通過使用element元素來宣告的,屬性則是通過使用attribute元素來宣告的。舉例來說,usaddress被定義為乙個復合型別,所以在usaddress型別定義中看到它包含了五個元素的宣告和乙個屬性的宣告(參見**3)。

這個定義的含義是,在例項文件中出現任何型別宣告為usaddress的元素(比如在po.xml中的shiptto)必須包含五個元素和乙個屬性,而且這些元素必須被命名為name、street、city、state和zip,這些名稱應該與在模式定義中element元素的name屬性的值相一致。並且這些元素必須按照模式宣告中的相同順序出現,前四個元素必須包含乙個字串元素內容,第五個必須包含乙個十進位制數字型別的元素內容。宣告為usaddress型別的元素可以帶有乙個country屬性,該屬性必須包含字串「us」。

usaddress型別定義僅僅包含了引用簡單型別的元素宣告,這些簡單型別包括string、decimal 和nmtoken。與之對比,purchaseordertype型別定義(參閱**4)則包含了引用復合型別的元素宣告,如usaddress。這兩個型別宣告都使用同樣的type屬性來標識型別,而無需去區分型別是簡單的還是復合的。

在purchaseordertype的型別定義中,對於shipto 和 billto這兩個子元素的宣告將不同的元素名與相同的復合型別相關聯,這個復合型別是usaddress。這個定義的結果是,如果在例項文件中出現的任何元素(如po.xml中),當元素型別被宣告為purchaseordertype時,那麼這個元素必須包含兩個名為shipto 和billto的元素,這兩個元素都要包含五個子元素(name、street、city、state和zip),這五個子元素是作為usaddress宣告的一部分出現的。根據usaddress的相關型別定義,shipto和billto元素也可以包含country屬性。

purchaseordertype型別定義包含了乙個orderdate屬性宣告,就像在usaddress中的country屬性宣告一樣,它被標識為乙個簡單型別。實際上,所有的屬性宣告必須引用簡單型別。這是因為屬性與元素宣告不同,是不能包含其它元素或者屬性的。

迄今為止,我們描述的元素宣告對每乙個元素名都使用了乙個現存的型別定義。然而有時候,使用乙個現存的元素比應用乙個型別來定義乙個新的元素更為方便(參閱** 5)。

**5這個元素宣告定義引用了乙個現存的元素***ment,該元素在購買訂單模式文件中的其它部分被定義。一般來說,ref屬性的值必須指向乙個全域性元素。也就是說應當是在元素下面被宣告的,而不是作為復合型別定義的一部分宣告的。**5宣告的含義是,乙個叫***ment的元素可以出現在例項文件關於這個定義的相關部分中,它的內容必須和那個被引用的元素的型別一致,在這個情況下是「string」。

全域性元素和屬性

全域性的元素和全域性的屬性是在全域性宣告時建立的,全域性宣告都是作為元素的直接子元素出現的。一旦經過定義,全域性元素或者全域性屬性就可以像先前描述的那樣,在乙個或多個元素/屬性宣告中使用ref屬性引用。乙個引用全域性元素的宣告,在例項文件中允許被引用的元素出現在與宣告相關的元素中。所以舉例來說,po.xml中的***ment元素同樣可以在shipto、billto和items元素中出現,因為引用***ment的復合型別定義的宣告同樣出現在這三個元素的宣告中。

乙個全域性元素的宣告也允許元素在例項文件中以頂級的文件元素出現,因此purchaseorder元素,在po.xsd中是作為乙個全域性元素宣告的,能夠作為po.xml.中的頂級元素出現。值得注意的是,基於這個基本原理***ment元素作為頂級元素出現在文件如po.xml中也是被允許的。

關於使用全域性的元素和屬性有很多限制,其中乙個限制是全域性的宣告不能夠包含引用。全域性的宣告定義不能包含ref 屬性,它們必須使用type 屬性(或者像例子中使用過的跟隨了乙個匿名的型別定義)。第二個限制是約束不能夠放在全域性宣告中,儘管它們能夠放在引用全域性宣告的區域性宣告中。換句話說,全域性宣告不能夠包含minoccurs、maxoccurs或者use屬性。關於約束的使用,將在下一節中給出。

出現次數約束

我們看到,在**5中的元素宣告中minoccurs屬性的值為0 ,所以***ment元素在purchaseordertype型別中是乙個可選項。一般來說,當某個元素的minoccurs的值為1或者更多的時候,該元素就必須出現。乙個元素可以出現的最大數量由宣告中的maxoccurs屬性所決定。這個值也許是乙個正的整數如1,也可能是乙個很大的整數100,或者以「unbounded」的形式來表明不限最大的出現數量。minoccurs和maxoccurs屬性的預設值都是1。因此,當乙個元素如***ment,它沒有定義maxoccurs屬性,那麼此時該元素不可以出現超過一次。如果僅僅指定了minoccurs屬性值的話,那麼它必須小於等於maxoccurs的預設值,也就是說minoccurs如果單獨出現,其取值只能為0或者1,這是因為minoccurs的有效值必須小於等於maxoccurs的有效值。同理,如果只指定了maxoccurs屬性,它就必須大於等於minoccurs的預設值,也就是必須取值為1或者更多。如果兩個屬性都被省略了,那麼元素必須出現且僅出現一次。

對於屬性而言,它可以有兩種選擇:出現一次或者根本不出現,不會有其它的出現次數。所以指定屬性出現次數的語法與元素的語法有所不同。特別需要注意的,屬性宣告能夠使用乙個use屬性來指明屬性是否需要出現(可參見**2,po.xsd中partnum屬性的宣告)。

屬性和元素的預設值都是使用default屬性來宣告的,不過這個屬性在不同的情況下有不同的語義。當乙個屬性使用預設值來宣告的時候,如果屬性在例項文件中出現了,那麼屬性的值就是屬性在例項文件中出現的那個值,也就是例項文件中的值是最終有效值。如果屬性沒有在例項文件中出現,模式處理器將認為這個屬性的值等於宣告中default屬性的值。需要注意的是,屬性預設值只在屬性本身為「可選的」時候才有意義。如果在宣告中,既指定了預設值,同時又設定了use屬性為除「optional」以外其它值的話(也就是必須出現),處理器就會產生錯誤。也就是說,屬性的預設值只有當屬性不在例項文件中出現的時候才會生效。

當乙個元素宣告中有預設值定義的時候,模式處理器在處理預設元素值的時候,與處理屬性的預設值相比則有一些不同。如果例項文件中元素出現且帶有自身內容的時候,元素的值就是例項文件中元素的內容。如果元素沒有內容,那麼模式處理器就認為這個元素的值(內容)等於宣告中default屬性的值。如果元素在例項文件中並不出現,則模式處理器根本不認為該元素出現。

總而言之,元素和屬性預設值之間的區別可以認為是當屬性不出現時預設的屬性值被應用;當元素內容為空的時候,預設的元素值被應用;而元素不出現的時候,預設的元素值不被應用。

屬性和元素宣告中,都使用了fixed屬性來確保屬性和元素被設定為特殊的值。如po.xsd中包含了乙個country屬性的宣告,該屬性宣告就有乙個fixed屬性,值為us。這個宣告意味著在例項文件中country屬性的出現是可選的(use屬性的預設值是optional),但是如果屬性出現它的值必須為「us」;如果屬性不出現,模式處理器將自動設定country屬性值為「us」。需要注意的是,fixed值的概念和default值的概念是互斥的,如果同時宣告fixed和default屬性就會令模式處理器產生乙個錯誤。

值得注意的是,在全域性的元素和屬性宣告中,minoccurs、maxoccurs、use都沒有出現,也不能出現。

XML Schema幫你建模(3)

我們現在已經討論了如何定義新的復合型別 比如purchaseordertype 宣告元素 比如purchaseorder 和宣告屬性 如orderdate 在這些定義行為中,一般都包含著命名,如果我們給兩個物件賦予同樣的名稱會有何種結果?答案取決於問題中的兩個物件,一般來說這兩個物件越相近,它們越有...

XML Schema幫你建模(4)

除了使用簡單型別中描述的原子型別 這些原子型別可用於組合成絕大多數的其它型別,包括其它的簡單型別和復合型別 外,xml schema中在簡單型別範疇中還有列表型別 list type 的概念。原子型別 列表型別以及聯合型別,總稱為簡單型別。乙個原子型別的值在xml schema中是不可分割的。舉例來...

16 資料倉儲 建模步驟二 概念建模

概念建模是對業務模型進行抽象出來實體以及實體與實體之間的關係,把業務建模的各個業務流程過程抽象出實體和關係 er 概念模型關注的是實體和實體之間的關係,對於實體的屬性沒有做過多的考慮。概念模型的設計結果 將直接指導接下來的邏輯模型和物理模型設計,可以說概念模型是在整個模型設計過程中最重要的一環 概念...