title.JPG (8872 bytes)

第三章 SGML和HTML

内容
  1. SGML简介
  2. HTML使用的SGML结构
    1. 元素
    2. 属性
    3. 字符参考
    4. 注释
  3. 如何阅读HTML DTD
    1. DTD注释
    2. 参数实体性定义
    3. 元素定义
    4. 属性定义

这部分文档介绍SGML以及它与HTML的关系。

3.1 SGML介绍

SGML是一种定义标记语言的系统。制作者通过与内容一起表达结构的、表现的和语意的信息来标记他们的文档。HTML是一个标记语言的例子。下面是一个HTML文档的例子:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
     "http://www.w3.org/TR/REC-html40/strict.dtd">
<HTML>
   <HEAD>
      <TITLE>My first HTML document</TITLE>
   </HEAD>
   <BODY>
      <P>Hello world!
   </BODY>
</HTML>

HTML文档分为head部分(在<HEAD>和</HEAD>之间)和body部分 (在<BODY>和 </BODY>之间)。
文档的标题(和关于文档的其它信息)出现在head部分,文档的内容出现在body内。上面例
子中的body只包含一段,用<P>标记。

每种定义在SGML语言用的标记语言称为SGML应用,它通常具有以下特征:

 

  1. 一个SGML定义SGML定义确定在应用中可以用哪些字符和分隔符。
  2. 一个文档类型定义(DTD)DTD定义了标记结构的语法。DTD还可能包括附加的定义,
    字符实体参考
  3. 一种描述用来描述标记的语意学规范。这个规范也定义了不能用DTD表达的语法限制。
  4. 包含数据(内容)和标记的文档例子。每个离子包含一个用来翻译它的DTD的指向。

HTML 4.0规范包括一个SGML定义,三种文档类型定义和一个字符参考清单。

3.2 HTML中使用的SGML结构

下面介绍HTML中使用的SGML结构。

3.2.1 元素

SGML文档类型定义定义了表示结构或所需行为的元素类型。HTML包括表示段落、超文本链
接、列表、表格、图像等。

每个元素类型定义通常描述三部分:一个起始tag,内容,和一个结束tag。

元素名出现在起始 tag(写做<元素名>)和结束tag (写做 </元素名>);要注意在结束tag元
素前的斜线。例如,元素UL摆脱了列表中的限制:

 

<UL>
<LI><P>...list item 1...
<LI><P>...list item 2...
</UL>

有的HTML元素类型允许作者取消结束标记符(例如,P和LI)。一些元素类型也允许取消起始
标记符,如HEAD和BODY。HTML DTD指出了每种元素类型是否需要起始标记符和结束标记符。

有的HTML元素类型没有内容。例如,换行符元素BR就没有内容;它的唯一作用是结束一行
文本。这样的空元素从来没有结束标记符。规范中的文档类型定义和文本指出一个元素类型
是否是空的(没有内容),或者如果没有内容,什么样的内容是合法的。

元素名一直是大小写不敏感的

3.2.2 属性

元素有相关的特性,称为属性可以有值(缺省地由作者或脚本设置)。属性/值出现在元素
起始标记符的最后一个">"之前。任何数量的属性/值对,通过空格分隔,也可能出现在元素
的起始标记符内。它们可以以任何顺序出现。

在下面的例子中,为H1元素设置了id属性:

<H1 id="section1">
This is an identified heading thanks to the id attribute
</H1> 

