卷标描述了一种特殊的数据格式。它是借着提供该格式描述的位置、可以处理该种格式数据的应用程序位置,或简单的格式叙述等方式来提供数据格式。你可以使用标签来描述一般外部未解析实体(如你在前面章节中所见到的)的格式,或者你可以为拥有NOTATION 列举数据型态(如同第五章中的 <设定列举型态> 所介绍的)属性指定卷标。
标签拥有下列一般格式:
<!NOTATION NotationName SYSTEM SystemLiteral>
这里的NotationNam 是标签的名称。你可以选择任何你想要的名称,只要是以字母或底线(_)起始,后面接着零或多个字母、数字、句点(.)、连字号(-),或底线(_)。你应该选择一个有意义的名称来代表该格式。例如,如果你想定义卷标来描述图形文件,你可以将它命名为BMP。
SystemLiteral 则是系统literal,可以使用单引号(')或双引号(")来包围,而且可以包含任何的字符,除了用来作包围用的引号以外。你可以将任何可能对负责显示或处理XML 文件的应用程序有意义的格式叙述含括在系统literal 中。(记住,XML 处理器本身并不会使用这些信息;它只是单纯地将它传送给应用程序,而应用程序可能是网页中的script。)例如,你可以含括下列系统literal 的任何一个:
可以处理或显示的数据格式应用程序的URI,如下面范例中所介绍的:
<!NOTATION BMP SYSTEM "Pbrush.exe">
<!NOTATION GIF SYSTEM "http://bogus.com/ShowGif.exe">
描述格式的在线文件的URI,如:
<!NOTATION STRANGEFORMAT SYSTEM
"http://bogus.com/StrangeFormat.htm">
格式的简单描述,如:
<!NOTATION GIF SYSTEM "Graphic Interchange Format">
请参阅第五章中的 <使用外部的DTD 子集> 以取得更多URI 的信息与范例。
宣告参数实体
你可以使用类似用在一般实体上的卷标宣告来宣告一个参数实体。在下面的章节中,你将学到如何宣告两种参数实体。
宣告内部已解析参数实体
内部已解析参数实体的宣告拥有下列的格式:
<!ENTITY %EntityName EntityValue >
这里的EntityName 是实体的名称。你可以选择任何的名字,只要遵守下面这些规则:
实体的名称必须由字母或底线开头(_),后面接着零个或多个字母、数字、句点(.)、连字号(-)、或底线(_)。
实体可以拥有和文件中一般实体一样的名字。(参数实体与一般实体使用不同的命名空间。)实体也可以拥有和元素或属性相同的名称。
字母的大小写在卷标的所有文字中都是不同的,包括实体名称。因此,名为Spot的实体当然与名为spot 的实体是不同。
EntityValue 是实体的值。你赋予参数实体的值是一连串被引号包围的字符串,称为引号包围字符串(quoted string)或literal。你可以将任何的literal 值指定给参数实体,只要遵守下面的规则即可:
字符串可以用单引号(')或双引号来包围(")。
字符串中不能包含与用来包围字符串相同的引号字符。
字符串不能包含百分比(%)字符,也不能包含(&)符号字符,除非使用字符参照或一般实体参照才行。
你只能将参数实体加到DTD 中卷标宣告可以出现的地方,而不是放在标签宣告中。因此,EntityValue 字符串必须包含一个或多个DTD 允许型态的完整卷标宣告。第五章的 <建构一个DTD> 中已介绍过标签宣告的格式。
尤其是,参数实体可以包含元素型态宣告、属性列表宣告、一般实体宣告、卷标宣告、处理指令,或批注(参数实体宣告与参照并不被允许)。
注意
在这里规定的实体值规则,可以适用在任何状况下,这些规则是XML 规格的简化版本。这些规格-在某些情况下-允许你包含额外的项目于属性值中,并且在卷标以及卷标宣告中含括实体参照。详细的内容,请参阅 http://www.w3.org/TR/REC-xml 的XML 规格的第四部分。
例如,下面的DTD 宣告了一个名为author 的内部已解析实体参数,该实体包括三个卷标宣告:批注、元素型态宣告,与属性列表宣告。实体的内容(意即,它的替换文字)会借着数种参数实体参照(%author;),被加入DTD 的底部:
<!DOCTYPE BOOK
[
<!ENTITY %author
"<!--author information -->
<!ELEMENT AUTHOR (#PCDATA)>
<!ATTLIST AUTHOR Nationality CDATA 'American'>"
>
<!ELEMENT BOOK (TITLE,AUTHOR)>
<!ELEMENT TITLE (#PCDATA)>
%author;
]
>
注意,包含在实体宣告中的预设属性值是利用单引号包围('American'),以避免使用那些被用来包围整个实体值的相同引号。上面的DTD 与下面这个是相等的:
<!DOCTYPE BOOK
[
<!ELEMENT BOOK (TITLE,AUTHOR)>
<!ELEMENT TITLE (#PCDATA)>
<!--author information -->
<!ELEMENT AUTHOR (#PCDATA)>
<!ATTLIST AUTHOR Nationality CDATA 'American'>
]
>
宣告参数外部已解析实体
参数外部已解析实体的宣告拥有下列的一般格式:
<!ENTITY % EntityName SYSTEM SystemLiteral>
这里的EntityName 是实体的名称。你可以选用任何遵守前面章节中介绍的参数实体命名规则的名称。
SystemLiteral 是一个描述包含实体数据文件位置的系统literal。这个系统literal 可以使用单引号(')或双引号(")来包围,而且它可以包含任何字符,除了被用作包围的引号字符外。
系统literal 指定了包含参数实体数据文件的URI,URI 在本质上与标准因特网的统一资源定位器(URL)是相同的。你可以使用完整的URL,例如:
<!ENTITY %declarations
SYSTEM "http://bogus.com/documents/Declarations.dtd">
或者,你可以使用部分的URI,该URL 指定了一个相对于包含XML 文件位置的相对位置,例如:
<!ENTITY %declarations SYSTEM "Declarations.dtd">
如同稍早提到的,在XML 文件中相对的URI 的运作就像HTML 网页中的URL 一样。想获得更多URI 的信息,请参阅第五章中的 <仅仅使用外部的DTD 子集> 。
参数外部实体的档案必须包含DTD 中允许型态的有效卷标宣告。特别是,它可以包含元素型态宣告、属性列表宣告、实体宣告、标记宣告、处理指令或批注。(第五章的<建构一个DTD>中已描述过这些卷标宣告的型态。)你也可以包含参数实体参照与IGNORE 与INCLUDE 区段(第五章的<外部DTD 子集中的条件式忽略区段>中亦介绍过IGNORE 与INCLUDE 区段。)你可以使用参数外部已解析实体来储存相关宣告的群组。举个例子来说,假设你的企业是贩卖书籍、CD、邮票等。你可以将每一种项目的宣告放在个别档案。你被允许用不同的方式来结合这些宣告的群组。例如,你可能想要建立一份只描述书籍与CD 库存的XML 文件。要做到这点,你可以藉由使用参数外部已解析实体,将书籍与CD 宣告包含在文件的DTD 中,就像这个范例XML 文件中所示:
<?xml version="1.0"?>
<!DOCTYPE INVENTORY
[
<!ELEMENT INVENTORY (BOOK |CD)*>
<!ENTITY %book_decls SYSTEM "Book.dtd">
<!ENTITY %cd_decls SYSTEM "CD.dtd">
%book_decls;
%cd_decls;
]
>
<INVENTORY>
<BOOK>
<BOOKTITLE>The Marble Faun</BOOKTITLE>
<AUTHOR>Nathaniel Hawthorne</AUTHOR>
<PAGES>473</PAGES>
</BOOK>
<CD>
<CDTITLE>Concerti Grossi Opus 3</CDTITLE>
<COMPOSER>Handel</COMPOSER>
<LENGTH>72 minutes</LENGTH>
</CD>
<BOOK>
<BOOKTITLE>Leaves of Grass</BOOKTITLE>
<AUTHOR>Walt Whitman</AUTHOR>
<PAGES>462</PAGES>
</BOOK>
<!--additional items...-->
</INVENTORY>
这里是实体档案Book.dtd 的内容:
<!ELEMENT BOOK (BOOKTITLE,AUTHOR,PAGES)>
<!ELEMENT BOOKTITLE (#PCDATA)>
<!ELEMENT AUTHOR (#PCDATA)>
<!ELEMENT PAGES (#PCDATA)>
而这里是实体档案CD.dtd 的内容:
<!ELEMENT CD (CDTITLE,COMPOSER,LENGTH)>
<!ELEMENT CDTITLE (#PCDATA)>
<!ELEMENT COMPOSER (#PCDATA)>
<!ELEMENT LENGTH (#PCDATA)>
注意,参数外部已解析实体的运作模式非常类似外部DTD 的子集。然而,参数外部实体较具弹性-它们允许你包含数个外部宣告档案并将之依顺序含括。(外部DTD子集总是在整个内部DTD子集已经被处理过之后才会被处理)。
加入实体参照
如同你所学到的,你借着使用实体参照来将实体的内容(替换文字)插入文件中。你已经看到少部分实体参照的范例。要复习并作个总结,一般的实体是以下面的方式被参照:
&EntityName ;
而参数实体则是以下面方式被参照:
%EntityName ;
其中EntityName 是在宣告区中指定给实体的名称。例外的情况是一般外部未解析实体,你不能借着使用参照来将实体加入文件中。要使用这类实体的唯一方法就是将实体的名称指定到拥有ENTITY 或ENTITIES 型态的属性中。(参阅第五章中的 <设定Tokenized 型态> 。)
实体的宣告必须放在实体被参照之前。对于每一种实体型态,下面的表格提供了实体参照的格式,并列出加入实体参照的位置。在每一个插入位置叙述的尾端,表格提供了在本章中被参考的区段,你可以在范例中找到这些区段。本章稍后将讨论字符参照,此表中先包括字符参照的叙述以求完整性。
实体型式 实体参照的格式其中EntityName 是实体的名称 你可以加入实体参照(范例)的位置
一般内部已解析 &EntityName; 在元素的内容中(参阅 <宣告一般内部解析实体> )
在属性的值中(在属性宣告中,或元素的起始卷标中当作默认值)(参阅 <实体参照范例1> )
在内部实体宣告的值中(参阅 <实体参照范例2> )
一般外部已解析 &EntityName; 在元素的内容中(参阅 <宣告一般外部已解析实体> )
在内部实体宣告的值中(参阅 <实体参照范例2> )
一般内部未解析 EntAttr='EntityName 其中EntAttr 是ENTITY 或ENTITIES 型态的属性 你不能加入任何参照到这类型的实体,但是你可以将实体的名称指定ENTITIES 型态的 到拥有NTITY 或属性中(参阅 <宣告一般外部未解析实体> )
参数内部已解析 %EntityName; 在标签宣告可以发生的DTD 中,而不是在标签宣告中(有关例外的部分,请参阅http://www.w3.org/TR/ REC-xml 的XML 规格的第四部分)(参考 <宣告参数内部已解析实体> )
参数内部未解析 %EntityName; 在标签宣告可以发生的DTD 中,而不是在标签宣告中(有关例外的部分,请参阅 http://www.w3.org/TR/REC-xml 的XML规格的第四部分)(参考 <宣告参数外部已解析实体> )
字符参照 & #9; 或 & #xh; 其中9 是字符 在元素的内容中(参阅 <加入字符参照> )
以十进制表示的数值码而h是字符以十六进制表示的数值码 在属性值中(在属性列表宣告中或元素的起始卷标中当作默认值)(参阅 <加入字符参照> )
在内部实体宣告的值中(参阅 <加入字符参照> )
实体参照范例1
下面的XML 文件宣告了两个一般内部已解析实体,am 与en。这份文件使用对am 的参照来为Nationality 属性指定值,并且利用对en 的参照来指定值给AUTHOR 元素中的Nationality 属性。这里使用实体的好处是借着简单地编辑实体的定义(例如,将en 的值从"English"改变成"British"),你可以改变遍布整个文章中的值(假设文章拥有许多个元素)。
<!DOCTYPE INVENTORY
[
<!ENTITY am "American">
<!ENTITY en "English">
<!ELEMENT INVENTORY (BOOK*)>
<!ELEMENT BOOK (TITLE,AUTHOR)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT AUTHOR (#PCDATA)>
<!ATTLIST AUTHOR Nationality CDATA "&am;">
]
>
<INVENTORY>
<BOOK>
<TITLE>David Copperfield</TITLE>
<AUTHOR Nationality="&en;">Charles Dickens</AUTHOR>
</BOOK>
<!--other elements...-->
</INVENTORY>
实体参照范例2
下面的DTD 定义了一个一般内部已解析实体(int_entity)与一般外部已解析实体(ext_entity)。接着它会定义另一个一般内部已解析实体,combo_entity,并将前面两个属性加入到combo_entity 属性的值中。
<!DOCTYPE INVENTORY
[
<!ENTITY int_entity "internal entity value">
<!ENTITY ext_entity SYSTEM "Entity.xml">
<!ENTITY combo_entity
"value composed of &ext_entity;plus &int_entity;">
<!--other markup declarations...-->
]
>
加入字符参照
你可以使用字符参照来加入不在键盘上的字符(例如,a),或者是那种加到目前文字中可能会造成违法的字符(例如,在元素字符数据中的「<」或「&」字符)。你不需要定义任何东西便能使用字符参照-你可以简单地将它加到你需要的地方。
字符参照拥有两种不同的格式。第一种格式是:
& #9;
其中9 是一个或多个十进制数(0 到9),代表字符在ISO/IEC 10646 字符集中的数值码。
第二种字符参照的格式是:
& #xh;
其中h 是一个或多个十六进制数字(0 到f 或F),它也代表字符在ISO/IEC 10646 字符集中的数值码。例如,& #65;与& #x41;都是加入大写字母A。(在十进制中A 的数值码是65,在十六进制中则是41。)
ISO/IEC 10646 是一种为了表达几乎属于任何程序语言的字符而设定的国际字符集。(IS上一页 [1] [2] [3] [4] 下一页 |