曝光台 注意防骗
网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者
每个元素只能在其<!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)>
XML 实用大全
第 203 页
<!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)>
XML 实用大全
第 204 页
用逗号隔开的一系列子元素称为一个序列。利用这一声明,每个合法的SEASON 元素必须包含正好一个YEAR 元素,后面正好
是两个LEAGUE 元素,没有别的。整个文档类型定义现在看上去是下面的样子:
<!DOCTYPE SEASON [
<!ELEMENT YEAR (#PCDATA)>
<!ELEMENT LEAGUE (LEAGUE_NAME)>
<!ELEMENT LEAGUE_NAME (#PCDATA)>
<!ELEMENT SEASON (YEAR, LEAGUE, LEAGUE)>
]>
清单8-8 所列的文档部分确实符合这项DTD 的规定,因为它的SEASON 元素包含一个YEAR 子元素,后接两个LEAGUE 子元素,
再没有别的。但是,如果文档只包括一个SEASON 元素,那么这个文档尽管结构完整,也将是非法的。同样,如果LEAGUE
在YEAR 之前而不是在其后,或者如果LEAGUE 有YEAR 子元素,或者文档在其他任何方面不符合DTD,那么文档就是不合法
的,合法性检查程序将拒绝这样的文档。
可直接将此种技术推广到DIVISION 元素。每个LEAGUE 有一个LEAGUE_NAME 和三个DIVISION 子元素。例如:
<!ELEMENT LEAGUE (LEAGUE_NAME, DIVISION, DIVISION, DIVISION)>
8.5.5 一个或多个子元素
每个DIVISION 有一个DIVISION_NAME 和四到六个TEAM 子元素。指定DIVISION_NAME 很容易,方法如下:
<!ELEMENT DIVISION (DIVISION_NAME)>
<!ELEMENT DIVISION_NAME (#PCDATA)>
但是,TEAM 子元素就很棘手。指明DIVISION 元素有四个TEAM 子元素很容易,如下所示:
<!ELEMENT DIVISION (DIVISION_NAME, TEAM, TEAM, TEAM, TEAM)>
五个和六个也不难。但是您怎样说明有四到六个TEAM 子元素呢?实际上,XML 没有提供实现的简单方法。但是可以在子元
素清单的元素名后放一个加号(+)来说明有一个或多个子元素,例如:
<!ELEMENT DIVISION (DIVISION_NAME, TEAM+)>
这就是说一个DIVISION 元素必须包含一个DIVISION_NAME 子元素,后接一个或多个TEAM 子元素。
说明DIVISION 元素有四到六个TEAM 元素,而不是三到七个,这就难了。由于非常复杂,实际上很少有人使用。
当读完本章时,看一看您是否已经想出怎样做了。
XML 实用大全
第 205 页
8.5.6 零或多个子元素
每个TEAM 要包含一个TEAM_CITY,一个TEAM_NAME 和不确定数目的PLAYER 元素。实际上,棒球队至少要九名球员。但是,
本书的很多例子中由于篇幅的原因而没有列出球员。因而,我们要指明一个TEAM 元素可包含零或多个PLAYER 子元素。在子
元素清单中在元素名上附加一个星号(*)来实现这一目的。例如:
<!ELEMENT TEAM (TEAM_CITY, TEAM_NAME, PLAYER*)>
<!ELEMENT TEAM_CITY (#PCDATA)>
<!ELEMENT TEAM_NAME (#PCDATA)>
8.5.7 零或一个子元素
文档中出现的最后的元素是PLAYER 子元素。它们全部是只包含文本的简单元素。下面是它们的声明:
<!ELEMENT SURNAME (#PCDATA)>
<!ELEMENT GIVEN_NAME (#PCDATA)>
<!ELEMENT POSITION (#PCDATA)>
<!ELEMENT GAMES (#PCDATA)>
<!ELEMENT GAMES_STARTED (#PCDATA)>
<!ELEMENT AT_BATS (#PCDATA)>
<!ELEMENT RUNS (#PCDATA)>
<!ELEMENT HITS (#PCDATA)>
<!ELEMENT DOUBLES (#PCDATA)>
<!ELEMENT TRIPLES (#PCDATA)>
<!ELEMENT HOME_RUNS (#PCDATA)>
<!ELEMENT RBI (#PCDATA)>
<!ELEMENT STEALS (#PCDATA)>
<!ELEMENT CAUGHT_STEALING (#PCDATA)>
<!ELEMENT SACRIFICE_ HITS (#PCDATA)>
<!ELEMENT SACRIFICE_FLIES (#PCDATA)>
XML 实用大全
第 206 页
<!ELEMENT ERRORS (#PCDATA)>
<!ELEMENT WALKS (#PCDATA)>
<!ELEMENT STRUCK_OUT (#PCDATA)>
<!ELEMENT HIT_BY_PITCH (#PCDATA)>
<!ELEMENT COMPLETE_GAMES (#PCDATA)>
<!ELEMENT SHUT_OUTS (#PCDATA)>
<!ELEMENT ERA (#PCDATA)>
<!ELEMENT INNINGS (#PCDATA)>
中国航空网 www.aero.cn
航空翻译 www.aviation.cn
本文链接地址:
XML实用大全(63)