打印本文 打印本文 关闭窗口 关闭窗口
定义及使用实体
作者:武汉SEO闵涛  文章来源:敏韬网  点击数3230  更新时间:2009/4/23 11:18:18  文章录入:mintao  责任编辑:mintao
  卷标描述了一种特殊的数据格式。它是借着提供该格式描述的位置、可以处理该种格式数据的应用程序位置,或简单的格式叙述等方式来提供数据格式。你可以使用标签来描述一般外部未解析实体(如你在前面章节中所见到的)的格式,或者你可以为拥有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]  下一页

打印本文 打印本文 关闭窗口 关闭窗口