缺省地,SGML要求所有属性值用双引号或单引号定界。单引号可以包括在双引号内,反之
亦然。制作者也可以使用数字字符参考表示双引号(&#34)和单引号(&#39)。对于双引
号,也可以使用字符实体参考&quot。

某些情况下,制作者可以不用任何引号而为属性赋值。这样的属性值只包括字母(a-z和
A-Z),数字(0-9),连字符和逗号。我们推荐使用引号,即使有可能不用它们。

属性名一直是大小写不敏感的。

属性值一般是大小写不敏感的。参考手册中每种属性的定义指出它的值是否是大小写不敏
感的。

3.2.3 字符参考

字符参考是包含在HTML文档中的代表字符的数字或字符名。它们在指向很少用的字符时很
有用,或者用在使用制作工具很难或不可能输入的字符时。你会在此规范的后面看到字符
参考,他们以"&"开始,以分号结束。下面是一些常用的:

  • "&lt;"代表<。
  • "&gt;"代表>。
  • "&quot;"代表 " 。
  • "&#229;" (十进制) 代表带圆圈的 "a"。
  • "&#1048;" (十进制) 代表Cyrillic大写字母 "I"。
  • "&#x6C34;" (十六进制) 代表中文字“水”。

我们将在本章后面详细讨论HTML字符参考。规范中也包含可能出现在HTML 4.0文档中的字符
参考清单。

3.2.4 注释

HTML注释有一些语法:

<!-- this is a comment -->
<!-- and so is this one,
    which occupies more than one line -->

在<!和--之间不允许出现空格,但是注释可以紧挨着分隔符"--",标记定义可以紧挨着分
割符">"。一个常见的错误是在注释内包含了连字符的字符串"---"。制作者应该避免在注释
内放两个或更多相连的连字符。

注释内出现的信息没有特殊的含义。

3.3  怎样阅读HTML DTD

规范中的元素和属性定义与文档类型定义片段在一起。我们选择了把DTD片段包含在规范中。
下面的教程允许不熟悉SGML的读者阅读DTD和理解HTML规范的技术细节。

3.3.1 DTD注释

在DTD中,注释可以跨越多于一行的空间,以一对"--"标记分隔,例如:

<!ELEMENT PARAM - O EMPTY       -- named property value -->

这里,注释"named property value"解释了PAPAM元素类型的用途。DTD中的注释只起信息
作用。

3.3.2 参数实体定义

HTML DTD以一系列参数实体定义开始。“参数实体定义”定义了一种可以在DTD中其它地方引
用和扩展的宏。这些宏可能不出现在HTML文档中,只出现在DTD中。其它类型的宏,称为字符
参考,可以用在HTML文档的文本中或在属性值内。

当参数实体在DTD中通过名称引用时,可以扩展成一个字符串。

一个参数实体定义以关键字<!ENTITY %开始,然后跟着实体名,实体扩展到的引用字符串,
最后是>。DTD中的参数实体的实例以"%"开始,然后是实体名和结束用的可选的分号。

下面的例子定义了实体"%fontstyle;"将要扩展成的字符串:

<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">

参数实体扩展成的字符串可能包含其它参数实体名。这些名字被递归地扩展。在下面的例
子里,"%inline;"参数实体被定义成包含 "%fontstyle;"、"%phrase;"、"%special;"和"%formctrl;"参数实体。

<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

在HTML DTD中你会经常碰到两种DTD实体:"%block;" "%inline;"。它们用在内容模型包
block-level和inline元素时。

3.3.3 元素定义

HTML DTD块由元素类型的定义和它们的属性组成。<!ELEMENT关键字开始一个定义,>结束
之。在这两者之间可以包括:

  1. 元素名。
  2. 元素的结束标记符是否可选。在元素名之后的两个连字符表示开始和结束标记符是强制
    性的。一个跟着字母"O"的连字符表明结束标记符可以被取消。一对字母"O"表明开始和
    结束标记符都可以被取消。
  3. 元素的内容,如果有的话。一个元素允许的内容称为内容模型。被设计成没有内容的元
    素类型称为空元素 - 用关键字"EMPTY"定义。

在下面的例子中:

    <!ELEMENT UL - - (LI)+>

  • 被定义的元素类型是UL。
  • 两个连字符指明元素类型的起始标记符<UL>和结束标记符</UL>。
  • 这种元素类型的内容模型被定义为"至少一个LI元素"。下面,我们解释如何确定内容
    模型。

下面的例子说明一个空元素类型的定义:

    <!ELEMENT IMG - O EMPTY>
  • 被定义的元素类型是IMG。
  • 连字符和后面的"O"指明结束标记符可以被取消,但是与内容模型"EMPTY"在一起,形成
    了一条增强的规则:结束标记符必须被取消。
  • "EMPTY"关键字表示此类型的实例不能有内容。

内容模型定义

内容模型描述了一个元素类型的实例可以包含什么内容。内容模型定义可以包括:

  • 允许的或禁止的元素类型(如,UL元素包含LI元素类型的实例,P元素类型可以不包含其
    它P元素。
  • DTD实体(如,LABEL元素包含"%inline;"的实例,参数实体。
  • 文档文本(通过SGML结构"#PCDATA"指明)。文本可以包含字符参考。

元素的内容模型通过以下语法定义:

( ... )
定界一个组。
A | B
或者A或者B发生,当两者不同时发生。
A , B
A和B同时发生,有前后顺序。
A & B
A和B同时发生,无前后顺序。
A?
A发生0次或1次。
A*
A发生0次或多次。
A+
A发生1次或多次。

下面是HTML DTD的一些例子:

   <!ELEMENT UL - - (LI)+>

UL元素必须包含一个或多个LI元素。

   <!ELEMENT DL    - - (DT|DD)+>

DL元素必须包含一个或多个DTDD元素 - 以任何顺序。

   <!ELEMENT OPTION - O (#PCDATA)>

OPTION元素可以只包含文本和实体,如&amp;- 通过SGML数据类型#PCDATA指明。

一些HTML元素类型利用一个附加的SGML特征从他们的内容模型中排除元素。被排除的元素前
面有一个连字符。直接的排除跨越了被允许的元素。

在这个例子里, -(A)指明元素A不能出现在另一个A元素里(即anchor不能被嵌套)。

   <!ELEMENT A - - (%inline;)* -(A)>

A元素类型是DTD参数实体"%inline;"的一部分,但是被显式地排除了,因为有 -(A)

与此相似,下面的FORM类型定义禁止了嵌套窗体:

   <!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>

 

3.3.4 属性定义

<!ATTLIST关键字开始元素的属性定义。它后面是元素名,属性定义清单,和一个表示结
束的>。每个属性定义是定义了下面三条之一:

  • 属性名。
  • 属性值的类型或可能值的集合。DTD显式定义的值是大小写不敏感的。
  • 不管属性的缺省值是隐式的 (关键字"#IMPLIED" - 缺省值必须由用户提供,某种情况
    下从父元素继承而来 - 需要关键字"#REQUIRED"),还是给定某个值(关键字
    "#FIXED"),一些属性定义显式确定了属性的缺省值。

在下面的例子中,定义了MAP元素的name属性,这个属性是可选的。

<!ATTLIST MAP
  name        CDATA     #IMPLIED
  >

这个属性的允许值的类型由CDATA给定 - 一个SGML数据类型。CDATA是包含字符参考的文本。

 

下面的例子演示了几个属性的定义:

rowspan     NUMBER     1         -- number of rows spanned by cell --
http-equiv  NAME       #IMPLIED  -- HTTP response header name  --
id          ID         #IMPLIED  -- document-wide unique id -- 
valign      (top|middle|bottom|baseline) #IMPLIED

rowspan属性要求NUMBER类型的值。其缺省值显式地给定为"1"。可选的http-equiv属性需要
NAME类型的值。可选的id属性要求ID类型的值。可选的valign属性被限制在集合{top,
middle, bottom, baseline}中取值。

属性定义中的DTD实体

属性定义也可以包含参数实体参考。

在下面的例子中,我们可以看到LINK元素的属性定义以"%attrs;"参数实体开始。

<!ELEMENT LINK - O EMPTY               -- a media-independent link -->
<!ATTLIST LINK
  %attrs;                              -- %coreattrs, %i18n, %events --
  charset     %Charset;      #IMPLIED  -- char encoding of linked resource --
  href        %URI;          #IMPLIED  -- URI for linked resource --
  hreflang    %LanguageCode; #IMPLIED  -- language code --
  type        %ContentType;  #IMPLIED  -- advisory content type --
  rel         %LinkTypes;    #IMPLIED  -- forward link types --
  rev         %LinkTypes;    #IMPLIED  -- reverse link types --
  media       %MediaDesc;    #IMPLIED  -- for rendering on these media --
  >

起始标记符: 必须, 结束标记符: 禁止

"%attrs;"参数实体定义如下:

<!ENTITY % attrs "%coreattrs; %i18n; %events;">

"%attrs;"中的"%coreattrs;"参数实体的定义如下:

<!ENTITY % coreattrs
 "id          ID             #IMPLIED  -- document-wide unique id --
  class       CDATA          #IMPLIED  -- space separated list of classes --
  style       %StyleSheet;   #IMPLIED  -- associated style info --
  title       %Text;         #IMPLIED  -- advisory title/amplification --"
  >

"%attrs;" 参数实体的定义是为了方便,因为大多数HTML元素类型都定义了这些属性。

与此相似,DTD定义了作为字符串"CDATA"的扩展的"%URI;"参数实体。

<!ENTITY % URI "CDATA"
    -- a Uniform Resource Identifier,
       see [URI]
    -->

如上面的例子所演示的,参数实体"%URI;"提供给读者更多的DTD信息 - 相对于属性所期待的
数据类型来说。   "%Color;", "%Charset;", "%Length;", "%Pixels;"等也有相似的实体定义。

布尔属性

一些属性拥有布尔变量(例如,OPTION元素的selected属性)。元素起始标记符中的表现形式
隐含的属性值是"true"。如果没有,则隐含值为"false"。

布尔属性只有单一的值:属性名本身(例如,selected="selected")。

下面的例子定义一个selected属性为布尔值。

selected     (selected)  #IMPLIED  -- reduced inter-item spacing --

通过出现在元素的起始标记符中设置属性的值为"true"。

<OPTION selected="selected">
...contents...
<OPTION>

在HTML中,布尔属性可以出现在最小化表单中-- 属性值单独出现在元素的起始标记
符中。于是,selected可以这样设置:

<OPTION selected>

而不是:

<OPTION selected="selected">

制作者应注意:有的用户界面只认识布尔属性的最小化表单,而不是全部表单。

HTML 4.0规范
[第1章][第2章][第3章][第4章]

back.JPG (8780 bytes)