如何使用XML编写底层网页
投笔从戎 @ 战争研究


1. 前言
2. 所需的软件工具
2.1 文本编辑工具
2.2 浏览器
3. 核心知识
3.1 XML简介
3.2 用XML编写的网页如何工作
3.3 为什么要使用XML
3.4 目前存在的问题
3.4.1 没有DTD
3.4.2 不完善的XSL
3.4.3 没有方便的编辑器
4. 开始编写XML文档
4.1 创建新的XML文档
4.2 文档中的XML指令
4.2.1 指定XML版本
4.2.2 指定汉字编码
4.2.3 指定样式单
5. 自定义的XML应用
5.1 文档组成
5.2 标题
5.3 正文
5.4 引用文章
5.4.1 抬头、落款、题头
5.4.2 额外附注
5.5 图片
5.5.1 特殊字符
5.6 清单和表格
5.6.1 清单
5.6.2 表格
5.7 注解
5.7.1 加重文字
5.8 相关链接
5.9 元信息
5.9.1 作者
5.9.2 出处
5.9.3 翻译、扫描、OCR、输入和校对
6. 小结
7. 测试和修改
1. 前言
    本文是为"战争研究"网站的制作者和合作者们编写的,简要说明如何使用XML技术制作网页,主要针对网站的底层页面,也就是资料文章所在的网页。
    我假定读者使用简体中文版的 Microsoft Windows 操作系统,如果你在制作网页方面有一定经验,阅读本文时会比较轻松。
    尽管本文很短,为了叙述完整,仍然提到了一部分制作网页时不一定要知道的知识,我用蓝色的小号字体把这些段落标出来,如果你时间不多或对技术细节不感兴趣,阅读时完全可以跳过这些段落。
2. 所需的软件工具
2.1 编辑工具
    XML网页是一个以".xml"为文件名后缀的文本文件,因此你首先需要一个文本编辑工具,理论上,任何可以将文件存成普通文本格式的文字处理软件都可以,但是最好不要使用 Word 等办公用软件,以免带来不必要的麻烦。Windows 系统附带的"记事本"就很好。另一个 Windows 的附件"写字板"是功能十分强大的文本编辑器,但是有一点要注意:在保存文件时要存为"文本文档"而不是任何其他选项!这两种基本的文本编辑器已经提供了所有必要的功能,但如果你需要经常编写网页,建议安装一个功能更完善的文本编辑器,比如 Edit Plus 2 ,可以在"软件工具下载"中找到它。
    很多人已经习惯了使用方便的所见即所得工具来制作普通的HTML网页,遗憾的是制作XML网页没有类似的工具,正如你马上就要读到的,XML的很大一部分是使用者自定义的,通用的编辑器不太可能是所见即所得的,也许以后我们会编写专供自己使用的编辑工具,但目前还只能使用普通的文本编辑器。
2.2 浏览器
    访问者浏览和制作者测试XML所制作的网页需要 Microsoft Internet Explorer 5.0 或更高版本,实际上只有极少的人还在使用 IE 4 或更低的版本,如果你是其中之一,安装一个较高版本的 IE 就行了,反正是免费的。
    对于使用 Netscape Navigator 或其他种类浏览器的的用户,我们不准备提供支持。第一,他们太少了;第二,尽管有消息说新版本的 Navigator 部分支持XML,但目前缺乏与 IE 之间详细的对比;第三,每一个网页制作者都厌倦了编写在多种标准不一的浏览器上都能正常显示的网页。
    [2009-05-29]经改版,目前我们的XML网页在所有已知的常用浏览器上都能够正常浏览,包括IE 6以上版本、Opera 9以上版本、Firefox 2以上版本、Google Chrome 2、Safari 4,以及所有使用前述浏览器内核的派生浏览器。
    对于打算根据本文制作XML网页的人来说,可根据所使用的操作系统选择兼容浏览器作为调试工具。如在Windows系统上工作,则仍推荐使用IE。
