曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
當用括號對元素分組時豎線還會更有用。可以把元素組合在括號內分組,然后在括號后加星號、問號和加號后綴來指明一定
的元素組合會出現零次或多次、零次或一次或者一次或多次。
8.5.10 帶括號的子元素
在父元素聲明中,必須了解有關子元素安排的最后一件事是如何用括號分組元素。每一對括號把數個元素合為一個獨立元素。
括號內的元素可以作為獨立元素嵌套在其他括號內。而且,還可以加上加號、逗號或問號后綴。您還可以將這些括號組合成
更大的括號組合來構成復雜的結構。這是一項功能強大的技術。
XML 實用大全
第 220 頁
例如,考慮一份由兩個互相可交換的元素組成的清單。這基本上是HTML 中定義清單的方法。每項<dt>標記要與一項<dd>標
記相匹配。如果用XML 來復制這一結構,dl 元素的聲明看起來是這樣的:
<!ELEMENT dl (dt , dd)*>
括號表明要重復的是相互匹配的<dt><dd>元素對。
元素經常以或多或少的隨機順序出現。新聞雜志文章通常有一個標題,絕大多數后接文章段落,帶有圖形、照片、副欄、副
標題、通篇夾雜的引文,也許在末尾還有作者行。可以在父元素聲明中在括號內用豎線分組列出所有子元素來指明這些安排。
然后您在括號外加星號來指明允許括號內元素出現零或多次。例如:
<!ELEMENT ARTICLE (TITLE, (P | PHOTO | GRAPH | SIDEBAR
| PULLQUOTE | SUBHEAD)*, BYLINE?)>
再舉一例,假設要說明一個DOCUMENT 元素,它沒有很多子元素,但必須有一個TITLE 后接任意數量的混合文本段落和圖像,
以及一個任選的SIGNATURE 塊。該元素聲明書寫如下:
<!ELEMENT DOCUMENT (TITLE, (PARAGRAPH | IMAGE)*, SIGNATURE?)>
這不是描述這一結構的唯一方法。實際上這甚至不是最好的方法。另一種方法是聲明一個包含PARAGRAPH 和IMAGE 元素的
BODY 元素并把它夾在TITLE 和SIGNATURE 元素之間,例如:
<!ELEMENT DOCUMENT (TITLE, BODY, SIGNATURE?)>
<!ELEMENT BODY ((PARAGRAPH | IMAGE)*)>
這兩種途徑的區別在于第二種途徑在文檔中使用了BODY 元素。這一元素對讀取文檔的應用程序提供了有用的組織層次。問
題是文檔的讀者(可能是另一種計算機程序)是否要把BODY 作為單一的項目,并同TITLE 和SIGNATURE 分開,并可從元素
總和中區別出來。
再舉一個國際地址的例子。美國以外國家的地址并不遵循美國的約定。尤其是郵政編碼有時在國家名之前,有時則在其后,
如下兩例:
Doberman-YPPAN
Box 2021
St. Nicholas QUEBEC
CAN GOS-3LO
或者
Editions Sybex
10/12 Villa Coeur-de-Vey
XML 實用大全
第 221 頁
75685 Paris Cedex 14
France
雖然地址項不是按照順序,郵件也可能郵到目的地,但最好還是讓地址更加方便靈活些。允許靈活性的地址元素聲明可以是
這樣:
<!ELEMENT ADDRESS (STREET+, (CITY | STATE | POSTAL_CODE
| COUNTRY)*)>
這表明ADDRESS 元素必須有一個或多個STREET 子元素后接任意數目的CITY、STATE、POSTAL_CODE 或COUNTRY 元素。如果要
每個元素不多于一個,那這就不夠理想了。遺憾的是,這超出了DTD 的能力。您要使元素的順序更加靈活方便,就要放棄一
些控制每一元素最大數的能力。
另一方面,可能有一份由任意順序排列的不同元素組成的清單,如一份錄音清單就可能包含CD,唱片集和音帶。區別各類
不同元素的元素聲明可能如下:
<!ELEMENT MUSIC_LIST (CD | ALBUM | TAPE)*>
在棒球DTD 中,可以使用括號來為投手和擊球手做不同的統計數據集。每名隊員能用一套或另一套數據,但不能用兩者。元
素聲明如下:
<!ELEMENT PLAYER (GIVEN_NAME, SURNAME, POSITION, GAMES,
GAMES_STARTED,((COMPLETE_GAMES?,WINS?,LOSSES?,SAVES?,
SHUT_OUTS?,ERA?,INNINGS?,EARNED_RUNS?,HIT_BATTER?,
WILD_PITCHES?,BALK?,WALKED_BATTER?,STRUCK_OUT_BATTER? )
|(AT_BATS?, RUNS?,HITS?, DOUBLES?, TRIPLES?, HOME_RUNS?,
RBI?,STEALS?,CAUGHT_STEALING?,SACRIFICE_HITS?,
SACRIFICE_FLIES?, ERRORS?, WALKS?, STRUCK_OUT?,
HIT_BY_PITCH ? )))>
在元素聲明中還有一些不好處理的事情。例如,沒有好的方法來說明一份文檔要以TITLE 元素開始而以SIGNATURE 元素結束,
兩者之間可包含其他元素。這是因為ANY 不能與其他子元素合用。
還有,通常對元素出現的位置掌握得越不準確,就越不能控制它們的數目。例如,不能說文檔應該有一個可能出現在文檔任
何地方的TITLE 元素。
XML 實用大全
第 222 頁
但是,用括號來建立元素塊,按順序的元素用逗號分隔,平行出現的用豎線分隔,能讓我們建立帶有詳細的元素出現的位置
規則的復雜結構。但是不要無止境地這樣做。簡單的解決方法會更好。DTD 越復雜,就越難編寫出滿足要求的合法的文檔,
更不要說維護DTD 自身的復雜性了。
8.5.11 混合內容
讀者可能已經注意到了,在以前的多數例子中,元素或者包含子元素,或者包含可析的字符數據,但不能同時包含兩者。唯
一的例外是以前例子中的一些基本元素。在這些例子中,全部標記的列表還沒有完成。由于基本元素可以包含ANY 數據,因
而就既可以包含子元素又可以包含原始文本。
可以聲明同時包含子元素和可析字符數據的標記。這就叫做混合內容。這樣就可以給每個TEAM 后面加上任意的文本塊。例
如:
<!ELEMENT TEAM (#PCDATA | TEAM_CITY | TEAM_NAME | PLAYER)*>
帶有可析的字符數據的混合子元素會嚴重地限制文檔的結構。特別是,只能指定可出現的子元素的名稱。不能限定它們出現
的順序,每個元素的出現次數,或者它們是否出現。借助于DTD,利用下面的DTD 中的一部分可實現這一要求:
<!ELEMENT PARENT (#PCDATA | CHILD1 | CHILD2 | CHILD3 )* >
除了改變子元素數目以外的其他事情都是不合法的。不能在包括#PCDATA 的元素聲明中使用逗號、問號或加號。用豎線分隔
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML實用大全(67)