首先,让我们来回顾一下可扩展置标语言XML(eXtensible Markup Language)的发展简史。
----XML有两个先驱--SGML和HTML,这两个语言都是非常成功的置标语言,但是它们都在某些方面存在着与生俱来的缺陷。SGML(Standard Generalized Markup Language)的全称是标准通用置标语言,它为语法置标提供了异常强大的工具,同时具有极好的扩展性,因此在分类和索引数据中非常有用。但是,SGML非常复杂,并且价格昂贵,几个主要的浏览器厂商都明确拒绝支持SGML,使SGML在网上传播遇到了很大障碍。
----相反,超文本置标语言HTML(HyperText Markup Language)免费、简单,在世界范围内得到了广泛的应用。它侧重于主页表现形式的描述,大大丰富了主页的视觉、听觉效果,为推动WWW的蓬勃发展、推动信息和知识的网上交流发挥了不可取代的作用。可是,HTML也有如下几个致命的弱点,这些弱点逐渐成为HTML继续发展应用的障碍。
HTML是专门为描述主页的表现形式而设计的,它疏于对信息语义及其内部结构的描述,不能适应日益增多的信息检索要求和存档要求。
HTML对表现形式的描述能力实际上也还非常不够,它无法描述矢量图形、科技符号和一些其他的特殊显示效果。
HTML的标记集日益臃肿,而其松散的语法要求使得文档结构混乱而缺乏条理,导致浏览器的设计越来越复杂,降低了浏览的时间效率与空间效率。
----正因为如此,1996年人们开始致力于描述一个置标语言,它既具有SGML的强大功能和可扩展性,同时又具有HTML的简单性。XML就是这样诞生的。
----正象SGML和HTML一样,可扩展置标语言XML也是一种置标语言,它通过在数据中加入附加信息的方式来描述结构化数据。不过,XML并非象HTML那样,只提供一组事先已经定义好的标记。准确地说,它是一种元置标语言,允许程序开发人员根据它所提供的规则,制定各种各样的置标语言。在XML中,置标的语法是通过文档类型定义DTD(Document Type Definition)来描述的,也就是说,通过DTD来描述什么是有效的标记,并进一步定义置标语言的结构。除了定义置标的语法外,为了明确各个标记的含义,XML还使用与之相连的样式单(style sheet)来向应用程序,比如浏览器,提供如何处理显示的指示说明。一言以蔽之,XML是通过数据文档、DTD、样式单三个分离的部分来描述数据的。
----虽然XML貌似复杂,但它有一些突出的优点:
----1. 良好的可扩展性。XML允许各个不同的行业根据自己独特的需要制定自己的一套标记,同时,它并不要求所有浏览器都能处理这成千上万个标记,同样也不要求一个置标语言能够适合各个行业各个领域的应用,这种具体问题具体分析的方法更有助于置标语言的发展。
----2. 内容与形式的分离。正如前面所说,XML中信息的显示方式已经从信息本身中抽取出来,放在了"样式单"中。这样做便于信息表现方式的修改,便于数据的搜索,也使得XML具有良好的自描述性,能够描述信息本身的含义甚至它们之间的关系。
----3. 遵循严格的语法要求。XML不但要求标记配对、嵌套,而且还要求严格遵守DTD的规定。这增加了网页文档的可读性和可维护性,也大大减轻了浏览器开发人员的负担,提高了浏览器的时间空间效率。
----4. 便于不同系统之间信息的传输。不同企业、不同部门中往往存在着许多不同的系统,XML可以用作各种不同系统之间的交流媒介,是一种非常理想的网际语言。
----5. 具有较好的保值性。XML的保值性来自它的先驱之一--SGML语言,可以为文档提供50年以上的寿命。
----正是基于这些优点,国际标准化组织--万维网联盟W3C(World Wide Web Consortium)推荐XML作为第二代网页发布语言。
----最后,让我们来看一个完整的XML例子,以便对XML的整体机制有一个大致的了解。在下面的例子中,我们用XML来描述一个学生花名册的信息列表。我们先为这些数据定义一个DTD:
----Stuml.dtd
<?xml version="1.0" encoding="GB2312"?>
<!ELEMENT 学生花名册 (学生)*>
<!ELEMENT 学生 (学号, 姓名, 性别, 籍贯, 出生日期)>
<!ELEMENT 出生日期 (年, 月, 日)>
<!ELEMENT 学号 (#PCDATA)>
<!ELEMENT 姓名 (#PCDATA)>
<!ELEMENT 性别 (#PCDATA)>
<!ELEMENT 籍贯 (#PCDATA)>
<!ELEMENT 年 (#PCDATA)>
<!ELEMENT 月 (#PCDATA)>
<!ELEMENT 日 (#PCDATA)>
----关于学生花名册信息的标准XML文档是这样的:
----Student.xml
<?xml version = "1.0" encoding="GB2312" standalone = "no"?>
<!DOCTYPE 学生花名册 SYSTEM "stuml.dtd">
<?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>
<学生花名册>
<学生>
<学号>001</学号>
<姓名>张三</姓名>
<性别>男</性别>
<籍贯>北京市</籍贯>
<出生日期>
<年>1980</年>
<月>3</月>
<日>1</日>
</出生日期>
</学生>
<学生>
<学号>002</学号>
<姓名>李四</姓名>
<性别>女</性别>
<籍贯>河北省</籍贯>
<出生日期>
<年>1979</年>
<月>5</月>
<日>12</日>
</出生日期>
</学生>
</学生花名册>
----现在我们为它制定一个样式单,以描述这些数据的显示:
----Mystyle.xsl
<?xml version="1.0" encoding="GB2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"
xmlns="http://www.w3.org/TR/REC-html40" result-ns="">
<xsl:template><xsl:apply-templates/></xsl:template>
<xsl:template match = "/">
<HTML>
<HEAD>
<TITLE>学生花名册</TITLE>
</HEAD>
<BODY>
<xsl:apply-templates select="学生花名册"/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match = "学生花名册">
<xsl:for-each select="学生">
<UL>
<LI><xsl:value-of select="姓名"/></LI>
<UL>
<LI>学号: <xsl:value-of select="学号"/></LI>
<LI>性别: <xsl:value-of select="性别"/></LI>
<LI>籍贯: <xsl:value-of select="籍贯"/></LI>
<LI>出生年: <xsl:value-of select="出生日期/年"/></LI>
<LI>出生月: <xsl:value-of select="出生日期/月"/></LI>
<LI>出生日: <xsl:value-of select="出生日期/日"/></LI>
</UL>
</UL>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
----在IE5中看到的XML文件的显示结果是这样的:
l 张三
m 学号: 001
m 性别: 男
m 籍贯: 北京市
m 出生年: 1980
m 出生月: 3
m 出生日: 1
l 李四
m 学号: 002
m 性别: 女
m 籍贯: 河北省
m 出生年: 1979
m 出生月: 5
m 出生日: 12
----有兴趣的读者可以用"记事本"录入上面这三个文件,分别存盘后放在一个目录中,然后用IE5打开文件student.xml,看看结果是不是这样。