3. 核心知识
3.1 XML简介
    简单的说,XML允许使用者自定义一套标记语言,称为一个XML应用。
    用尖括号"<"和">"括起来的文字是"标记",像这样:<BODY>。
    XML中每个标记都有配对的结束标记,就是在原来的标记开头加"/",像这样:</BODY>。
    在一个标记和它的结束标记之间,可能会有一段文本,可能会有其他标记,可能两者都有,也可能是空的。
    标记中可以加属性,属性由属性名、等号和用引号括起来的值组成,像这样:<BODY BGCOLOR="#FFFFFF">,BGCOLOR是属性名,#FFFFFF是它的值。
    XML文件由这些标记、结束标记、标记之间的文本、标记中的属性和用"<? ?>"标出的指令组成的。
    编写XML时有几点需要注意:
  • XML是区分大小写的,<BODY>和<body>被认为是不同的标记,为了避免可能出现的错误,我们约定所有的标记和属性都使用小写。
  • 所有的标记都是和它的结束标记一起成对出现的,单个的标记或结束标记被认为是错误。
  • 标记可以嵌套,但不能重叠,<body><p></p></body>是合法的,<body><p></body></p>是非法的。
  • 属性的值必须用引号括起来,BGCOLOR="#FFFFFF"是合法的,BGCOLOR=#FFFFFF是非法的。
  • 5个特殊字符需要特殊处理:& < > " ' 如果不作为标记或属性的一部分而出现在普通文本中,需要分别转换成 &amp; &lt; &gt; &quot; &apos; 其中的分号是必须的,而且不能使用中文的全角分号。
  • 一个标记和它的结束标记之间可以有文本或其他标记,也可以什么都没有,后一种情况可以简写成这样:<p bgcolor="#cccccc" />,和<p bgcolor="#cccccc"></p>是等价的。
  • 在同一个标记中不允许出现一个以上的同名属性。
  •     当然XML还包括其他一些内容,它的功能远为强大,在众多的应用软件中得到广泛应用,但是我们只准备使用它的一小部分,用于编写网页这样的单一任务,那么以上的说明应该是足够了。
    3.2 用XML编写的网页如何工作
        一般来说,因为XML文件中使用的标记和属性以及它们的含义是自定义的,浏览器并不知道如何显示。需要被称为"样式单"的文件才能使XML文件按你预想的样子显示出来。有两种样式单:CSS和XSL。
        CSS样式单就是HTML中使用的那种样式单,在XML中也能工作。
        XSL样式单本身也是一个XML应用,也就是说,要按照XSL定义的标记编写一个XML文件。XSL的一部分功能是把一个XML文件转换成另外一个,在转换的过程中可以随你的意思添加删除和修改。我们主要使用的就是这部分功能。正如你已经注意到的,如果小心的编写,HTML网页也可以写成一个XML文件。于是我们可以利用XSL把我们自己定义的XML文件转换成浏览器可以识别和显示的HTML网页。下一节中可以看到,我们将从这一简单的过程中获得相当大的收益。
    3.3 为什么要使用XML
        用HTML写出的网页把内容和显示格式混在一起,在HTML中包含一段文字的时候,同时指定了这段文字显示时的字体、颜色、在页面上的位置,这些信息实际上是与这段文字的内容不相关的。多数网页中都包括的站点图标、导航链接、版权说明等信息也是与网页内容不相关的,而且在同一个网站中这些内容一般是相同的,在制作HTML网页时却要一一加入其中。
        显而易见,内容和显示格式混排给网站的维护和扩展带来了不便,当网站的制作者希望改变所有页面显示风格或在每一个页面都增加导航链接时,需要修改每一个页面,如果是较有规模的网站,不得不投入很大的人工去完成非创造性的重复劳动。
        现在,在XSL的帮助下,我们可以做到使网页的内容和显示格式完全分离,资料的内容按照自定义的XML应用写成XML文件,显示格式的表达,包括字体颜色和导航链接等等,都写在一个所有内容网页都公用的XSL样式单里。这样,仅仅修改一个XSL文件就可以改变所有的页面显示时的样子。如果要修改内容也不用在杂乱的HTML代码里四处寻找。
        此外,使用XML+XSL还使我们得到一些不能忽视的额外好处。在我们的应用中,XSL把XML转换成HTML这一过程是在浏览器端完成的,也就是说访问者的电脑负责下载XML和XSL文件,并解释和执行它们。与其他方案对比有明显的优势:DreamWeaver 等网页制作工具提供的"模板"功能,在制作者的电脑上生成最终的HTML页面,然后上传到服务器上,如果改变模板,所有使用该模板的网页都要重新生成重新上传;"服务器端包含"(SSI)和"服务器端嵌入程序"(CGI、PHP、ASP、JSP)等技术都需要依赖于服务器,不同的服务器开启的服务不同,一旦网站需要迁址,就会受到制约。使用XML+XSL就完全避免了这些问题,修改样式单后只要上传一个XSL文件,对服务器也没有特殊要求,任何操作系统上的任意一种WEB SERVER都可以使用。
        XML的另一个特性是从不忽略或试图校正错误,因此任何错误和疏忽都会在制作阶段被报告出来,而不会悄悄积累下来。
    3.4 目前存在的问题
    3.4.1 没有DTD
        严格的说,仅仅符合3.2小节规定的XML文件只是"结构完整"的,而不是"合法"的。XML还有一个重要的组成部分是DTD("文档类型定义"),DTD可以看成是一本词典或语法书,其中详细指出使用者定义的XML应用中有哪些标记和属性,以及允许它们出现的位置等等。浏览器应该用DTD来检验XML文档,如果出现了多余的标记或缺少必要的标记或某些标记写错了位置,浏览器会报告错误。通过了DTD检验的XML文档被称为"合法"的,可以正常显示。DTD很重要,也很有用,遗憾的是目前 IE 对DTD的支持还不够好,因此我们暂时不使用DTD。也许更新版的浏览器普及以后我们会加入DTD,即使到那时,已经写好的XML网页也不用重写。
    3.4.2 不完善的XSL
        需要说明的是,目前还在广泛使用的 IE 5 在发布的时候,W3C还没有发布XSL的正式版本,因此 IE 5 仅仅部分的支持XSL工作草案,所幸我们所要使用的部分已经包括在内了。等更新版的浏览器普及以后,我们无疑会改写目前使用的草案版XSL样式单,但是只需修改一个XSL文件,已经写好的XML网页不用重写。[2009-05-29]已根据W3C发布的正式版标准重写了XSL文件,以前写好的XML网页不需任何修改。
    3.4.3 没有方便的编辑器
        缺乏方便的所见即所得编辑器,在开始的时候可能会使用惯 DreamWeaver 和 FrontPage 的网页制作者感到不习惯,但你很快就会发现由于不再处理页面显示方面的问题,XML变得如此简单,再也不用在上百菜单项和按钮中寻找你所需的那一个。对于初学者,也不用面对所见即所得编辑器众多的浮动工具条感到无从着手。
        另一方面,使用文本编辑器有助于制作者写出整洁易读的代码,对以后的网页维护和修改颇有好处。
        如果有必要,我们会考虑开发"战争研究"专用的XML网页编辑器,但目前只能满足于使用普通的文本编辑器。
    4. 开始编写XML文档
    4.1 创建新的XML文档
        读过前面几章,对XML有了基本的概念以后,可以开始编写我们自己的XML文档了。第一步是使用你选择的文本编辑器创建一个空白的普通文本文件,然后把文件的名字改成".xml"结尾的。为了避免可能出现的错误,我们约定所有的文件名都由小写字母、下划线和数字组成,文件名中不要出现空格、标点符号或中文。
    4.2 文档中的XML指令
        我们的XML网页是以两行XML指令开始的:
    <?xml version="1.0" encoding="GB2312" ?>
    <?xml-stylesheet type="text/xsl" href="/xsl/article.xsl" ?>
        如果你对技术细节不感兴趣,完全可以简单的把这两行代码复制/粘贴到你的XML文件最前面,而跳过这一章的其余几小节。需要注意的是第一行代码的前面不要有任何东西,包括回车和空白。
    4.2.1 指定XML版本
        第一行指令中的 version="1.0" 表示我们的XML文件遵守W3C发布的XML1.0版规范。
    4.2.2 指定汉字编码
        encoding="GB2312" 表示我们的XML文件使用的字符集是GB2312。实际上XML默认的字符集是更国际化的Unicode,但是在简体中文平台上大多数文件和程序使用GB2312字符集,我们的XML文件也使用这个字符集可以免除转换码制的工作。当然你也可以使用Unicode、BIG5或是任何你想用的字符集编写XML文件,只要encoding属性的值和你所用的字符集相同就可以正常工作,但是同一个网站的网页使用不同的字符集显然不是好现象,而且会影响检索功能的实现。
    4.2.3 指定样式单
        第二行代码指定显示这个XML网页时使用的样式单,type="text/xsl"表示使用的是XSL样式单,如果使用CSS样式单则是type="text/css"。href="/xsl/article.xsl"指出该样式单的路径,对于上传到服务器的XML网页,这表示"http://www.warstudy.com/xsl/article.xsl",如果你想在自己的电脑上测试XML网页,需要从上述地址下载这个XSL样式单,保存在你存放XML文件的同一磁盘的根目录下的xsl子目录。另一个办法是安装一个 WEB SERVER 软件,IIS 或 PWS 都可以,然后把这个XSL样式单保存在 WEB SERVER 的主目录下的xsl子目录。
    5. 自定义的XML应用
    5.1 文档组成
        我们的XML网页除了开头两行以外的其余部分就全部由自定义的标记、属性和普通的文本构成。
        定义这些标记时首先考虑的是简单和便于记忆,其中有几个也出现在HTML中,但我们已经给它们赋予了新的语义,在编写XML文档时不需要理会它们在HTML中的含义。
        下文所提及的所有标记和属性,除非特别说明,都是可选项,也就是说如果资料中有相关的信息,就按定义的格式加入与这方面有关的标记或属性,如果资料中缺乏某些信息,则忽略相关的标记和属性。
        按照XML的规定,我们首先定义一个包含所有其他东西的根元素<article></article>。
        article标记在每个XML网页中必须存在,而且只有一个,除了开头两行的XML指令以外的所有标记和文本都要被包括在<article>和</article>之间。
        article标记没有属性。
    5.2 标题
        我们定义<title depth="n"></title>标记来表示文章的标题和文章中分层段落的标题。
        title标记有一个depth属性,这个属性是必须存在的,它的值n是一个非负整数,表示该标题的层次深度。
        depth="0"表示这是整篇文章的标题,带有depth="0"属性的title标记在每个XML网页中必须存在,而且只有一个。
        depth属性的值不为0的title标记可以没有或有多个。
        所有title标记都直接被包含在article标记中,除article标记以外的任何标记都不应直接包含title标记。
    5.3 正文
        我们定义<text></text>标记来表示文章的正文。
        text标记没有属性。
        在一个XML网页中text标记可以没有或有多个。
        所有text标记都直接被包含在article标记中,除article标记以外的任何标记都不应直接包含text标记。
    5.4 引用文章
        我们定义<quote from="???"></quote>标记来表示文章中的引文。
        quote标记有一个from属性,from属性的值是一个字符串,表示引文的出处。from属性不是必须存在的。
        在一个XML网页中quote标记可以没有或有多个。
        所有quote标记都直接被包含在article标记中,除article标记以外的任何标记都不应直接包含quote标记。
    5.4.1 抬头、落款、题头
        [2004-09-26]增加定义<header></header>和<footer></footer>标记来分别表示文章中信件的抬头和落款。
        像quote标记一样,在一个XML网页中header和footer标记可以没有或有多个;所有header和footer标记都直接被包含在article标记中,除article标记以外的任何标记都不应直接包含header和footer标记;可以被quote标记包含的其他标记也同样可以被header和footer标记包含。
        [2004-10-14]增加定义<headline></headline>标记来表示文章中信件、电文或新闻的标题。headline标记跟header或footer标记使用的方法完全一样。
    5.4.2 额外附注
        [2009-07-19]增加定义<remark></remark>标记,表示文章正文或引文中大段的额外附注。
        remark标记只能被包含在text或quote标记中,一个text或quote标记中可以包含0个或多个remark标记。类似text和quote标记,remark标记内可以嵌入note、strong、link、img、pi标记以及普通文本。remark标记没有属性。
    5.5 图片
        我们定义<img src="???" icon="???" desc="???"></img>标记来表示附在文章中的图片。
        在一个XML网页中img标记可以没有或有任意多个。
        img标记和它的结束标记之间不应包含任何文本和标记,因此img标记总是可以被简写成这样:<img src="???" icon="???" desc="???" />
        所有img标记都直接被包含在article或text标记中,除article和text标记以外的任何标记都不应直接包含img标记。
        img标记有一个src属性,src属性的值是一个指向一个图片文件的Url,表示该图片的网址。src属性是必须存在的。
        img标记有一个icon属性,icon属性的值是一个指向一个图片文件的Url,表示该图片的缩略图的网址。icon属性不是必须存在的,如果某张图片没有缩略图,可以不加入icon属性。
        img标记有一个desc属性,desc属性的值是一个字符串,表示该图片的简短说明。desc属性不是必须存在的。
    5.5.1 特殊字符
        对于一些文章中出现的不易输入的字符,比如阿拉伯文等不熟悉的外语、平方根等数学符号、象形文字,解决的办法是制作成小图片嵌入上下文中。为此我们定义一个<pi src="???"></pi>标记来表示这种用来显示特殊字符的小图片。
        在一个XML网页中pi标记可以没有或有多个。
        pi标记和它的结束标记之间不应包含任何文本和标记,因此pi标记总是可以被简写成这样:<pi src="???" />
        所有pi标记都直接被包含在text或quote标记中,除text和quote标记以外的任何标记都不应直接包含pi标记。
        pi标记有一个src属性,src属性的值是一个指向一个图片文件的Url,表示该图片的网址。src属性是必须存在的。
        需要注意的是,为了不影响页面的显示,小图片的高度尽量控制在20个像素以内,也就是一行文本的高度。
    5.6 清单和表格
    5.6.1 清单
        清单是指多行单列的无序列表。
        我们定义<list></list>标记来表示附在文章中的清单。
        list标记没有属性。
        在一个XML网页中list标记可以没有或有多个。
        所有list标记都直接被包含在article标记中,除article标记以外的任何标记都不应直接包含list标记。
        我们定义<lh></lh>标记来表示清单的表头。
        lh标记没有属性。
        所有lh标记都直接被包含在list标记中,除list标记以外的任何标记都不应直接包含lh标记。
        在一个list标记中可以包含零个或多个lh标记。
        我们定义<li></li>标记来表示清单中的一行。
        li标记没有属性。
        所有li标记都直接被包含在list标记中,除list标记以外的任何标记都不应直接包含li标记。
        在一个list标记中可以包含零个或多个li标记。
        list标记只能直接包含lh标记和li标记,而不能直接包含其他标记或普通文本。
        在一个list标记中至少要包含一个lh标记或一个li标记。
    5.6.2 表格
        表格是指多行多列的表。
        我们定义<table></table>标记来表示附在文章中的清单。
        table标记没有属性。
        在一个XML网页中table标记可以没有或有多个。
        所有table标记都直接被包含在article标记中,除article标记以外的任何标记都不应直接包含table标记。
        我们定义<tr></tr>标记来表示表格的一行。
        tr标记没有属性。
        所有tr标记都直接被包含在table标记中,除table标记以外的任何标记都不应直接包含tr标记。
        在一个table标记中可以包含一个或多个tr标记。
        我们定义<th></th>标记来表示表格的表头中的一个单元格。
        th标记有两个属性表示单元格跨度:rowspan和colspan。rowspan属性的值是一个正整数,表示单元格所占的行数;colspan属性的值是一个正整数,表示单元格所占的列数。rowspan属性和colspan属性都不是必须存在的。缺省的情况下,这两个属性的值都是1,表示该单元格是在表格中占一行一列的普通单元格。
        所有th标记都直接被包含在tr标记中,除tr标记以外的任何标记都不应直接包含th标记。
        在th标记中可以包含文本和note标记。
        在一个tr标记中可以包含零个或多个th标记。
        我们定义<td></td>标记来表示表格中的一个单元格。
        td标记有两个属性表示单元格跨度:rowspan和colspan。rowspan属性的值是一个正整数,表示单元格所占的行数;colspan属性的值是一个正整数,表示单元格所占的列数。rowspan属性和colspan属性都不是必须存在的。缺省的情况下,这两个属性的值都是1,表示该单元格是在表格中占一行一列的普通单元格。
        所有td标记都直接被包含在tr标记中,除tr标记以外的任何标记都不应直接包含td标记。
        在td标记中可以包含文本、note标记和img标记。
        在一个tr标记中可以包含零个或多个td标记。
        table标记只能直接包含tr标记,而不能直接包含其他标记或普通文本。
        tr标记只能直接包含td标记和th标记,而不能包含其他标记或普通文本。
        在一个table标记中至少要包含一个tr标记。
        在一个tr标记中至少要包含一个th标记或一个td标记。
    5.7 注解
        我们定义<note by="???"></note>标记来表示文章中的注解。
        note标记有一个by属性,by属性的值是一个字符串,表示添加该注解的人。by属性不是必须存在的。
        在一个XML网页中note标记可以没有或有多个。
        所有note标记都直接被包含在title、text、quote、lh、li、th、td标记中,除title、text、quote、lh、li、th、td标记以外的任何标记都不应直接包含note标记。
    5.7.1 加重文字
        [2004-07-11]我们定义<strong></strong>标记来表示句子中的特别加重部分。
        strong标记没有属性。在一个XML网页中strong标记可以没有或有多个。
        所有strong标记都直接被包含在text、quote、li、td标记中,除text、quote、li、td标记以外的任何标记都不应直接包含strong标记。
    5.8 相关链接
        我们定义<link href="???" type="???"></link>标记来表示与文章的相关链接。
        link标记有一个href属性,href属性的值是一个Url,表示该链接的目的地址。href属性是必须存在的。
        link标记有一个type属性,type属性表示该链接的类型,type属的值必须是如下值中的一个:reference、download、next、back、parent、child。type属性是必须存在的。
        type="reference"表示该链接的目的地址是与当前文章有关联的参考资料。
        type="download"表示该链接的目的地址是一个下载文件。
        type="next"表示该链接的目的地址是当前文章的下一页。
        type="back"表示该链接的目的地址是当前文章的上一页。
        type="parent"表示该链接的目的地址是当前文章的上级目录页。
        type="child"表示该链接的目的地址是当前文章的下级页面。type="child"是为目录网页准备的,不应出现在底层网页中。
        在link标记和它的结束标记之间不应包含任何标记,但可以包含普通文本,表示该链接的相关说明。不需要在相关说明中加入"参考资料"、"下载"、"上一页"、"下一页"、"回目录"等字样,XSL样式单将会根据type属性的值自动加上相应的文字或图片。链接的相关说明不是必须存在的。
        在一个XML网页中link标记可以没有或有多个。
        所有link标记都直接被包含在article标记中,除article标记以外的任何标记都不应直接包含link标记。
        [2004-05-09] link标记增加一种格式:type="basic",表示没有特殊定义的普通链接。<link href="???" type="basic">???</link>可以被包含在text、quote、lh、li、th、td标记中,或直接被包含在article标记中。
    5.9 元信息
        我们定义<meta></meta>标记来表示文章的元信息。
        meta标记没有属性。
        在一个XML网页中meta标记可以没有或只有一个。
        meta标记必须直接被包含在article标记中,除article标记以外的任何标记都不应包含meta标记,meta标记出现的位置无关紧要,但我们建议把meta标记紧跟在article标记后面,也就是文档中较靠前的位置。
        meta标记只能直接包含下面定义的author标记、in标记、scan标记、ocr标记、input标记、correct标记,而不能直接包含其他标记或普通文本。
    5.9.1 作者
        我们定义<author country="???"></author>标记来表示文章的作者。
        author标记有一个country属性,country属性的值是一个字符串,表示作者的国籍。country属性不是必须存在的。
        在一个meta标记中author标记可以没有或有多个。
        所有author标记都直接被包含在meta标记中,除meta标记以外的任何标记都不应直接包含author标记。
    5.9.2 出处
        我们定义<in time="???"></in>标记来表示文章的出自哪部著作。
        in标记有一个time属性,time属性的值是一个字符串,表示该著作的成书时间。time属性不是必须存在的。
        在一个meta标记中in标记可以没有或有多个。
        所有in标记都直接被包含在meta标记中,除meta标记以外的任何标记都不应直接包含in标记。
    5.9.3 翻译、扫描、OCR、输入和校对
        我们定义<trans time="???"></trans>标记来表示翻译文章的人。
        trans标记有一个time属性,time属性的值是一个字符串,表示翻译文章的时间。time属性不是必须存在的。
        在一个meta标记中trans标记可以没有或有多个。
        所有trans标记都直接被包含在meta标记中,除meta标记以外的任何标记都不应直接包含trans标记。
        我们定义<scan time="???"></scan>标记来表示扫描文章的人。
        scan标记有一个time属性,time属性的值是一个字符串,表示扫描文章的时间。time属性不是必须存在的。
        在一个meta标记中scan标记可以没有或有多个。
        所有scan标记都直接被包含在meta标记中,除meta标记以外的任何标记都不应直接包含scan标记。
        我们定义<ocr time="???"></ocr>标记来表示OCR文章的人。
        ocr标记有一个time属性,time属性的值是一个字符串,表示OCR文章的时间。time属性不是必须存在的。
        在一个meta标记中ocr标记可以没有或有多个。
        所有ocr标记都直接被包含在meta标记中,除meta标记以外的任何标记都不应直接包含ocr标记。
        我们定义<input time="???"></input>标记来表示手工录入文章的人。
        input标记有一个time属性,time属性的值是一个字符串,表示手工录入的时间。time属性不是必须存在的。
        在一个meta标记中input标记可以没有或有多个。
        所有input标记都直接被包含在meta标记中,除meta标记以外的任何标记都不应直接包含input标记。
        我们定义<correct time="???"></correct>标记来表示校对文章的电子版的人。
        correct标记有一个time属性,time属性的值是一个字符串,表示校对的时间。time属性不是必须存在的。
        在一个meta标记中correct标记可以没有或有多个。
        所有correct标记都直接被包含在meta标记中,除meta标记以外的任何标记都不应直接包含correct标记。
    6. 小结
        下面的代码总结了我们使用XML编写一个底层网页所需的所有东西。
    <?xml version="1.0" encoding="GB2312" ?>
    <?xml-stylesheet type="text/xsl" href="/xsl/article.xsl" ?>
    <article>
    <meta>
        <author country="国籍">作者</author>
        <in time="成书时间">出自哪部著作</in>
        <trans time="翻译文章的时间">翻译文章的人</trans>
        <scan time="扫描文章的时间">扫描文章的人</scan>
        <ocr time="OCR文章的时间">OCR该书的人</ocr>
        <input time="手工录入的时间">手工录入文章的人</input>
        <correct time="校对的时间">校对文章的电子版的人</correct>
    </meta>
    <title depth="0">文章标题</title>
    <title depth="1">段落标题</title>
    <text>
        正文
        <note by="加注人">注解</note>
    </text>
    <reference from="出处">引文</reference>
    <img src="???" icon="???" desc="图片" />
    <list>
        <lh>清单的表头</lh>
        <li>清单中的一行</li>
    </list>
    <table>
        <tr>
            <th></th>
            <td></td>
        </tr>
    </table>
    <link href="???" type="???">相关链接</link>
    </article>
    
    7. 测试和修改
        完成一个XML网页之后测试一下是个好习惯。如果你已经把上文提到的XSL样式单保存在存放XML文件的磁盘的根目录下的xsl子目录,或保存在WEB SERVER的主目录下的xsl子目录,使用IE打开你的XML文件,或把XML文件的路径输入到地址栏里,就能看到它显示给访问者的样子。如果你的XML网页中有错误,IE会指出错误的原因和具体位置,按照IE的提示修改你的XML网页,再次测试,直到网页能正常显示。