• 热门标签

当前位置: 主页 > 航空资料 > 计算机 >

时间:2010-08-09 13:24来源:蓝天飞行翻译 作者:admin
曝光台 注意防骗 网曝天猫店富美金盛家居专营店坑蒙拐骗欺诈消费者

当用括号对元素分组时竖线还会更有用。可以把元素组合在括号内分组,然后在括号后加星号、问号和加号后缀来指明一定
的元素组合会出现零次或多次、零次或一次或者一次或多次。
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.aero.cn
航空翻译 www.aviation.cn
本文链接地址:XML实用大全(67)