8.5.3 子元素列表
由於SEASON元素被聲明為可以接受任何元素作為子元素,因而可以接受各種各樣的元素。當遇到那些多多少少有些非結構化的文本,如雜志文章時,這種情況就很有用。這時段落、副欄、項目列表、序號列表、圖形、照片以及子標題可出現在文檔的任意位置。然而,有時可能想對數據的安排上多實行些規則和控制。例如,可能會要求每一個LEAGUE元素有一個LEAGUE_NAME子元素,而每個PLAYER元素要有一個GIVEN_NAME和SURNAME子元素,並且GIVEN_NAME要放在SURNAME之前。
為了聲明LEAGUE元素必須有一個名稱,只要聲明LEAGUE_NAME元素,然後在LEAGUE聲明後的括號內加入LEAGUE_NAME,如下面這樣:
<!ELEMENT LEAGUE (LEAGUE_NAME)>
<!ELEMENT LEAGUE_NAME (#PCDATA)>
每個元素只能在其<!ELEMENT>內聲明一次,即使它以其他<!ELEMENT>聲明的子元素出現也一樣。這裡,我把LEAGUE_NAME聲明放在引用它的LEAGUE聲明之後,這沒有關系。XML允許這一類提前引用。只要聲明全部包含在DTD中,元素標記出現的順序無關緊要。
可以向文檔中添加這兩項聲明,然後在SEASON元素中包括LEAGUE和LEAGUE_NAME元素。如清單8-8所示。圖8-8是顯示出來的文檔。
清單8-8:有兩個LEAGUE子元素的SEASON元素
<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/css" href="greeting.css"?>
<!DOCTYPE SEASON [
<!ELEMENT YEAR (#PCDATA)>
<!ELEMENT LEAGUE (LEAGUE_NAME)>
<!ELEMENT LEAGUE_NAME (#PCDATA)>
<!ELEMENT SEASON ANY>
]>
<SEASON>
<YEAR>1998</YEAR>
<LEAGUE>
<LEAGUE_NAME>American League</LEAGUE_NAME>
</LEAGUE>
<LEAGUE>
<LEAGUE_NAME>National League</LEAGUE_NAME>
</LEAGUE>
</SEASON>
圖8-8 包含樣式單、YEAR元素和兩個LEAGUE子元素的合法的文檔
8.5.4 序列
讓我們限制一下SEASON元素。一個SEASON元素包含正好一個YEAR元素和其後的兩個LEAGUE子元素。不把SEASON元素聲明為可以包含ANY元素,我們在SEASON元素聲明中包括這三個子元素,用括號括起來並用逗號分隔開,如下所示:
<!ELEMENT SEASON (YEAR, LEAGUE, LEAGUE)>
用逗號隔開的一系列子元素稱為一個序列。利用這一聲明,每個合法的SEASON元素必須包含正好一個YEAR元素,後面正好是兩個LEAGUE元素,沒有別的。整個文檔類型定義現在看上去是下面的樣子:
<!DOCTYPE SEASON [
<!ELEMENT YEAR (#PCDATA)>
<!ELEMENT LEAGUE (LEAGUE_NAME)>
<!ELEMENT LEAGUE_NAME (#PCDATA)>