组织:中国互动出版网(http://www.china-pub.com/)
RFC文档中文翻译计划(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:ouyang@china-pub.com
译者:黄俊(hujiao  hj_chinese@yahoo.com)
译文发布时间:2001-4-26
版权:本中文翻译文档版权归中国互动出版网所有。可以用于非商业用途自由转载,但必须
保留本文档的翻译及版权信息。


Network Working Group                                         D. Raggett
Request for Comments: 1942                                           W3C
Category: Experimental                                          May 1996

HTML中的表格
(RFC1942 HTML Tables)
本备忘录的状态

本备忘录描述了一种Internet社区的试验协议。本备忘录并未规定任何Internet标准,它需
要进一步进行讨论和建议以得到改进。本备忘录的发布不受限制。

摘要

超文本标记语言(HTML)是一种简单的用来建立超文本文档的标记语言,以便能让文档能
在不同的平台上使用。HTML文档是具有通用语义的SGML文档,适合在很多应用程序中
来表达信息。本规范对HTML做出了扩展以便能支持各种表格。该模型被设计成可以和联
合样式表一道工作,但也可以独立于联合样式表。它还可以支持制作盲文,语言,或者数据
库和电子数据表中的数据表格。HTML的表格模型包含了CALS表格模型中的某些方面,
比如,可以将表格的行用thead, tbody,tfoot组织起来,还有根据上下文可以简洁地指定
不同的单元格如何对齐。

目录

   1.最新的修改  ................................................. 2
   2.主要介绍  .…................................................ 2
   3.设计的基本原理  .......................................... 5
   4.了解表格DTD  ............................................ 6
   5.推荐的布局算法  ............................................ 20
   6.HTML表格DTD  ........................................... 22
   7.参考文章  ..............…..................................... 26
   8.安全性考虑  ..............….................................. 26
   9.作者地址  ....................……............................ 27

1.最新的修改

本规范扩展了HTML以支持表格。表格模式是由HTML+的早期工作以及HTML3的初稿脱
胎而来的。更早的模型是根据信息提供者所提出的对更好地控制表格形式的信息的布局的要
求而扩展的。

? 根据指定的字符对齐,比如:"."和":"。例如,将一列数字按照小数点来对齐。
? 在制定表格的框架和规则时有更大的灵活性。
? 在大的表格中能够根据收到的数据逐段显示。
? 能够支持在保持标题头不动的情况下进行表格的卷动,而且对跨页的表格打印有更好的
支持。
? 可选择的列的默认对齐属性。

此外,还有一个主要的目标就是要能够给那些很多在Netscape上所实现的表格应用提供向
后兼容性。其次的目标是在将表格按照SGML CALS模型导入的时候,要能够简化工作量。
最终的草案将让Netscape和Microsoft浏览器兼容同样的ALIGN(对齐)属性。我们已经
对DIR属性的角色做出了一些说明,并针对当混合使用列的绝对宽度和相对宽度时所推荐
采取的行动。

我们采用了一个新的元素COLGROUP,以便能将那些用一个或更多的COL表示的,带有
不同的宽度和对齐属性的列组合成不同的组。COLGROUP的语义已经在前面的草案中做出
了说明,并用RULES=GROUPS代替了RULES=BASIC。

我们修改了FRAME和RULES的属性,这样既不会和SGML中的名字冲突,也不会和ALIGN
和VLALIGN属性冲突。做出这样的修改主要是考虑到将来如果规范对表格元素进行扩展,
支持FRAME和RULES属性时所可能带来的问题。

2.对HTML表格的主要介绍

表格由一个可选的标题头开始,后面跟着一行或许多行。每一行由一个以上的单元格组成,
并可以区分为表头和数据单元格。单元格可以被合并以跨列或跨行,带有可被表现为语音或
盲文的属性,以及能够将表格数据导出到数据库中的属性。这个模型提供了部分的能力来控
制表格的外观,比如说对单元格内容的水平或垂直对齐,框线的样式,单元格内的是周边距。
你可以通过将行或列组合在一起来影响这些属性。表格能包含各种各样的内容,比如说标题
头,列表,段落,表单,图形,预定义的文字甚至嵌套表格。

示例:

   <TABLE BORDER>
     <CAPTION>A test table with merged cells</CAPTION>
     <TR><TH ROWSPAN=2><TH COLSPAN=2>Average
         <TH ROWSPAN=2>other<br>category<TH>Misc
     <TR><TH>height<TH>weight
     <TR><TH ALIGN=LEFT>males<TD>1.9<TD>0.003
     <TR><TH ALIGN=LEFT ROWSPAN=2>females<TD>1.7<TD>0.002
   </TABLE>

在一个哑终端上,这将会显示出类似下面的东西:

                 A test table with merged cells
       /--------------------------------------------------\
       |          |      Average      |  other   |  Misc  |
       |          |-------------------| category |--------|
       |          |  height |  weight |          |        |
       |-----------------------------------------|--------|
       | males    | 1.9     | 0.003   |          |        |
       |-----------------------------------------|--------|
       | females  | 1.7     | 0.002   |          |        |
       \--------------------------------------------------/

接下来,我们再看一个带行组合和列组合的例子(摘录自Nadine Kano的《开发国际性的
软件》)。首先是表格实际显示出来的样子:

                     CODE-PAGE SUPPORT IN MICROSOFT WINDOWS
===================================================================
=====
Code-Page| Name                      |ACP OEMCP| Windows Windows Windows
    ID   |                           |         |  NT 3.1 NT 3.51    95
------------------------------------------------------------------------
   1200  |Unicode (BMP of ISO 10646) |         |     X       X       *
   1250  |Windows 3.1 East. Europe   |  X      |     X       X       X
   1251  |Windows 3.1 Cyrillic       |  X      |     X       X       X
   1252  |Windows 3.1 US (ANSI)      |  X      |     X       X       X
   1253  |Windows 3.1 Greek          |  X      |     X       X       X
   1254  |Windows 3.1 Turkish        |  X      |     X       X       X
   1255  |Hebrew                     |  X      |                     X
   1256  |Arabic                     |  X      |                     X
   1257  |Baltic                     |  X      |                     X
   1361  |Korean (Johab)             |  X      |             **      X
------------------------------------------------------------------------
    437  |MS-DOS United States       |     X   |     X       X       X
    708  |Arabic (ASMO 708)          |     X   |                     X
    709  |Arabic (ASMO 449+, BCON V4)|     X   |                     X
    710  |Arabic (Transparent Arabic)|     X   |                     X
    720  |Arabic (Transparent ASMO)  |     X   |                     X
===================================================================
=====

这里使用的COLGROUP元素将列组合起来并赋予默认的对齐属性。TBODY元素用来组合
行。FRAME和RULE属性用来选择那些需要显示的框线。

   <table border=2 frame=hsides rules=groups>
   <caption>CODE-PAGE SUPPORT IN MICROSOFT WINDOWS</caption>
   <colgroup align=center>
   <colgroup align=left>
   <colgroup align=center span=2>
   <colgroup align=center span=3>
   <thead valign=top>
   <tr>
   <th>Code-Page<br>ID
   <th>Name
   <th>ACP
   <th>OEMCP
   <th>Windows<br>NT 3.1
   <th>Windows<br>NT 3.51
   <th>Windows<br>95
   <tbody>

   <tr><td>1200<td>Unicode (BMP of ISO 10646)<td><td><td>X<td>X<TD>*
   <tr><td>1250<td>Windows 3.1 Eastern European<td>X<td><td>X<td>X<TD>X
   <tr><td>1251<td>Windows 3.1 Cyrillic<td>X<td><td>X<td>X<TD>X
   <tr><td>1252<td>Windows 3.1 US (ANSI)<td>X<td><td>X<td>X<TD>X
   <tr><td>1253<td>Windows 3.1 Greek<td>X<td><td>X<td>X<TD>X
   <tr><td>1254<td>Windows 3.1 Turkish<td>X<td><td>X<td>X<TD>X
   <tr><td>1255<td>Hebrew<td>X<td><td><td><td>X
   <tr><td>1256<td>Arabic<td>X<td><td><td><td>X
   <tr><td>1257<td>Baltic<td>X<td><td><td><td>X
   <tr><td>1361<td>Korean (Johab)<td>X<td><td><td>**<td>X
   <tbody>
   <tr><td>437<td>MS-DOS United States<td><td>X<td>X<td>X<TD>X
   <tr><td>708<td>Arabic (ASMO 708)<td><td>X<td><td><td>X
   <tr><td>709<td>Arabic (ASMO 449+, BCON V4)<td><td>X<td><td><td>X
   <tr><td>710<td>Arabic (Transparent Arabic)<td><td>X<td><td><td>X
   <tr><td>720<td>Arabic (Transparent ASMO)<td><td>X<td><td><td>X
   </table>

3.设计的基本原理

HTML表格模型来自于各方面相关软件的研究,包括现有的SGML表格模型,常用的字处
理软件包对表格的处理,杂志、书刊及其他纸质文档中对表格数据的排版等。该模型能够让
简单的表格简洁地表述,而如果需要的话,可以增加额外的复杂性。这对那些每天都要修改
内容的文字编辑者来说,非常具有实际意义,同时也减少了从头开始的过程。这个特性对于
HTML今天的成功是非常重要的。

越来越多的人使用来自其他文档格式的过滤器或者直观的所见即所得的HTML编辑器。对
HTML表格模型来说,很好地和这些创作HTML的方法结合在一起是非常重要的。这将影
响到如何显示处理那些跨行或跨列的单元格,以及如何表现那些组合在一起的单元格的对齐
或者其他的属性。

对HTML表格模型的一个主要考虑就是浏览器上使用的字体和窗口大小等是不受创建者控
制的。这就给那些依靠用绝对值的单位,比如picas或pixels来指定列宽的表格带来一定的
风险。相应的,表格可以被动态地扩展大小以和现有的窗口大小和字体协调。作者可以用相
对宽度来指示列宽,而用户端应该确认列的宽度是否足够能容纳最大的单元格的内容。如果
作者的本来意图必须被更改的话,个别用相对宽度指定的列不应该被大幅度的改变。

对于大表格或者比较慢的网络连接速度来说,如果能在完成所有的数据传输前就开始显示表
格将会是十分理想的。对大多数用户代理来说,默认的窗口宽度能显示80个字符,许多
HTML页面都是按照这个默认的设置来设计图形的。创建者能够给用户代理一个提示来启动
表格内容的逐行显示。这个特性需要创建者事先声明列的数目,以及提供用相对或绝对尺寸
对不同的列宽和表格宽度的定义。

对于逐行显示来说,浏览器需要知道列的数目和它们的宽度。默认的表格宽度是当前窗口的
大小(width="100%")。这可以通过改变TABLE的起始标记里的WIDTH属性来改变。默
认地,所有的列都具有同样的宽度,但你也能够在表格数据开始前,指定一个或多个COL
元素的列宽。

剩下的问题就是列的数目了。有些人曾经建议直到表格的第一行数据传输完后才开始显示,
但如果单元格里有很多的内容的话,这可能要花费相当多的时间。大体上看来,如果要实现
逐行显示,让创建者在TABLE的起始标记里面明确地指明列的数目可能会更加现实一些。

创建者可能还需要能够通知浏览器是否要使用逐行显示,或者是否要自动缩放表格以便能够
容纳单元格内的内容。在这两种涉及到自动调整大小方式的情况中,由于对于逐行显示方式
来说,列的数目需要在开始的时候就被注明,所以列的数目在第一种情况里就能够得到确认。
因此,看起来使用COLS=_nn_会比使用LAYOUT属性比如LAYOUT=FIXED或者
LAYOUT=AUTO来得更加合理。

一般来说,从两方面来考虑文档是非常有帮助的:结构化的标记,比如标题头,段落,列表,
表格以及图片;控制显示的标记,比如边距,开始的空格,字体和字号。过去的经验告诉我
们应该将文档中结构化的信息和控制显示的信息区分开来。将这两者混在一起将会给管理和
维护文档带来不断增加的成本,并减少程序和媒体间的可移植性。

对表格来说,从纯化论者的眼光来看,单元格中的文字对齐,单元格间的框线都是控制显示
的信息。但是,如果将这些和结构化的信息组合起来将是非常有用的,因为这些特性在从一
个程序转移到另一个程序中时,具有着很强的移植性。HTML表格模型将大部分控制显示的
信息留给了关联式样表。该模型被设计成可以利用类似的式样表,但也可以单独存在。

HTML+早期的研究提出了一个较简单的模型,本方案对该模型提出了一个超集。表格被认
为是由一个可选的标题及一系列的行组成,而这些行又是由一系列的单元格所组成。该模型
进一步区分了标题头和数据单元格,并且允许单元格能够跨越多行和多列。

按照CALS表格模型,本方案同样允许表格的行可以被组织成标题头,正文,和脚注部分。
这简化了显示控制信息的表述,而且当表格超出了页的边界的时候,能够重复表格的标题头
和脚注所在的行,也能够在一个可滚动的表格面板上提供一个固定的标题头。在标记语言中,
脚注部分被放置在正文部分的前面。这是来自于CALS的一个优化考虑,当处理非常长的
表格时,可以先显示脚注部分,而不用等到所有的表格内容的传输结束后才开始。

对于视觉障碍人士来说,HTML还减少了由于使用图形窗口界面而给他们带来的不便。
HTML表格模型包括能对每个单元格进行标识的属性,以支持高质量的从文字到语音的转
换。同样的属性也可以被用来支持自动将表格数据导入或导出到数据库或电子表格中。

现有的桌面出版软件提供丰富的对表格显示的控制,但要在HTML中也这样实现是不切合
实际的,这将会将HTML变成像RTF或MIF那样臃肿的文字格式。然而,本方案确实让创
建者能够在一套常用的边框式样中有所选择。FRAME属性控制表格四周框线的显示方式,
而RULES属性决定了表格内部的划线方式。

在本方案的拟定过程中,我们尝试了一系列的方法来描绘表格框线的式样。其中的一个问题
关心的是其所能制作出的语句的种类。对边缘减少和边缘增加的内在支持导致了相对复杂的
算法。例如,研究显示,如果允许所有的表格元素都具有FRAME和RULES属性的话,那
么在确定一个单元格的一条特定的边线是否要被划线的时候,将要进行24步的计算。而这
些额外的复杂算法甚至还没有满足所有控制表格显示的要求。目前的方案有意倾向于一个简
单的、直观的、能满足大多数应用的模型,在一个更复杂的方案成为标准前,还需要作很多
试验性的研究。

4.了解表格DTD

表格的文档内容定义(DTD)为HTML表格的语法给出了一个正式的定义。下面就给出了一个
DTD列表,并加上了注解。本文的末尾给出了完整的DTD。

请注意TABLE元素是对一个区域,而不是对字符起作用,所以它和HTML中其他类似的元
素比如段落,列表,标题等一样,控制的是一部分文字。

4.1常用属性

以下这些属性常被某些元素使用,在这里列出它们简洁的定义。一般说来,本方案中的所有
属性的名称和值都不严格区分大小写,但是特别注明的除外。属性ID和CLASS是配合式
样表使用的,而LANG和DIR则是为了满足国际化的需要。

   <!ENTITY % attrs
          "id      ID       #IMPLIED  -- 元素标识符 --
           class   NAMES    #IMPLIED  -- 为子类元素 --
           lang    NAME     #IMPLIED  -- 根据RFC 1766规范 --
           dir   (ltr|rtl)  #IMPLIED  -- I18N文字说明 --">

   ID
用来定义文档范围内的标识符。既可以用来指明文档内的位置,以作为一个超链的链接目标,
也可以在样式表中使用来赋予一个元素独特的式样。ID属性的值是一个SGML NAME标记,
该标记由一个字母开头,后面跟着字母,数字或"-"及"."符号,字母只能为A-Z和a-z。

   CLASS
一个用空格隔开的SGML NAME标记列表。CLASS属性指定该元素属于对应于该名称的
类。它可以让作者来区分有着同样标记的元素所扮演的不同角色。CLASS也可以在用在式
样表中来给这些不同的角色赋予不同的外在表现。

   LANG
LANG属性指明了该元素的内容所使用的语言种类。关于语言的种类和有关语法在RFC 
1766中做出了定义。概括地说,LANGUAGE的值由一个首标记构成,后面可以跟0个或
更多的子标记,中间用"-"隔开。不允许在其中出现空格,而且所有的标记都是大小写敏感的。
这些标记由IANA制订。两个字母的首标记是一个ISO 639中规定的语言缩写,而第一个子
标记是两个字母组成的,由ISO 3166规定的国家代码。以下是一些LANG属性的示例值:

             en, en-US, en-uk, i-cherokee, x-pig-latin.

   DIR
人类的书写系统是由一系列的文字组成,这其中主要的区别就是文字的书写方向。拉丁语系
的文字通常是从左到右书写的,而阿拉伯语系的文字是从右到左的。这些字符都有很强的方
向性。其他的字符则没有方向性(比如空格)或者是没有明显的方向性(比如标点符号)。

DIR属性为在解释方向性不明确的字符过程中指明了封装的边界。它并不影响那些具有方向
性的字符本来的方向。DIR属性的值可以是LTR(既从左到右),也可以是RTL(从右到
左)。例如:DIR=RTL。

当对TABLE应用该属性的时候,它将会确定行的几何布局(比如说,如果DIR=RTL的行,
第一行将会在右边显示,而如果DIR=LTR的话,则显示在左边)。而且如果没有其他的
DIR属性来影响单元格中的内容的话,它还将指明单元格中文字的默认排列方向。

4.2 Horizontal和Vertical对齐属性
表格内容的对齐既可以通过一个单元格一个单元格进行指定,也可以从包含其的元素继承过
来,比如说从行,列或者该表格元素本身。

   ALIGN
这个属性定义了单元格内容的水平对齐方式。

   <!—单元格内容的水平对齐属性 -->
   <!ENTITY % cell.halign
           "align  (left|center|right|justify|char) #IMPLIED
            char    CDATA   #IMPLIED – 对齐的字符, 例如: char=':' --
            charoff CDATA   #IMPLIED – 对齐字符的偏移 --"
           >

该属性的值应该为LEFT,CENTER,RIGHT,JUSTIFY或CHAR中的一个。如果用户端
不支持两端对齐的话,它将把JUSTIFY简单地理解为左对齐。

对于那些跨行或跨列的单元格来说,它们的对齐属性是从行或列继承过来的。该单元格起始
的行或列的对齐方式决定了它们将采用的对齐方式。

请注意,单元格内部的元素的对齐属性,例如一个P元素,将会覆盖该单元格本来的对齐
属性。

   CHAR
当对齐属性为align=char的时候,用CHAR来指定对齐的字符,例如:char=":"。默认的对
齐字符是LANG属性所指定的当前语言中的小数点,CHAR属性的值是大小写敏感的。

   CHAROFF
如果一行中有指定的对齐字符,使用该属性可以指定该行中第一次出现的对齐字符的偏移
量。如果该行中没有包括该指定的字符,就应该水平地和对齐的位置保持一致。根据DIR
属性所指定的单元格里面内容的方向,来确定指定的偏移量是从单元格的左边还是右边开
始。对于拉丁语系来说,偏移量是从单元格的左边距算起;而对于阿拉伯文字来说,则应该
是从右边开始算起。除了使用标准的距离单位外,也可以通过使用"%"符号来指定偏移量为
所在单元格宽度的百分比。例如CHAROFF="30%",指定了对齐的字符应该在该单元格宽
度30%的位置。

在使用上文所提到的两种布局的算法的时候,如果没有明确地指出或继承CHAROFF的属
性的话,默认的对齐位置可以这样确定:确认带有ALIGN=CHAR的列中各行数据在指定的
对齐字符前或后的最大宽度,并将对齐位置确定为能让这些值居中放置。对于逐行显示的表
格来说,建议的默认值是CHAROFF="50%"。如果在不同行中某一列里,只有一部分单元
使用了字符对齐属性。那么默认地,所有的单元格都将统一排列,而不管哪个字符被用来指
定为对齐字符。因为如果数据超过了所分配的列的宽度,而对齐的属性又不够明确的话,对
于列来说,处理对象所需要涉及的划线将会变得非常复杂。

   VALIGN
该属性定义单元格内容是根据单元格顶部对齐,还是中间对齐,或是底部对齐。

       <!—单元格内容的垂直对齐属性 -->
       <!ENTITY % cell.valign
               "valign  (top|middle|bottom|baseline)  #IMPLIED"
               >

如果使用该属性,该属性的值应该是TOP,MIDDLE,BOTTOM或者是BASELINE中的一
种。在同一行中使用valign=baseline的所有单元格都将垂直对齐,这样,每个单元格中的
第一行文字都会对齐于同一条基线。但这并不影响到这些单元格里面其他行文字。

4.3 继承顺序

绝大部分的表格元素都能使用这些对齐属性,包括COL,THEAD,TBODY,TFOOT,TR,
TH以及TD。当在进行单元格布局的时候,列的水平对齐属性要优先于行的水平对齐属性,
而对于垂直对齐来说,行的垂直对齐属性的优先级要高于列。下面这张表详细地说明了每个
属性的优先级顺序。
表中X>Y表示X的优先级要高于Y。

   ALIGN, CHAR 及 CHAROFF:

   单元格 > 列 > 列构成的组 > 行 > 行构成的组 > 默认的属性

   VALIGN, LANG 及 DIR:

   单元格 > 行 > 行构成的组 > 列 > 列构成的组 > 表格 > 默认的属性

这里所说的单元格是由TH或TD元素定义的;行由TR元素定义,行构成的组由THEAD,
TBODY和TFOOT元素定义,列则由COL元素定义,列构成的组由COLGROUP和COL
元素定义。请注意这里所提到的继承机制并不适用于CLASS属性。

在单元格上的定义的属性将优先于继承得来的属性,但却会被单元格内部的元素的对齐属性
所覆盖。如果在上面提到的这些元素中没有指明ALIGN属性的话,对表格单元格推荐的默
认对齐方式是:表格数据是ALIGN=LEFT,表头是ALIGN=CENTER。垂直对齐属性推荐
默认对齐为VALIGN = MIDDLE。之所以选择这样的默认值是因为这些能够适应大多数的
Netscape的应用方案。

4.4 宽度计量的标准单位

有多个属性通过用一个带有可选的后缀的数字来表示宽度。宽度的单位用该后缀来表示:
pt是points(点),pi是picas(像素),in代表inches(英寸),cm表示centimeters(厘
米),mm表示millimeters(毫米),em代表em单位(和默认的字体的高度相等),px
则表示屏幕的像素。数字是一个整数或者是实数比如"2.5"。指数,象"1.2e2"这样的数字是
不允许的。在数字和后缀间不允许出现空格。

对特定的元素来说,以上这些后缀还可以进行扩充:TABLE标记的WIDTH属性可以使
用"%"。它用来指定距离左边界和右边界的宽度的百分比。例如width="50%"。对COL元素
来说,WIDTH属性可以使用"*"来指定列的相对宽度,比如width="3*",这和CALS表格模
型中的表示方法是一样的。

4.5 TABLE标记

<!ENTITY % Where "(left|center|right)">

<!ELEMENT table - - (caption?, (col*|colgroup*), thead?, tfoot?, tbody+)>

<!ATTLIST table                    -- 表格标记 --
        %attrs;                    -- id, lang, dir 以及 class --
        align   %Where;  #IMPLIED  -- 表格位置 ,相对于 --
                                   -- 窗口 --
        width   CDATA    #IMPLIED  -- 相对于窗口的表格宽度 --
        cols    NUMBER   #IMPLIED  -- 用于立即显示内容的方式--
        border  CDATA    #IMPLIED  -- 控制表格范围内的 --
                                   -- 框架结构 --
        frame   %Frame;  #IMPLIED  -- 包括表格哪一部分的 --
                                   -- 框架 --
        rules   %Rules;  #IMPLIED  -- 控制单元格间的划线 --
        cellspacing CDATA #IMPLIED –  单元格间的距离 --
        cellpadding CDATA #IMPLIED –  单元格内部的间隔距离 --
        >

TABLE标记需要将开始和结束标记成对使用。表格标记由一个可选的CAPTION标记开头,
后面可以跟着一个或更多的COL标记,也可以是一个或更多的COLGROUP标记,然后是
可选的THEAD,TFOOT标记,最后是一个或更多的TBODY标记。

   ID, CLASS, LANG and DIR
参见前文对这些属性的描述。

   ALIGN
定义表格相对于当前的左边界和右边界的水平位置。ALIGN=CENTER将让表格居于左右边
界的中间,ALIGN=LEFT让表格位于左边界,而ALIGN=RIGHT让表格靠近右边界。当表
格使用ALIGN=LEFT时,用户端可能会让文字环绕在表格的右边,而ALIGN=RIGHT时,
文字环绕在表格的左边。

请注意如果你对表格使用了ALIGN=LEFT属性,而又不想让文字环绕表格的话,你可以在
表格标记的后面使用<BR CLEAR=LEFT>。同样如果表格右对齐的话,则需要用<BR 
CLEAR=RIGHT>。为了防止一个右对齐的表格环绕在其他什么东西旁边,可以在表格前面
使用<BR CLEAR=RIGHT>。通过使用式样表,可以更好地对文字流进行控制。

   WIDTH
指定表格希望的宽度。除了使用标准单位来定义宽度之外,还可以使用"%"符号来指定距离
左右边界的空白的宽度,例如width="50%"。如果不指定该属性的话,表格的宽度将由后面
所给出的布局算法来决定。

即使明确地指定了表格的宽度,我们仍然建议表格的宽度可以被扩大以便能避免单元格内容
的溢出。这里对表格宽度的增加应该尽量避免过多地改变创建者事先所指定的列的相对宽
度。为了避免产生过多的水平卷动,或是产生不切实际或不希望出现的水平卷动时,应该将
文字分为多行显示。

   COLS
该属性定义了表格中所含有的列的数目。如果包含该属性的话,用户端将能够在从网络上接
受到数据后就开始动态显示表格,而不用等到所有的表格数据都传输完成后才开始。如果没
有指明WIDTH属性,在这种情况下,宽度将默认地被假设为"100%"。如果没有指定COLS
属性,那么就需要一个根据表格的内容预先设置的方案来决定列的数目,以及每一个列的合
适的宽度值。

   BORDER
指定表格框线的宽度,参见标准单位。

   FRAME
指定哪一边的框线需要显示。

       <!ENTITY % Frame
          "(void|above|below|hsides|lhs|rhs|vsides|box|border)">

       VOID
           不显示任何一边的框线。

       ABOVE
           顶端的框线

       BELOW
           底部的框线

       HSIDES
           顶部和底部的框线

       LHS
           左边的框线

       RHS
           右边的框线

       VSIDES
           左边和右边的框线

       BOX
           所有的四周的框线

       BORDER
           所有的四周的框线

"Border"值是为了保持对旧的浏览器的兼容性而保留的。如果一个文档里面包含了<TABLE 
BORDER>,用户端将把它看成是FRAME=BORDER及BORDER=_implied_。如果文档
包含的是<TABLE BORDER=_n_>,那么用户端会将这个认为是FRAME=BORDER,而如
果_n=0_,则会理解为FRAME=VOID。

请注意:如果FRAME的取值能够和RULES属性以及对齐属性的取值能够保持一致的话,
那将会更加合理。例如:none, top, bottom, topbot, left, right, leftright, all。但是,不幸的是,
SGML要求每个元素的取值都必须区别于其他元素。这就给"none", "left", "right" 及"all"带来
了问题。FRAME选择这些值以避免和RULES,ALIGN以及VALIGN属性发生矛盾。这为
将来的试验保留了一种选择,因为我们估计,在将来对本方案进行修改的时候,其他的表格
元素也将会被赋予FRAME和RULES属性。HTML-MG中大多数意见认为,如果能够使用
SGML的校验工具根据列举的值来检查属性,那么这所带来的好处将超过对名称的一致性
的需求。

   RULES
指定在什么地方来显示表格内部的线条。       

       <!ENTITY % Rules "(none | groups | rows | cols | all)">

       NONE
禁止显示内部的线条。

       GROUPS
THEAD,TFOOT以及TBODY元素将表格按行划分为不同的组,而COLGROUP元素将
表格按列划分为不同的组。该属性将能够在每一个由行构成的组之间显示一条水平线,而在
每一个由列构成的组之间显示一条垂直线。需要注意的是每一个表格最少有一个由行构成的
组,一个由列构成的组。

       ROWS
由于RULES=GROUPS将在所有的行之间显示水平线。用户端可以在行或列构成的组之间
突出显示一条粗线。

       COLS
由于RULES=GROUPS将在所有的列之间显示垂直线。用户端可以在行或列构成的组之间
突出显示一条粗线。

       ALL
在所有的行和列之间都显示线条。用户端可以在行或列构成的组之间突出显示一条粗线。

如果一个文档包括<TABLE BORDER>或者<TABLE BORDER=_n_>,那么表格元素的默认
值是RULES=ALL,而如果_n=0_,那么相应地RULES=NONE。

   CELLSPACING
该属性是用来保留对旧的浏览器的兼容性的。它指定了表格框架间、每一行或列中的第一个
或最后一个单元格和表格边框的距离,以及表格中其他单元格之间的距离。参见标准单位。
通过使用式样表可以对该属性有更好的控制。

   CELLPADDING
该属性是用来保留对旧的浏览器的兼容性的。它指定了单元格边线和它内部的内容四周的距
离大小。参见标准单位。通过使用式样表可以对该属性有更好的控制。

如果表格或列设定了固定的宽度,CELLSPACING和CELLPADDING可能会比所指定的值
需要更多的空间。实践经验显示,如果和WIDTH的属性发生冲突的话,后者会具有更高的
优先级。虽然这并不是本方案所规定为必须的。

4.6 表格标题

   <!ELEMENT caption - - (%text;)+>

   <!ENTITY % Caption "(top|bottom|left|right)">

   <!ATTLIST caption                  -- 表格标题 --
           %attrs;                    -- id, lang, dir及class --
           align   %Caption; #IMPLIED – 相对于表格 --
           >

CAPTION元素是可选的元素,它用来给表格提供一个标题,需要起始和结束标记成对使用。

   ID, CLASS, LANG and DIR
参见前文中其他元素的该属性定义       

   ALIGN
该属性可以用来控制表格标题相对于表格的位置。当使用ALIGN属性的时候,该属性应该
是下列的几个值之一:TOP, BOTTOM, LEFT及RIGHT。我们推荐标题应该和表格的宽度
或高度保持一致。我们还特意不对标题的默认位置做出具体的规定。

请注意ALIGN属性在HTML中被过度地使用了,但是为了和现有的浏览器兼容,我们在这
里仍然使用了该属性。

4.7 COLGROUP元素

   <!ELEMENT colgroup - O (col*)>

   <!ATTLIST colgroup
           %attrs;                    -- id, lang, dir及class --
           span    NUMBER   1         -- 组里面默认的 --
                                      -- 列的数目 --
           width   CDATA    #IMPLIED  -- 所包含的COL --
                                      -- 的默认宽度 --
           %cell.halign;              -- 单元格中的 --
                                      -- 水平对齐设置 --
           %cell.valign;              -- 单元格中的垂直对齐设置 --
           >

COLGROUP元素就像一个容器,来容纳一组列,并允许你能够给这些列设置默认的属性。
如果没有使用COLGROUP元素,表格中所有的列都被假定认为属于同一个列的组。每一
个COLGROUP元素能够容纳0个或更多的COL元素。COLGROUP需要一个起始的标记,
但是结束标记可以省略。这在定义一系列的COLGROUP元素的时候特别有用。例如

       <TABLE FRAME=BOX RULES=COLS>
         <COLGROUP>
           <COL WIDTH="1*">
           <COL WIDTH="2*">
         <COLGROUP>
           <COL WIDTH="1*">
           <COL WIDTH="3*">
         <THEAD>
           <TR> ...
       </TABLE>

   COLGROUP可以具有以下这些属性:

   ID, CLASS, LANG和DIR
参见前文中其他元素的该属性定义。

   SPAN
用一个正整数的值来表示在这个组里面默认的有多少列。如果COLGROUP元素中含有一
个或更多的COL元素的话,那么这个属性应该被忽略。该属性提供了一种方便的方法来组
织列,而不用指定COL元素。

   WIDTH
为一个组中的列指定一个默认的宽度值,参见标准单位。另外,可以使用"*"来说明相对宽
度。例如

            width=64        用屏幕像素表示的宽度
            width=0.5*      0.5的相对宽度

相对宽度可以看作是各个不同列的之间的相对宽度的一个约束。如果一个COLGROUP元
素指定了一个值为0的相对宽度,那么这个组里面的所有列都会被按照它们最小的宽度进
行设定,除非它们被一个带WIDTH属性的COL元素另外做出规定。如果宽度是按照绝对
单位给出的,用户端可以用这个宽度来约束表格的宽度。"*"后缀用来简化导入那些使用
CALS表述方式的表格的工作。

   ALIGN, CHAR, CHAROFF and VALIGN
指定表格单元格内部的水平和垂直对齐属性。请参看对齐属性的继承顺序。

4.8 COL元素

   <!ELEMENT col - O EMPTY>

   <!ATTLIST col                      -- 列构成的组以及--
                                      -- 它们的属性 --
           %attrs;                    -- id, lang, dir和class --
           span    NUMBER   1         -- 组中所跨越的--
                                      -- 列的数目--
           width   CDATA    #IMPLIED  -- 列的宽度说明--
           %cell.halign;              -- 单元格中的--
                                      -- 水平对齐属性 --
           %cell.valign;              -- 单元格中的垂直对齐属性 --
           >

该可选的元素用来指定表格中列的默认设置。该元素是一个空元素,不含有内容,所以也不
会有结束标记。可以连续给出多个COL元素。COL的属性将会覆盖包含它们的COLGROUP
元素的本身属性。

   ID, CLASS, LANG和DIR
参见前文中其他元素的该属性定义。

   SPAN
用一个正整数的值来表示在这个元素影响的列的数目,默认为一个。如果不指定SPAN属
性的话,那么第一个COL元素将应用到第一个列,第二个元素应用到第二个列,以此类推。
如果第二个元素指定SPAN=2,那它将会应用到第二和第三个列。接下来的COL元素则应
用到第4个列,并这样继续下去。特别地,如果用SPAN=0,这意味着COL元素将应用到
从当前列直到最后列之间的所有列。需要注意的是一个COL SPAN并不定义一个组。它主
要是用来共享属性的定义。

   WIDTH
定义列的宽度,参见标准单位。如果该元素跨越了若干个列,那么WIDTH属性指定的是每
个独立的列的宽度,而不是整个跨越的宽度。此外,可以使用"*"后缀来说明相对宽度。

       例如

            width=64        用屏幕像素表示的宽度
            width=0.5*      0.5的相对宽度

相对宽度可以看作是各个不同列的之间的相对宽度的一个约束。如果一个COL元素指定了
一个值为0的相对宽度,那么该列会按照它最小的宽度进行设定。如果宽度是按照绝对单
位给出的,用户端可以用这个宽度来约束表格的宽度。当导入那些使用CALS表述方式的
表格时,使用"*"后缀来简化导入工作。

   ALIGN, CHAR, CHAROFF和VALIGN
指定表格单元格内部的水平和垂直对齐属性。请参看对齐属性的继承顺序。

4.9 表格的表头,表体和脚注元素

   <!ELEMENT thead - O tr+>
   <!ELEMENT tfoot - O tr+>
   <!ELEMENT tbody O O tr+>

   <!ATTLIST (thead|tbody|tfoot)      -- 表格部分 --
           %attrs;                    -- id, lang, dir和class --
           %cell.halign;              -- 单元格中的--
                                      -- 水平对齐属性 --
           %cell.valign;              -- 单元格中的垂直对齐属性 --
           >

表格可以分为表头和表体部分。THEAD和TFOOT元素是可选的,但是一个或更多的
TBODY元素却是必须的。如果一个表格只包含TBODY部分,那么TBODY的开始和结束
标记可以省略,因为处理程序可以猜到这些元素。如果有一个THEAD元素的话,那么必须
使用THEAD的起始标记,而如果后面紧跟着一个TFOOT或者是TBODY的起始标记的话,
THEAD的结束标记可以被省略。同样的,这也适用于TFOOT标记。

注意,这里的定义也为那些按照旧的模型建立的表格提供了兼容性,如果有THEAD的结束
标记,TFOOT和TBODY也可以被省略。

THEAD,TFOOT以及TBODY元素为表格的显示提供了一种更加方便的控制方法。如果表
格正文有很多行,用户端代理可能会使用一个可以滚动的区域来容纳表体正文。当表格输出
到一个使用分页机制的设备上时,表格必须在页边界的地方断开。THEAD,TFOOT以及
TBODY元素能够让用户端在每一页的末尾都显示表格的脚注,而在页的开头显示表格的标
题,中间则是连续显示表格的正文。

在标记的摆放顺序上,TFOOT标记在TBODY前面,这样浏览齐可以在接受到所有的表格
数据前就开始显示脚注。这在将那些十分长的表格显示在滚动区域时或者是将表格分割成很
多页,进行分页输出的时候特别有用。

每一个THEAD,TFOOT以及TBODY元素都必须包括一个或更多的TR元素。

   ID, CLASS, LANG和DIR
参见前文中其他元素的该属性定义。

   ALIGN, CHAR, CHAROFF和VALIGN
指定表格单元格的水平和垂直对齐属性,参见对齐属性的继承顺序。

4.10 表格的行(TR)元素

   <!ELEMENT tr - O (th|td)+>

   <!ATTLIST tr                       -- 表格的行 --
           %attrs;                    -- id, lang, dir以及class --
           %cell.halign;              -- 单元格的--
                                      -- 水平对齐属性 --
           %cell.valign;              -- 单元格的垂直对齐属性 --
           >

TR或者说表格的行元素可以看作是表格中一行单元格的容器。结束标记可以被省略。

   ID, CLASS, LANG和DIR
参见前文中其他元素的该属性定义。

   ALIGN, CHAR, CHAROFF和VALIGN
指定表格单元格的水平和垂直对齐属性,参见对齐属性的继承顺序。

4.11 表格单元格: TH以及TD

   <!ELEMENT (th|td) - O %body.content>

   <!ATTLIST (th|td)                  -- 标题头或者单元格 --
           %attrs;                    -- id, lang, dir以及class --
           axis    CDATA    #IMPLIED  -- 默认为单元格的内容 --
           axes    CDATA    #IMPLIED  -- axis名字的列表 --
           nowrap (nowrap)  #IMPLIED  -- 禁止文字换行 --
           rowspan NUMBER   1         -- 单元格跨越的行的--
                                      -- 数目 --
           colspan NUMBER   1         -- 单元格跨越的列的 --
                                      -- 数目 --
           %cell.halign;              -- 单元格的水平 --
                                      -- 对齐属性 --
           %cell.valign;              -- 单元格的垂直对齐属性 --
           >

TH元素用来表示表头单元格,而TD元素用来表示表格的数据。这让用户端即使在没有式
样表的情况下,也可以清楚地区分表头和正文的单元格。

单元格可以跨越多行或多列,也可以为空。跨越多行的单元格也计入每一个跨越的行中的列
的总的数目,但只在标记中出现一次(在第一个跨越的行中)。行的数目是由TR元素的数
目所决定的。除此以外,任何由单元格跨行而产生的行将被忽略。

如果一个表格的列的数目比在某一行中的单元格的数目要多(因为包括了跨行的单元格),
缺少的单元格将显示在表格的右边,并作为空单元格看待。如果语言属性指定为从右到左的
显示顺序,那么缺少的单元格就显示在表格的左边。

我们还可以创建带有重叠单元格的表格,如下所示:

       <table border>
       <tr><td rowspan=2>1<td>2<td>3
       <tr><td rowspan=2>4
       <tr><td colspan=2>5<td>6
       </table>

   显示的效果如下:

       /-----------\
       | 1 | 2 | 3 |
       |   |-------|
       |   | 4 |   |
       |---|...|---|
       | 5 :   | 6 |
       \-----------/

在这个例子里,标为4和5的单元格互相重叠了。在这种情况下,如何进行显示将由各用
户端独立处理。

单元格的AXIS和AXES属性使得我们可以为单元格定义简洁的标记。当将表格转化为语音
的时候,这些属性可以用来针对表头为每个相应的单元格提供简短的名字。另一种情况是,
当你将来想处理表格的内容,并将它们导入到数据库的时候。这些属性可以被用来定义为数
据库的字段名。表格的类属性可以让软件来辨认哪些表格可以这样处理。

   ID, CLASS, LANG和DIR
参见前文中其他元素的该属性定义。

   AXIS
该属性为表头单元格定义了一个简短的名字,例如可以在将此表格转化为语音的时候使用。
默认为表格的内容

   AXES
该属性是一个用逗号分割的axis名字的列表,指明了适用于该单元格的行和列标题头的内
容。举例来说,当将表格转化为语音的时候,可以用该属性来确定单元格在表格中的位置。
如果没有该属性,用户端将试图察看其所在的列或同行的左边单元格(对某些语言来说是右
边的单元格)的设置来查找相应的表头单元格。

   NOWRAP, 例如:<TD NOWRAP>
如果使用该属性,将迫使其所在的单元格里的文字不进行自动换行。如果随便使用的话,可
能会导致非常宽的单元格。该属性是为了保留对旧的浏览器的兼容性而设置的。如果使用式
样表的话可以有更好的控制(例如对文字溢出的处理控制)。

   ROWSPAN, 例如:<TD ROWSPAN=2>
该属性用一个正整数来指明该单元格跨越了多少行。默认的ROWSPAN数目是1。特别地,
ROWSPAN=0将使得该单元格从现在所在行开始跨越到表格的最后一行。

   COLSPAN, 例如:<TD COLSPAN=2>
该属性用一个正整数来指明该单元格跨越了多少列。默认的COLSPAN数目是1。特别地,
COLSPAN=0将使得该单元格从现在所在列开始跨越到表格的最后一列。

   ALIGN, CHAR, CHAROFF和VALIGN
指定表格单元格的水平和垂直对齐属性,参见对齐属性的继承顺序。

请注意:我们建议那些应用者对TH和TD的Netscape1.1宽度属性提供支持,虽然这并不
是本方案的内容。我们也建议文档的创建者用COL元素的宽度属性来进行替代。

5.推荐的布局算法

如果TABLE元素中的COLS属性指定了列的数目,那么表格就可以按照一个固定的布局进
行显示,否则,将要使用下面所描述的自动布局算法。

5.1 固定布局算法

对这种算法而言,它假定列的数目是已知的。列的宽度默认地被设置为同样地大小。创建者
可以通过使用COLGROUP或COL元素来指定相对或绝对的列宽以覆盖该数值。表格的默
认宽度是当前左右边界之间的距离,但是也可以被TABLE元素的WIDTH属性的值所改变,
或者由列的绝对宽度的数值所决定。如果列既包含了绝对宽度,也包含了相对宽度,那么第
一步是要将表格的宽度减去用绝对宽度定义的列的总宽,然后剩下的宽度再按照相对宽度定
义的列进行分配。

如果仅仅靠表格语法是不足以保持属性值的一致性的。例如COLS属性所指定的列的数目
可能和用COL元素所指定的列的数目不一致,这也就可能和表格单元格所表示的列的数目
不一致。当列过于狭窄以至于容纳不了单元格的内容的时候,就会发生更多的问题。TABLE
元素或者是COL元素所指定的表格的宽度都可能引起单元格内容的溢出。所以我们推荐用
户端在这些情况下,要尽量能够进行恢复。比如说用连字符来连接单词,或者在连接点未知
的情况下,试着分隔单词。

如果碰到了一个不可分割的元素,而且该元素将引起单元格内容的溢出的话,用户端可能需
要考虑调整列宽,并且重新显示表格。在最坏的情况下,如果调整列宽或者是让单元格的内
容变成可滚动的都不合适的话,可能需要考虑截去一部分的内容。在任何情况下,如果单元
格的内容被分割开或者是被截断了,都应该用一种适当的方法向用户指明这一点。

5.2 自动布局算法

如果在表格开始的标记里面缺少COLS属性,那么用户端就应该采用自动布局算法。它线
性地根据表格的大小,使用两种方法来处理表格的数据和范围。

在第一种情况下,自动折行被禁止,用户端保留对每个单元格最小和最大的宽度的记录。最
大的宽度由最宽的行所决定。因为禁止折行,所以段落都排在一个长的整行中,除非用<br>
元素来折行。最小的宽度由最宽的单词或者是图片或者是类似的东西所决定,当然还要考虑
到行首的缩进以及列表符号等等。换句话说,如果你想要将单元格的内容在其自己的窗口位
置格式化输出的话,应该先确定你所使用的最小宽度不会导致单元格内容溢出。如果允许用
户端可以分隔单词将减少水平滚动的产生,或者避免更糟的情况—单元格内容的截断。

这个处理过程也适用于那些单元格内容中的任何嵌套表格。在嵌套表格中单元格的最小和最
大宽度被确定为这些表格的最小和最大宽度,同时也是容纳这些表格的单元格的宽度。这个
算法针对所有的单元格内容来说都是线性的,而且从更广义的角度来看,是和嵌套的深度无
关的。

为了应付单元格内字符的对齐,该算法还要考虑每个列中的三种情况:左对齐字符,右对齐
字符以及未指明对齐者。所以一个列的最小宽度是max(最小的左对齐的 + 最小的右对齐
的, 最小的未指明对齐的)

单元格的最小和最大宽度被用来确定列的相应的最小和最大宽度。而这些宽度又被用来确定
表格的最小和最大宽度。请注意单元格可以包含嵌套表格,但这并不会使得代码变得过分复
杂。接下来的一步就是根据所有的空间来为每个列分配空间(也就是在左右边界之间的空
间)。

对于那些跨越多列的单元格来说,一个简单的被Arena所使用的方法就是给每个所涉及的
列均匀地分配最小/最大宽度。一个稍微复杂一点的方法是利用那些没有跨越列的单元格的
最小/最大宽度来计算如何分配跨越的宽度。实践显示这两种方法的结合将能够满足大多数
表格的要求。

在分配列的宽度的时候,表格的边框以及内部单元格四周的边距也应该一并考虑进去。这有
三种情况:

1. 表格的最小宽度等于或者大于实际的空间宽度。在这种情况下,按照最小的宽度来分配
空间,并且让用户进行水平滚动。如果要转化为盲文的话,则有必要将这些单元格替换为包
含全部内容的参考符号,按常规放置在表格的前面。

2. 表格的最大宽度正好和实际的空间宽度吻合。在这种情况下,按照列的最大宽度分配空
间。

3. 表格的最大宽度大于实际的空间宽度,但是最小宽度小于这个宽度。在这种情况下,我
们把实际的宽度和最小的表格宽度的差值记作W,把表格的最大宽度和最小宽度的差值记
作D。对每个列来说,我们把该列的最大宽度和最小宽度的差值记作d。现在将列的宽度设
定为最小的宽度加上d?W/D。这就可以使那些最大宽度和最小宽度相差很大的列比那些相
差比较小的列要宽。

对于所有在第一种情况中如此得到最小和最大宽度的嵌套表格来说,这一步被重复地执行。
在这种情况下,父表格(也就是说包含嵌套表格的表格)的单元格的宽度扮演着上述步骤中
当前窗口的大小。这个处理过程对所有的嵌套表格都作递归处理。然后,最顶级的表格按照
所分配的宽度进行显示。嵌套的表格则作为父表格单元格中的内容依次进行显示。

如果表格的宽度已经由WIDTH属性进行了指定,那么用户端将尽量让列的宽度能和表格的
宽度相匹配。但是如果这个WIDTH属性将会导致列的实际宽度小于它们所需要的最小宽度
(也就是说最低限度)的话,表格将不会局限于该属性的值。

如果用COL元素指定了相对宽度,那么该算法将做出一些修改,将在最小的列宽度的基础
上作一些增加以便能满足相对宽度的限制。COL元素也应该仅仅是作为一个参考,这样列
就不会被设定为小于它们的最小宽度了。同样地,列也不应该被设定得过宽而使得表格被撑
开得远远大于窗口的宽度。如果某个COL元素指定了一个值为0的相对宽度,那么列就应
该总是按照其最小的宽度来设置。

6.HTML表格DTD

DTD也就是文档类型定义(document type definition)为HTML表格的语法提供了正式的
定义。

<!—内容模型的实体从父DTD中导入:

  %body.content; 允许表格单元格包含标题,段落,列表,表单元素甚至随意嵌套表格。

  %text; 是文字字符,包括字符实体和字符强调元素,IMG和锚点
-->

<!ENTITY % attrs
       "id      ID       #IMPLIED  -- 元素标示符 --
        class   NAMES    #IMPLIED  -- 标志子类元素 --
        lang    NAME     #IMPLIED  -- 根据RFC 1766 --
        dir   (ltr|rtl)  #IMPLIED  -- I18N文字方向 --">

<!--
BORDER属性设置了表格四周框线的宽度,默认的单位为屏幕像素(screen pixels)。

FRAME属性设定了表格四周哪一部分框线应该被显示。该属性的值和CALS中的不同,以
避免和VALIGN属性的值发生冲突。

值"border"也被包含在内以便保留和<TABLE BORDER>的向后兼容性,可以视作
frame=border和border=implied。对于<TABLE BORDER=1>,将认为是border=1以及
frame=implied。在这种情况下,应该将其认为是frame=border以便能和那些旧的浏览器保
持向后兼容性。
-->

<!ENTITY % Frame "(void|above|below|hsides|lhs|rhs|vsides|box|border)">

<!--
RULES属性定义了单元格间的那些线条应该被显示:

如果没有RULES属性,那么就假定为
     "none", 如果没有BORDER或者是BORDER=0,则为"all"
-->

<!ENTITY % Rules "(none | groups | rows | cols | all)">

<!—表格相对于窗口的水平放置位置-->
<!ENTITY % Where "(left|center|right)">

<!—单元格内容的水平对齐属性-->
<!ENTITY % cell.halign
        "align  (left|center|right|justify|char) #IMPLIED
         char    CDATA   #IMPLIED – 对齐字符, 例如char=':' --
         charoff CDATA   #IMPLIED – 对齐字符的缩进距离--"
        >

<!--单元格内容的垂直对齐属性-->
<!ENTITY % cell.valign
        "valign  (top|middle|bottom|baseline)  #IMPLIED"
        >

<!ELEMENT table - - (caption?, (col*|colgroup*), thead?, tfoot?, t
                    body+)>
<!ELEMENT caption - - (%text;)+>
<!ELEMENT thead - O (tr+)>
<!ELEMENT tfoot - O (tr+)>
<!ELEMENT tbody O O (tr+)>
<!ELEMENT colgroup - O (col*)>
<!ELEMENT col - O EMPTY>
<!ELEMENT tr - O (th|td)+>
<!ELEMENT (th|td) - O %body.content>

<!ATTLIST table                    -- 表格标记 --
        %attrs;                    -- id, lang, dir和class --
        align   %Where;  #IMPLIED  -- 表格相对于窗口的--
                                   -- 位置 --
        width   CDATA    #IMPLIED  -- 表格相对于窗口的宽度 --
        cols    NUMBER   #IMPLIED  -- 用在即时显示模式--
        border  CDATA    #IMPLIED  -- 控制表格四周的--
                                   -- 框线 --
        frame   %Frame;  #IMPLIED  -- 要包含表格框线的--
                                   -- 哪一部分 --
        rules   %Rules;  #IMPLIED  -- 在行和列之间的线条--
        cellspacing CDATA #IMPLIED –  单元格之间的距离--
        cellpadding CDATA #IMPLIED –  单元格内部四周的边距 --

        >

<!—ALIGN用来保留对那些旧的浏览器的兼容性-->
<!ENTITY % Caption "(top|bottom|left|right)">

<!ATTLIST caption                  -- 表格标题 --
        %attrs;                    -- id, lang, dir和class --
        align  %Caption; #IMPLIED  -- 相对于表格 --
        >

<!--
COLGROUP将一系列COL元素组合起来。它让你可以将若干列组合在一起。
-->
<!ATTLIST colgroup
        %attrs;                    -- id, lang, dir和class --
        span    NUMBER   1         -- 组里面默认的--
                                   -- 列的数目--
        width   CDATA    #IMPLIED  -- 组中的列的默认宽度--
        %cell.halign;              -- 单元格的水平对齐设置--
        %cell.valign;              -- 单元格的垂直对齐设置--
        >

<!--
COL元素定义了在某个给定的列或者跨越的列中的单元格的对齐属性。WIDTH属性指定了
该列的宽度。例如:

     width=64        用屏幕像素表示的宽度。
     width=0.5*      0.5的相对宽度
-->

<!ATTLIST col                      -- 列的组以及它们的属性--
        %attrs;                    -- id, lang, dir和class --
        span    NUMBER   1         -- 跨组的列的--
                                   -- 数目 --
        width   CDATA    #IMPLIED  -- 列的宽度--
        %cell.halign;              -- 单元格的水平对齐设置--
        %cell.valign;              -- 单元格的垂直对齐设置--
        >

<!--
当表格跨页分布的时候,可以通过使用THEAD来重复表头。或者当表体部分显示在可滚动
的面板中的时候,用THEAD来作为静态的标题。

当表格跨页分布的时候,可以通过使用TFOOT来重复注脚。或者当表体部分显示在可滚动
的面板中的时候,用THEAD来作为静态的注脚。

可以通过使用多个TBODY来在表格不同的行构成的组之间显示标线。
-->
<!ATTLIST (thead|tbody|tfoot)      -- 表格部分--
        %attrs;                    -- id, lang, dir和class --
        %cell.halign;              -- 单元格的水平对齐设置 --
        %cell.valign;              -- 单元格的垂直对齐设置 --
        >

<!ATTLIST tr                       -- 表格的行--
        %attrs;                    -- id, lang, dir和class --
        %cell.halign;              -- 单元格的水平对齐设置 --
        %cell.valign;              -- 单元格的垂直对齐设置 --
        >

<!ATTLIST (th|td)                  -- 标题头或者是数据单元格--
        %attrs;                    -- id, lang, dir和class --
        axis    CDATA    #IMPLIED  -- 默认为单元格内容--
        axes    CDATA    #IMPLIED  -- axis名字列表 --
        nowrap (nowrap)  #IMPLIED  -- 禁止单词换行--
        rowspan NUMBER   1         -- 单元格跨越的行的数目--
        colspan NUMBER   1         -- 单元格跨越的列的数目--
        %cell.halign;              -- 单元格的水平对齐设置 --
        %cell.valign;              -- 单元格的垂直对齐设置 --
        >

7.参考文章

   Arena
       W3C的HTML3浏览器, 参见http://www.w3.org/pub/WWW/Arena/.
       Arena原本是用来作为HTML3前的HTML+方案的概念演示而创作的。该浏览器现
在正被重新改写以便能在为HTML3提供应用的同时,也支持式样表以及客户端的script编
程。

   CALS
       连续的获取以及生命周期的支持(Continuous Acquisition and Life-Cycle 
Support),(以前被称为计算机辅助获取以及后备支持(Computer-aided Acquisition and 
Logistics Support)),即CALS,是美国国防部为了武器装备系统上数据的高效存取,创
建,交换的策略而设计的,更多的详细信息可以在美国海军的CALS页面上获得:
http://navysgml.dt.navy.mil/cals.html

   HTML 2.0 (RFC1866)
       超文本标记语言方案2.0版,由T.Berners-Lee和D. Connolly于1995年11月提
出,详细信息可以在http://www.w3.org/pub/WWW/MarkUp/ 或者
ftp://ds.internic.net/rfc/rfc1866.txt查阅。

   HTML 3.0
       超文本标记语言方案3.0版。最初的草案在1995年3月发布。对其的精简完善工
作仍在进行中,新的表格草案也是其中的一部分,W3C在HTML方面的相关工作可以在
http://www.w3.org/pub/WWW/MarkUp/找到。

   RFC 1766
       "Tags for the Identification of Languages", 由H. Alvestrand,
       UNINETT于1995年3月发布。该文档可在下述地址下载:
       ftp://ds.internic.net/rfc/rfc1766.txt.

8.安全性考虑

   在本备忘录中没有讨论安全性方面的问题。

9.作者地址

   Dave Raggett W3C

   EMail: dsr@w3.org

   The World Wide Web Consortium: http://www.w3.org/

RFC 1942 HTML Tables HTML中的表格
RFC文档中文翻译计划 2