第22章 可扩展标记语言(XML)
可扩展标记语言(Extensible Markup Language,XML)是万维网协会(W3C)推荐的一个开放标准,它是构造Web上的文档和数据的通用格式。XML有着越来越广泛的应用前景。它的应用范围包括数据库系统、搜索引擎、数据编辑器、文档编辑器、Web网页、电子商务、Java、新闻、公共对象请求代理体系结构(Common Object Request Broker Architecture,CORBA)等。
XML是一大技术系列,除了XML 本身之外还涉及很多技术规范,例如,
CSS (cascading style sheets):级联样式语言。
XSL (Extensible Stylesheet Language):可扩展样式语言。
XSLT (XSL Transformation):可扩展的样式语言转换语言。
DTD (Document Type Definition):文档类型定义。
XML Schemas:XML模板语言。
DOM (Document Object Model):文档对象模型。
XLink (XML Linking Language):XML链接语言。
XPointer (XML Pointer Language),XML指针语言。
XPath (XML Path Language):XML路径语言。
WAP (Wireless Application Protocol):无线应用协议。
SOAP (Simple Object Access Protocol):简单对象存取协议。
WSDL (Web Services Description Language):Web服务描述语言。
本章主要介绍XML的基本概念,目的是为进一步学习、应用和开发Web标准打基础。由于标准文件写得很精炼,读懂它需要时间和比较广泛的知识,仅有本章介绍的知识离理解标准还很不够,因此在本章的最后列出了很多非常优秀的参考文献和站点,[7]~[12]尤其适合初学者。在本章介绍的例子中,许多例子都没有使用中文,一方面是笔者用的计算机没有安装更新的应用软件,另一方面是有些执行规范的软件暂时还不支持中文。
22.1 XML是什么
22.1.1 XML不是标记语言标记(markup)是组织和标注文档内容的一套字符集,是写在待排版原稿上的详细的格式说明。用作标记的标签(tag)用于标记元素、实体引用、声明、注释、处理指令和段落的开始与结束。标记语言(markup language)是用于表示和组织数据的一套规则,用标签来编写文本的一种符号。标签用来表示文本的结构,标签有名称和属性,标签还可包含部分的文本。标记语言提供许多构造文档的方法,如使用元素对文档的局部作标记、使用文档类型定义(DTD)来强制文档的结构以及使用实体引用来输入数据。
XML名为标记语言,但它本身不是标记语言,而是用于创建标记语言的一套规则,是一种元语言。所谓元语言是用来描述另一种语言的语言。例如,我们用名词、动词、副词和形容词等来描述自然语言中句子的结构,因此这些词是用于描述一种语言的语言。XML定义的是各种标签以及它们之间关系的一套规则,用来描述数据(或称信息),定义数据是什么样的数据。因此从这个意义上说,XML是用来定义另一种语言的元语言,是一种构造语言和分析语言的语言。
XML使用与HTML类似的标签结构。它们之间主要差别是,HTML定义如何显示文档元素,而XML定义包含什么文档元素;HTML使用预先定义的标签,而XML允许网页开发人员定义自己的标签。
把XML看成标记语言是一种误解,认为XML要取代HTML也是一种误解。实际上,HTML已经在努力用XML格式重写,重写后的HTML认为是下一代的标记语言,叫做XHTML(可扩展超文本标记语言)。也许XML不会用来创作未来的网页,但XHTML将肩负这个重任。
22.1.2 XML文档什么样认识XML文档并不难,首先让我们看一个简单的例子。
【例22.1】 一个简单的XML文档:
1: <?xml version="1.0"?>
2, <!--一个简单的XML文档-->
3, <message>
4, <to>Student</to>
5, <from>Teacher</from>
6, <subject>Introduction to XML</subject>
7, <body>Welcome to XML!</body>
8,</message>
在这个例子中,XML文档由下面三个部分组成:
⑴ XML声明(第1行):说明使用的XML版本号。这是XML文档最先要声明的。
⑵ 文档注释(第2行):说明该文档是“一个简单的XML文档”
⑶ 文档元素(第3~8行):这些是XML文档的基本的构造块。其中,<message>…</message>是“大”元素,message元素中还包含像to,form,subject和 body这样的“小元素”。
22.2 XML元素
22.2.1 什么是XML元素
XML元素是由一对标签界定的一个数据单位。标签由尖括号(< >)和包含在尖括号里的含有意义的文字组成,因此它是一种有语义的标签。一个XML元素由开始标签、结束标签和它们之间的数据组成。开始标签和结束标签用来描述它们之间的数据,并把数据作为这个元素的值。例如,一个名为doctor的XML元素,
<doctor>Jiamin Li</doctor>
其中,“Jiamin Li”是XML数据,也称doctor元素的值。<doctor>是开始标签,而</doctor>是结束标签。
给元素赋予有含义的名称是值得重视的事情,这样就容易区别数据相同而标签不同的元素。在我们的日常生活中,也有许多类似的情况。例如,有一个教师的姓名也叫做“Jianmin Li”,我们就可以用<teacher>标签来表示,
<teacher>Jiamin Li</teacher>
这样就从语义上给具有相同姓名的人做了标记,一个是“doctor”,另一个是“teacher”。
在XML标签内,字母的大小写是有区别的。例如,
<internet>,<Internet>,<INTERNET>
是三个不同的标签。
XML元素可以嵌入到其他的元素中。例如,
<slideshow>
<slide> My Name</slide>
<slide>My topic</slide>
</slideshow>
其中,slideshow元素包含两个slide元素。
22.2.2 XML元素的命名规则
XML元素的名称必需遵照如下的命名规则:
⑴ 名称可以包含字母、数字和其他字符。
⑵ 名称不能用数字或标点符号开始。
⑶ 名称不能用xml,XML或Xml文字开始。
⑷ 名称不能包含空格。
在对XML元素命名时,还须要注意:
⑴ 可以使用任何名称,没有保留字。但希望起的名称要有一定的含义,与说明的内容比较贴近;多个词组成的名称最好用下划线“_”隔开,如<first_name>,<last_name>,避免使用“-”和“.”。
⑵ 名称的长度没有具体限制,但希望赋予的名称短一点,简单一点,不要太长。例如,书(book)元素名称使用<book_title>,而不使用<the_title_of_the_book>。
⑶ XML元素的名称允许非英文字符,但需要注意应用软件是否支持非英文字符集。
⑷ 冒号“:”是保留符号,在XML元素名称中不允许使用。
22.2.3 XML元素的特性
XML元素具有可扩展性、父子关系、一个元素可包含不同内容和一个元素可包含不同属性等四种特性。
1,可扩展性
XML元素可以扩展,使XML文档包含更多的信息。
【例22.2】 一个XML note文档为,
<note>
<to>Lucy</to>
<from>Lin</from>
<body>Don't forget me this weekend!</body>
</note>
在这个文档中,可把日期信息(如<date>2002-07-15</date>)添加进去,如下所示,
<note>
<date>2002-07-15</date>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
2,父子关系
XML元素具有“父子”关系。为便于理解XML元素之间的关系,先举例说明XML元素如何命名和描述元素的内容。
【例22.3】 用XML描述一本书的前两章:
Book Title,Multimedia Fundamentals
Chapter 1,Introduction to Multimedia
What is Multimedia
What is Web
Chapter 2,Color Space
What is Color Space
Color Space Conversion
用XML描述这本书时,其文档如下所示:
<book>
<title> Multimedia Fundamentals </title>
<prod isbn="7-302-03933" media="paper"></prod>
<chapter> Introduction to Multimedia
<para> What is Multimedia </para>
<para> What is Web </para>
</chapter>
<chapter> Color Space
<para> What is Color Space </para>
<para> Color Space Conversion </para>
</chapter>
</book>
其中,book是根元素。title,prod和chapter都是book元素的子元素,book是title,prod和chapter的父元素。title,prod和chapter是姐妹元素,因为它们的父母亲是相同的。
3,一个元素可包含不同内容一个XML元素可以有不同类型的内容。其内容可以是元素内容、混合内容、简单内容复杂内容或无内容。例如,例22.3中的book元素含有元素内容,因为它包含其他元素;chapter元素含有混合内容,因为它包含文本和其他元素;para含有简单内容,因为它仅包含文字;prod包含的内容是空的,因为isbn和media是元素的属性,不是元素的内容。
4,一个元素可包含不同属性一个XML元素可以包含不同类型的属性。例如,例22.3中的prod元素有isbn和media两种不同类型的属性,而且都有值。属性名为isbn的属性值为7-302-03933,属性名为media的属性值为paper。22.2.4节将对属性作更多的介绍。
22.2.4 XML元素的属性属性是XML标签的一个修饰词,用来提供元素的附加信息。属性用属性名、等号和属性值表示。例如,<book>标签的属性,
<book isbn = "7-302-03933">
<--! 属性名 = "属性值" -->
XML元素的属性有如下几个特性。
1,属性只能指定一次一个XML元素可包含一个或多个属性,但每个属性值只能指定一次,其次序不分先后。例如,一个slide元素如下所示,
<slide title="XML Tutorial">
在这个标签中,title="XML Tutorial"是属性。其中,title是属性名,XML Tutorial是属性值。在一个文档中,title的属性值只能是"XML Tutorial"。
2,属性不是元素数据一个元素的属性不是元素数据的一部分,而是说明数据的。例如,
<file type="jpg">Ronaldo.jpg</file>
在这个XML元素中,标签中的type属性是与Ronaldo.jpg数据无关的,但对处理这个元素的软件来说是重要的。
3,属性值要用引号属性值必需要用引号表示。表示属性值的引号可以是单引号,也可以是双引号。例如,一个人的性别标签可以写成,
<person sex="female">
或者
<person sex='female'>
最常用的是双引号,但有时(如属性值本身包含引号的情况下)必需使用单引号。
4,属性可存放数据
XML元素的数据可以存储在子元素中,也可存储在属性中。
【例22.4-1】 假设female是数据,它可存储在属性中。
<person sex="female">
<first_name>Lucy</first_name>
<last_name>Zhao</last_name>
</person>
【例22.4-2】 假设female是数据,它可存储在子元素中。
<person>
<sex>female</sex>
<first_name>Lucy</first_name>
<last_name>Zhao</last_name>
</person>
例22.4-1和例22.4-2都提供相同的信息。至于什么时候使用属性存储数据,什么时候使用子元素存储数据,还没有看到有规则可循。如果感到信息像一种数据(如罗纳尔多助巴西第五次捧世界杯),则通常使用子元素。仅当提供的信息与数据无关的情况下,才考虑用属性。这是因为属性不能包含多个值,而子元素则可以;属性不能描述结构,而子元素则可以;处理程序处理属性相对于处理子元素比较困难等因素。总而言之,关于数据的数据,称为元数据(metadata),应该存储在属性中,而数据本身则应该存储在子元素中。
22.3 XML文档和语法
22.3.1 XML文档的基本结构一个基本的XML文档就是一个XML元素,其嵌套XML元素可有可无。XML文档使用文档类型定义(DTD)或者XML模式(XML Schema)来描述数据。使用DTD或者XML Schema的XML文档叫做自描述文档,XML文档的文件扩展名用.xml表示。
【例22.5】 下面是一个使用自描述的XML文档:
1:<?xml version="1.0" encoding="ISO-8859-1"?>
2:<note>
3,<to>Lucy</to>
4,<from>Lin</from>
5,<heading>Reminder</heading>
6,<body>Don't forget me this weekend!</body>
7:</note>
第1行是XML声明(XML declaration),
<?xml version="1.0" encoding="ISO-8859-1"?>
用来说明XML的版本号和在文档中使用的字符编码。在这个XML文档中,说明该文档使用XML 1.0规范和ISO-8859-1(拉丁文-1/西欧)字符集。
第2行描述文档的根元素(root element),
<note>
其含义为“这是一个备忘录”。
第3~6行描述根元素(note)的4个子元素(child element)为to(送给)、from(来自),heading(标题)和body(主体),
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
第7行表示根元素结束,
</note>
22.3.2 XML语法
XML文档是一个自描述的文档。通过分析例22.5,我们可以看到XML的一些基本语法规则。
⑴ 在XML文档中,所有XML元素必需要使用一个开始标签(或称打开标签)和一个结束标签(或称关闭标签)。在本教材中,这一对标签称为开闭标签。例如,
<p>这是一个段</p>
<p>这是另外一段</p>?
而在HTML文档中,不一定要使用开闭标签。例如,
<p>这是一个段
<p>这是另外一段注意:在例22.5中,第一行的XML声明没有使用开闭标签,即
<?xml version="1.0" encoding="ISO-8859-1"?>
这是因为XML声明不是XML元素,它不是XML文档本身的一部分,因此不应该有开闭标签。
⑵ 在XML文档中,XML标签区分字母的大小。例如,Message和message是不同的,因此<Message>标签和<message>标签是两个不同的标签。
⑶ 在XML文档中,开始标签和结束标签必需是相同的。如果开标签使用<Message>,则闭标签也要使用</Message>。例如,
<Message>这是错误的标签对</message>
<message>这是正确的标签对</message>
⑷ 在XML文档中,所有XML元素必需正确嵌套。例如,
<p><b>这段用加粗的宋体</b></p>
而在HTML文档中,HTML元素没有正确嵌套也未尝不可。例如,
<p><b>这段用加粗的宋体</p></b>
⑸ 在XML文档中,第一个标签和最后一个标签叫做根标签(root tag)。所有XML文档必需要有一对开闭根标签,其他的元素必需嵌套在这对根标签内。
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
⑹ 在XML文档中,XML元素可以有属性值,但必需使用双引号(" "),就像HTML中的文档一样。例如,
<?xml version="1.0" encoding="ISO-8859-1"?>
<note date="7/7/2002">
……
</note>
date是note的属性,属性值为"7/7/2002"。
⑺ 在XML文档中,空格是保留的。
⑻ 在XML文档中,CR / LF字符只存储LF字符。在过去,新行字符包括回车(carriage return,CR)和换行(line feed,LF)两个字符。在Windows环境下,文本中的新行字符存储CR和LF两个字符;在UNIX环境下,文本中的新行字符只存储LF字符。
⑼ 在XML文档中,使用与HTML文档中类似的注释。例如,
<!--这是一个注释-->
注释行的开始部分由4个字符组成:<!--,结束部分由3个字符组成:-->。在它们之间可以包含任何种类的文字。
22.4 XML文档类型
XML.10规范指定了两种类型的文档,一种叫做合格XML文档(Well-Formed XML document),另一种叫做有效XML文档(Valid XML document)。
22.4.1 什么是合格XML文档一个严格遵照XML语法规则构造的文档叫做合格XML文档。XML语法规则在22.3.2中作了介绍,详细的规则可在万维网协会(W3C)推荐的XML 1.0标准中找到[1]。
下面所示的文档是一个合格XML文档。
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
HTML的规则比较松散,这就迫使Web浏览器要补充许多丢失的说明。XML则很严谨,一个合格XML文档必需符合下列XML文档结构规则:
⑴ 每个元素必需有开始标签和结束标签。
⑵ 文档必需有一个包含所有其他元素的根元素。
⑶ 标签必需正确嵌套。
一个合格XML文档不要求一定要用文档类型定义(DTD)或XML模式(XML schema),它们将分别在22.7和22.9中介绍。由于合格XML文档不需要附加的DTD,因此它比较容易创建,在网上传输时也不需要下载DTD文件。
22.4.2 什么是有效XML文档有效XML文档(“Valid”XML document)是遵照XML语法规则和文档类型定义(DTD)规则构造的一种文档。有效XML文档是一种合格XML文档。
【例22.6】 一个遵照XML和DTD规则编写的有效文档如下,
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "InternalNote.dtd">
<note>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
其中,DOCTYPE是Document Type Declaration的简写,不同于DTD。一个序言(prolog)通常包含一个这种形式的语句:
<!DOCTYPE foo SYSTEM "foo.dtd">
其中,foo叫做占位符,在实际的语句中用真实的名称。
22.5 XML与Web浏览器
22.5.1 XML Web浏览器最近几年大家用得比较多的Internet Explorer 5.0 (IE 5.0)以上版本和Netscape Navigator 6.0以上版本都支持XML 1.0和XML DOM标准。以IE 5.0为例,它可支持的功能包括:
⑴ 显示XML文档。
⑵ 支持W3C DTD标准。
⑶ 作为数据岛嵌入在HTML中的XML文档。
⑷ 把XML数据捆绑到HTML元素。
⑸ 用XSL转换和显示XML文档(见22.6)。
⑹ 用CSS显示XML文档(见22.6)。
⑺ 访问XML DOM(见22.6.6)。
此外,挪威Opera浏览器是Norwegian Opera Software公司开发的一种Web浏览器[3],是继Netscape Navigator和Internet Explorer之后的浏览器。它一直在扩展对W3C标准的支持能力。Opera因其速度快、软件小巧和对标准的兼容性好而得到终端用户和出版工业界的广泛赞扬。
22.5.2 XML文档显示
Internet Explorer 5.0以上版本可以显示原始XML文档。如果要像HTML格式那样显示XML文档中的数据,则需要用其他代码(如JavaScript)输入XML文档的数据才能显示。
1,在浏览器中显示XML文档在浏览器中显示XML文档,只要在它的地址栏中输入文档的URL就可以。如果XML文档在本机上,点击XML文档名就可以调用浏览器来显示。
【例22.7-1】 将下面的XML文档
<?xml version="1.0" encoding="ISO8859-1"?>
<note>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
保存到C:\temp目录下,文件名用note.xml。因笔者的计算机上安装的浏览器是IE 6.0,用IE 6.0显示时,显示的样式如图22-1(a)所示。
(a) IE 6.0浏览器上显示的note.xml (b) 记事本器上显示的note.xml
图22-1原始XML文档的显示在图22-1(a)中,根元素和子元素的标签都用颜色作标记。<note>左边有一个减号(-),点击它就隐藏标签note元素内的代码,而减号也就会变成加号(+)。如果要查看原始XML文档的源文件,则需要点击IE浏览器上的“查看(V)”,然后点击下跌选单上的“源文件(C)”,调出文件编辑器(如记事本)就可看到原始XML文档的源文件,如图22-1(b)所示。
2,用JavaScript显示XML文档数据要在当前的Web浏览器上显示XML文档的数据,可用JavaScript从XML文档中输入数据。
【例22.7-2】 用JavaScript输入XML文档数据的HTML文档如下,
<html>
<head>
<script language="JavaScript"
for="window" event="onload">
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("note.xml")
nodes = xmlDoc.documentElement.childNodes
to.innerText = nodes.item(0).text
from.innerText = nodes.item(1).text
header.innerText = nodes.item(2).text
body.innerText = nodes.item(3).text
</script>
<title>Displaying XML data inside HTML page</title>
</head>
<body bgcolor="#C4FFE6">
<h1 align="center"><font size="4">试用Web浏览器显示XML文档<br>
(2002年7月10日)</font></h1>
<hr>
<p><b>收件人,</b><span id="to"></span><br>
<b>发件人,</b><span id="from"></span> <br>
<b>主标题,</b><span id="header"></span> <br></p>
<p> <b>内 容,</b><span id="body"></span> </p>
</body>
</html>
将这个文档存储到将这个文档存储到C:\temp目录下,使用的文件名为note.htm。用IE 6.0显示时,显示的样式如图22-2所示。
图22-2 浏览器上显示的note.htm
22.5.3 XML数据岛
XML数据岛(XML data island)是在HTML文档中存在的一种XML文档,它无须通过脚本(script)或<OBJECT>标签创建,只要对照XML文档就可以进行编写。任何可以用合格XML文档表示的东西都可以是在一个数据岛内。数据岛用<xml>作为标签,用id属性提供引用的数据岛名称。
【例22.8-1】 在下面所示的文档中,第2~8行构成一个数据岛。其中,第2行和第8行是数据岛的标签。
<?xml version="1.0" encoding="ISO-8859-1"?>
<xml id="mybooks">
<title>Multimedia Fundamentals</title>
<author>Lin Dagong</author>
<country>China</country>
<company>Qinghua</company>
<price>39.90</price>
<year>2002.9</year>
</xml>
将这个数据岛加上第1行的XML声明保存在c:\temp的文件夹中,文件名可用dataisland.xml。
【例22.8-2】 编写一个HTML文档,将这个数据岛加入到HTML文档中,
<html>
<head>
<title>数据岛的概念</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<xml id="mybooks" src="dataisland.xml"></xml>
<table border="1" datasrc="#mybooks">
<tr>
<td><span datafld="author"></span></td>
<td><span datafld="title"></span></td>
<td><span datafld="price"></span></td>
<td><span datafld="year"></span></td>
</tr>
</table>
将这个文档保存在c:\temp的文件夹中,文件名可用dataisland.htm,用IE 6.0中看到的文档如图22-3所示。
图22-3 使用IE 6.0显示的dataisland.htm文件
22.6 XML与XSL
可扩展样式语言(Extensible Stylesheet Language,XSL)是万维网协会(W3C)于2001年10月推荐的一个标准,用于表示文档样式的一种语言。XSL由XSLT,XPath和XSL Formatting Objects组成。它可以把XML转换成HTML,可以对XML数据进行过滤和分类,可以定义XML文档的部件,可以根据数据值编排XML数据的格式,等等。
本节将学习什么是XSL,以及如何使用XSL把XML文档转换成HTML文档。
22.6.1 HTML样式与CSS
级联样式语言(cascading style sheets,CSS)是由万维网协会(W3C)为基于Web的样式表签署的第一个规范[5]。版本CSS 1.0提供了数百个可下载的版面设置,这些设置可应用到各种各样的HTML文档。版本CSS 2.0和CSS3.0还可支持XML等功能。该规范允许HTML文档作者和用户把HTML样式表(如网页如何显示、网页上文本字体等样式表)附加到HTML文档上。该规范也可指导HTML文件与用户的样式表进行混合。
由于HTML使用预先定义的标签,这些标签的含义很好理解。例如p元素定义一个段落,h1元素定义一级标题,因此浏览器就知道如何显示它们。使用CSS把新的样式添加到HTML元素也并不困难,告诉浏览器用什么字体和颜色显示每个元素也容易做到,浏览器也不难理解。但用CSS来格式XML文档似乎不是Web网页的未来。
22.6.2 XML样式与XSL
由于XML不使用预先定义的标签,它允许使用任何标签,因此标签的意义就不好理解。例如<table>标签可以表示HTML的表格、办公室或家里的桌子或者其他东西。因此,目前的浏览器就不知道如何显示XML文档,这就必需要给XML文档添点东西来描述文档如何显示,这个东西就是可扩展样式语言(XSL)。XSL是为XML文档制定样式的一种语言,它由下列三个部分组成:
⑴ XSLT:转换XML文档的一种语言。
⑵ XPath:定义XML文档部件的一种语言
⑶ XSL Formatting Objects:格式XML文档的词汇
XSLT (XSL Transformation)是一种可扩展的样式语言转换语言,是XSL标准中最重要的组成部分。XSLT用于把XML文档转换成另一种XML文档,或者转换成浏览器能够识别的文档。例如,使用XSLT把XML元素转换成HTML元素,使用XSLT把XML文档转换成XHTML文档,以便用Web浏览器来显示文档。XSLT也可把新的元素添加到输出文件,或者删除元素。它还可以对元素进行分类、测试和判断什么元素要显示等。
描述转换过程的行话是XSL使用XSLT把XML源树(source tree)转换成XML结果树(result tree)。在转换过程中,XSLT使用XPath定义源文档中与预先定义的模板相匹配的部分,然后把相匹配的部分转换成结果文档(result document)。源文档中与模板不匹配的部分将保留在结果文档中。
22.6.3 XSL浏览器微软公司开发了多种版本的XML分析器,用来支持XSL语言。其中,MSXML Parser 2.0是与IE 5.0一起发行的XML分析器;MSXML Parser 2.5 是与Windows 2000和IE 5.5一起发行的XML 分析器;XML Parser 3.0是与IE 6.0和Windows XP 一起发行的XML分析器。MSXML 4.0是2001年7月发布的XML分析器[7]。
XML Parser 4.0是根据W3C XSLT 1.0和W3C XPath 1.0标准开发的,支持最终的W3C XML Schema (XSD)标准,并支持基于SAX (Simple API for XML)(事实上的标准)的连续的XML处理体系结构。
22.6.4 用XSLT显示XML文档下面将举例说明如何使用XSLT把XML文档转换成HTML文档。在举例说明过程中,凡是用应用程序(如字处理器,Dreamweaver,HTML编辑器等)创建的任何东西(如文章、源程序等)都叫做文档(document),把创建的这些东西保存到盘上时,则赋予它一个能被检索的唯一的文件名,通常叫做某某文件(file)。在下面的例子中,使用应用程序创建的XSL文档用的文件名为mycatalog.xsl,使用应用程序创建的XML文档用的文件名为mycatalog.xml。
1,XSL样式声明声明XSL样式的根元素是<xsl:stylesheet>或<xsl:transform>。按照W3C XSL推荐标准,目前声明XSL样式的方法如下,
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
或
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
其中,
⑴ <xsl:stylesheet>和<xsl:transform>是同义词,用那一个都可以。
⑵ xmlns:xsl=http://www.w3.org/1999/XSL/Transform表示使用W3C XSL推荐标准的名称空间(见22.8)。如果要使用该名称空间,就要包含version="1.0"属性;如果使用IE 6.0或Netscape Navigator 6.0就要使用上述声明方法中的一种。
2,编写XML文档
【例22.9-1】 假设已经编写了一个合格XML文档,
<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<book>
<title>Multimedia Fundamentals</title>
<author>Lin Dagong</author>
<country>China</country>
<company>Qinghua</company>
<price>39.90</price>
<year>2002.9</year>
</book>
…
</catalog>
然后把它存放在c:\temp文件夹下,文件名为mycatalog.xml。
3,创建XSL样式
【例22.9-2】 使用转换模板创建XSL样式。假设已经编写了一个如下所示的XSL样式,
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h3 align="left">My Books</h3>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left" bgcolor="#66FFFF">Book Title</th>
<th align="left" bgcolor="#66FFFF">Author</th>
<th align="left" bgcolor="#66FFFF">Country</th>
<th align="left" bgcolor="#66FFFF">company</th>
<th align="left" bgcolor="#66FFFF">Price</th>
<th align="left" bgcolor="#66FFFF">Year</th>
</tr>
<xsl:for-each select="catalog/book">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="author"/></td>
<td><xsl:value-of select="country"/></td>
<td><xsl:value-of select="company"/></td>
<td><xsl:value-of select="price"/></td>
<td><xsl:value-of select="year"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
然后把它存放在c:\temp文件夹下,文件名为mycatalog.xsl。
4,把XSL样式链接到XML文档
【例22.9-3】 把引用XSL样式的代码添加到XML文档,
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="mycatalog.xsl"?>
<catalog>
<book>
<title>Multimedia Fundamentals</title>
<author>Lin Dagong</author>
<country>China</country>
<company>Qinghua</company>
<price>39.90</price>
<year>2002.9</year>
</book>
<book>
<title>Multimedia and CD-ROM</title>
<author>Dagong Lin </author>
<country>China</country>
<company>Qinghua</company>
<price>25.90</price>
<year>1995.3</year>
</book>
<book>
<title>Multimedia Dictionary</title>
<author>Zhang Linyou </author>
<country>China</country>
<company>Qinghua</company>
<price>59.90</price>
<year>2002.12</year>
</book>
</catalog>
然后把它存放在c:\temp文件夹下,覆盖原来保存的mycatalog.xml。
5,在浏览器上显示XML文档使用支持XSL语言的浏览器,就可把XML文档转换成HTML文档。IE 6.0是支持XSL语言的一种浏览器,打开在c:\temp文件夹下名为mycatalog.xml的文件,就可以看到XML文档,如图22-4所示。
图22-4 使用IE 6.0显示的mycatalog.xml文件
22.6.5 XSL元素
1,XSL <xsl:template>模板元素一个XSL样式由一套规则组成,它们被称为模板。一个<xsl:template>模板元素包含用于匹配节点的规则。使用match(匹配)属性把模板与XML元素发生联系。match属性也可以用来为XML文档中的一个完整部分定义模板,而match="/"则定义整个文档。
例如,例22.9-2所示的XSL样式,
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
……
</body>
</html>
</xsl:template>
</xsl:stylesheet>
第1行,文档开始使用xml声明,表示它是一个XML 1.0文档,文档的字符编码标准是ISO-8859-1。
第2行,元素<xsl:stylesheet>表示样式定义从这里开始。
第3行,元素<xsl:template> 表示模板定义从这里开始。match="/" 表示把模板与XML源文档的根元素相关联。
除了最后两行用来定义模板结束和样式结束之外,文档的其余部分是它本身的模板。
2,XSL <xsl:value-of> 元素
XSL <xsl:value-of>元素使用其中的select属性来选择XML元素的值,然后把它添加到输出流中。在例9-2中,选择属性值为"title"和"year"的代码如下,
<xsl:for-each select="catalog/book">
<tr>
<td><xsl:value-of select="title"/></td>
……
<td><xsl:value-of select="year"/></td>
</tr>
</xsl:for-each>
3,XSL <xsl:for-each> 元素
XSL <xsl:for-each>元素可以在XSL中做循环操作。它可以用来选择指定节点集中的每一个XML元素。在例22.9-2中,它的代码如下,
<xsl:for-each select="catalog/book">
<tr>
<td><xsl:value-of select="title"/></td>
……
<td><xsl:value-of select="year"/></td>
</tr>
</xsl:for-each>
4,过滤输出过滤输出(filtering the output)的含义是,使用XSL对XML数据进行过滤,其方法是把过滤条件添加到<xsl:for-each>中的select属性。合法的过滤操作符为,
⑴ = 等于
⑵ != 不等于
⑶ < 小于
⑷ > 大于例如,要把2002年9月出版的书选出来,可将例22.9-2中的代码
<xsl:for-each select="catalog/book">
改为
<xsl:for-each select="catalog/book[year='2002.9']">
在IE 6.0中显示如下的输出结果:
My Books
Book Title
Author
Country
company
Price
Year
Multimedia Fundamentals
Lin Dagong
China
Qinghua
39.90
2002.9
5,XSL <xsl:sort>元素
XSL <xsl:sort> 元素用来对XML文档的输出进行排序。其方法是在XSL文件中的for-each元素内添加sort元素。例如,在例22.9-2中加入按照author(作者)排序元素的代码如下所示,
<xsl:for-each select="catalog/book">
<xsl:sort select="author"/>
……
</xsl:for-each>
6,XSL<xsl:if> 元素
XSL<xsl:if>元素包含一个模板,当满足指定条件时就使用它。其方法是在XSL文件中添加<xsl:if>即可。例如,在例22.9-2中加入按照author(作者)排序的元素如下,
<xsl:if test="price>'10'">
some output,..
</xsl:if>
其中,test属性的属性值包含评价表达式。例如,在例22.9-2中加入test元素的代码如下所示,
<xsl:for-each select="catalog/book">
<xsl:if test="price<'30'">
<tr>
<td><xsl:value-of select="title"/></td>
……
<td><xsl:value-of select="year"/></td>
</tr>
</xsl:if>
</xsl:for-each>
7,XSL <xsl:choose> 元素
XSL<xsl:choose>元素用于联接<xsl:when>和<xsl:otherwise> 这两个元素,以表示多重条件测试。插入条件选择的方法是把<xsl:choose>,<xsl:when>和<xsl:otherwise>三个元素添加到XSL文件中。插入选择price做test条件的代码如下,
<xsl:choose>
<xsl:when test="price>'30'">
,.,some code,..
</xsl:when> <xsl:otherwise>
,.,some code,...
</xsl:otherwise>
</xsl:choose>
【例22.9-4】 把上面的代码插入到例22.9-2的mycatalog.xsl文件,该文件的完整代码如下,
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h3 align="left">My Books</h3>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left" bgcolor="#66FFFF">Book Title</th>
<th align="left" bgcolor="#66FFFF">Author</th>
<th align="left" bgcolor="#66FFFF">Country</th>
<th align="left" bgcolor="#66FFFF">company</th>
<th align="left" bgcolor="#66FFFF">Price</th>
<th align="left" bgcolor="#66FFFF">Year</th>
</tr>
<xsl:for-each select="catalog/book">
<tr>
<!-- <td><xsl:value-of select="title"/></td> -->
<xsl:choose>
<xsl:when test="price>'30'">
<td bgcolor="#FFFFCC">
<xsl:value-of select="title"/></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="title"/></td>
</xsl:otherwise>
</xsl:choose>
<td><xsl:value-of select="author"/></td>
<td><xsl:value-of select="country"/></td>
<td><xsl:value-of select="company"/></td>
<td><xsl:value-of select="price"/></td>
<td><xsl:value-of select="year"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
在运行以上代码时,如果遇到价格大于30元的书,将在Book Title栏中加淡黄色的底色。在IE 6.0上显示的结果如图22-5所示。
图22-5使用IE 6.0显示使用条件选择的mycatalog.xml文件
8,XSL <xsl:apply-templates> 元素
XSL <xsl:apply-templates>元素把模板规则用到当前的元素或子节点。如果把select属性添加到<xsl:apply-templates>,XSL将仅处理与属性值匹配的子元素。使用select属性可指定处理子节点的顺序。
【例22.9-5】 应用< xsl:apply-templates >元素和select属性,把属性值等于"title"的元素用红色表示,把属性值等于"author"的元素用蓝色表示。实现这些要求可使用如下所示的代码,
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My Books</h2>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="book">
<p>
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="author"/>
</p>
</xsl:template>
<xsl:template match="title">
Title,<span style="color:#ff0000">
<xsl:value-of select="."/></span>
</xsl:template>
<xsl:template match="author">
Author,<span style="color:#0000ff">
<xsl:value-of select="."/></span>
</xsl:template>
</xsl:stylesheet>
运行以上代码,在IE 6.0上显示的结果如图22-6所示。
图22-6使用IE 6.0显示使用应用模板的mycatalog.xml文件
22.6.6 XSL在客户机上通过例22.9-1~9-5可以看到,如果使用支持XML的浏览器,那么就可以在客户机上使用XSL文档把XML文档转换成HTML文档。
在22.5.2中已经看到,使用JavaScript来显示XML文档。从22.6.4中已经看到,使用XSL可以把XML文档转换成HTML文档,然后在浏览器中显示。同样可以使用JavaScript把XML文档转换成HTML文档,这样就便于在目前的浏览器上阅读。
1,用JavaScript转换XML文档
【例22.10】 将例22.9-2所示的XML文档保存为mycatalog.xml文件,将例22.9-3所示的XSL文档保存为mycatalog.xsl文件。使用JavaScript把XML文档转换为HTML文档可试用如下的源代码,
<html>
<body>
<script type="text/javascript">
// Load XML
var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async = false
xml.load("mycatalog.xml")
// Load XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("mycatalog.xsl")
// Transform
document.write(xml.transformNode(xsl))
</script>
</body>
</html>
在源代码中,第一个码块用来创建XML分析器的一个实例,然后把XML文档装载到内存。第二个码块用于创建分析器的另一个实例,然后把XSL文档装载到内存。最后一行代码是使用XSL文档对XML文档进行转换,然后将转换结果写到HTML文档。
将该文档保存为mycatalog.htm文件,然后使用IE 6.0浏览器就可看到与图22-5完全相同的网页。
2,Microsoft XML分析器在例22.10中,Microsoft.XMLDOM表示这是微软公司开发的XML文档对象模型(XML Document Object Model,XML DOM),它是XML文档的编程接口。XML文档对象模型是一种对象集,用来访问和管理存储在XML文档中的数据。XML文档以树的样式进行构造,树中的每一个元素当作一个节点,每个节点包含文档中的实际数据。树和节点用对象表示,对象带有各种属性和方法(method),方法是一种对象关联的操作或子程序,用来操作对象的数据。
对象是在XML分析器加载和分析XML文档时创建的,通过ID值可引用树或文档对象。例如,
<XML ID="MyXMLDocument">
<class>
<student studentID="991406">
<name>Jia Sheng</name>
<GPA>4.5</GPA>
</student>
</class>
</XML>
其中,MyXMLDocument是文档对象的ID值,通过文档对象的属性和方法可以访问树的根元素(或叫做节点)和子元素(或叫做子节点)。根元素(即文档元素)是文档中最高层的节点,在一个文档中只能出现一次。
Microsoft XML分析器与IE 5.0一起发行。如果在计算机上安装了IE 6.0,在HTML文档和ASP文档中的脚本都可以用XML分析器。XML分析器支持JavaScript,VBScript,Perl,VB,Java,C++ 等语言,支持W3C XML 1.0,XML DOM和DTD等标准。
如果使用IE中的JavaScript,创建XML文档对象的代码为,
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM")
如果使用VBScript,创建XML文档对象的代码为,
set xmlDoc=CreateObject("Microsoft.XMLDOM")
如果在ASP中使用VBScript,创建XML文档对象的代码为,
set xmlDoc=Server.CreateObject("Microsoft.XMLDOM")
把XML文件加到XML分析器可使用脚本。在例22.10中,把mycatalog.xml文档加到XML分析器的代码如下,
<script type="text/javascript">
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("mycatalog.xml")
//,......(其他文档)
</script>
其中,第2行代码创建一个Microsoft XML分析器的实例;第3行代码关闭异步加载功能,以确保分析器在文档加载完成之后才继续执行;第4行代码告诉分析器加载的XML文档叫做mycatalog.xml。
22.6.7 XSL在服务机上由于不是所有的浏览器都支持XML和XSL,因此把XML文档转换成HTML文档的一种解决方法方案是在服务机上进行。
【例22.11】 将例22.9-2所示的XML文档保存为mycatalog.xml文件,将例22.9-3所示的XSL文档保存为mycatalog.xsl文件。在服务器上把XML文档转换为HTML文档的一个参考代码如下,
<%
'Load XML
set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("mycatalog.xml"))
'Load XSL
set xsl = Server.CreateObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load(Server.MapPath("mycatalog.xsl"))
'Transform file
Response.Write(xml.transformNode(xsl))
%>
在源代码中,第一个码块用来创建一个XML分析器的实例,然后把XML文档装载到内存。第二个码块用于创建分析器的另一个实例,然后把XSL文档装载到内存。最后一行代码是使用XSL文档对XML文档进行转换,然后把结果返回给浏览器。
将该文档保存为mycatalog.asp文件。如果条件允许,可把mycatalog.asp,mycatalog.xml和mycatalog.xsl三个文件放在服务器上,然后用IE 6.0试试看能否显示正确的结果。
22.7 XML与DTD
22.7.1 DTD介绍在SGML中,文档类型定义(DTD)是描述SGML文档内容的一种语言。在XML中,DTD用来定义XML文档的构造块,说明XML数据如何组织。DTD规范是XML规范中的 一部分,而不是一个独立的实体。DTD是一种选择性的规范,XML文档可以不用它。
DTD指定了可以包括在XML文档中的许多标签,以及这些标签之间的关系。它可以用来确认XML文档结构的有效性。然而,要对一个复杂文档指定一种DTD是很困难的事情。DTD是第一个但不是最终一个用来指定有效文档结构的一种方法。因此,提出了许多比DTD更加灵活的模板(schema),目的是企图取代DTD。
一个DTD文件可以嵌入到XML文档,也可以作为一个单独的外部文件,通过外部引用嵌入到XML文档。
22.7.2 内部DTD
如果DTD要包含在XML源文档中,就要把它包在内部文档类型(internal DOCTYPE)定义中。把DTD包装在DOCTYPE定义中的语法如下,
<!DOCTYPE root-element [element-declarations]>
【例22.12-1】 使用内部型DTD声明的XML文档如下,
1:<?xml version="1.0"?>
2,<!DOCTYPE note [
3,<!ELEMENT note (to,from,heading,body)>
4,<!ELEMENT to (#PCDATA)>
5,<!ELEMENT from (#PCDATA)>
6,<!ELEMENT heading (#PCDATA)>
7,<!ELEMENT body (#PCDATA)>
8,]>
9,<note>
10,<to>Lucy</to>
11,<from>Lin</from>
12,<heading>Reminder</heading>
13,<body>Don't forget me this weekend</body>
14:</note>
其中,
第2行:!DOCTYPE note定义该文档是一个note文档。
第3行:!ELEMENT note定义note元素有4个元素,即to,from,heading,body。
第4行:!ELEMENT to定义to元素为“#PCDATA”型元素。
第5~7行:定义其他元素为“#PCDATA”型元素。
PCDATA(分析字符数据)是parsed character data的简写。分析字符数据可想象为XML文档元素的开始标签和结束标签之间的文本。PCDATA是由XML分析器(XML parser)使用XML语法进行解释的一种文本。在文本内部的标签将作为标记来处理,并对实体参考符进行扩展。
此外,还有一个常见的标签是CDATA(字符数据),是character data的简写。CDATA是一个预先定义的XML标签,用于告诉XML分析器对它的文本不进行解释,对文本内部的标签不作为标记来处理,对其中的实体参考符也不进行扩展。例如,
<![CDATA[ <slide>...A sample slide...</slide> ]]>
显示为,
<slide>...A sample slide..,</slide>
22.7.3 外部DTD
如果DTD不包含在XML源文档中,就要用外部型文档(external DOCTYPE )声明。把DTD包含在DOCTYPE定义中的语法如下,
<!DOCTYPE root-element SYSTEM "filename">
【例22.12-2】 一个使用外部型DTD声明的XML文档如下所示,
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
DTD的note.dtd文件如下所示,
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
使用DTD的好处是,每一个XML文档可以携带它自己的格式声明,这样一来,不同团体就可使用共同的DTD来交换数据,应用程序也可以使用一个标准的DTD来校验从外部世界接收到的数据是否有效,同样也可校验自己的数据是否有效。
22.8 XML名称空间
XML名称空间(Namespaces)是给DTD定义的元素名称指定唯一标签的一种标准。它提供了一种方法,使得用DTD定义的文档可包含在任何其他文档中,以避免元素名称之间发生冲突。
22.8.1,名称冲突问题在XML文档中,由于元素名称不是固定的,当两个不同文档使用相同的名称描述不同的元素类型时,往往产生名称上的冲突。
【例22.13-1】 一个XML文档在table元素中有如下的信息,
<table>
<tr>
<td>苹果</td>
<td>香蕉</td>
</tr>
</table>
【例22.13-2】 一个XML文档在table元素中有如下信息,
<table>
<name>饭桌</name>
<length>120公分</length>
<width>80公分</width>
</table>
这两个XML文档都包含table元素,如果把它们放在一起,两个名称相同但含义和定义不同的元素就会发生冲突。
现在,解决名称冲突的方法是在元素的开始标签中加前缀,再添加xmlns用来表示元素的属性。例如,例22.13-1的元素可使用如下所示的标签,
<h:table xmlns:h="http://www.w3.org/TR/html4/">
……
</h:table>
例22.13-2的元素可使用如下所示的标签,
<f:table xmlns:f="http://www.w3schools.com/furniture">
……
</f:table>
22.8.2,名称空间的属性名称空间属性放在元素的开始标签中,它使用如下的语法,
xmlns:namespace-prefix="namespace"
W3C名称空间规范指出,名称空间本身应该是一个统一资源标识符(Uniform Resource Identifier,URI)。URI是识别因特网资源(如文件)的一串字符。统一资源标识符包括统一资源名(Uniform Resource Names,URN)和统一资源地址(Uniform Resource Locators,URL)。在大多数情况下,使用URL标识名称空间的属性,因为它是唯一的。例如,
xmlns:h="http://www.w3.org/TR/html4/
由于名称空间定义在开始标签中,因此具有相同前缀的所有子元素都与相同的名称空间相关联。
22.8.3,默认的名称空间定义元素的默认名称空间可免去在所有子元素中都使用前缀。使用默认名称空间的语法如下,
<element xmlns="namespace">
例22.13-1和例22.13-2使用的默认名称空间代码分别为,
<table xmlns="http://www.w3.org/TR/html4/">
……
</table>
和
<table xmlns="http://www.w3schools.com/furniture">
……
</table>
22.9 XML模板语言
XML模板是定义文档内容的一种语言,用于描述XML文档的结构。XML模板语言也称为XML模板定义(XML Schema Definition,XSD)。不像DTD,XML模板是使用XML语法写成的,虽然它显得有点冗长,但可以使用任何XML工具创建。XML模板最初是微软公司提出的,在2001年5月成为W3C正式的推荐标准。
22.9.1 XML模板的目标开发XML模板语言的目的是定义XML文档的合法构造块。它定义的内容包括:
文档中出现的元素。
文档中出现的属性。
哪些元素是子元素。
子元素的次序。
子元素的数目。
空元素或可包含文本的元素。
元素和属性的数据类型。
元素和属性的默认值和固定值。
由于XML模板是用XML开发的,并且是一种可扩展的语言,它支持名称空间和多种数据类型,比DTD更丰富和更有用。因此,在大多数Web应用中XML模板比DTD更受重视,也可能取代DTD。
22.9.2 XML文档与XML模板
XML文档可引用DTD或XML模板。在说明如何引用DTD或XML模板之前,先介绍一个具体的XML模板[9]。
1,XML文档引用模板为更好地理解XML模板的概念,先回顾XML文档和DTD文档的实例。
【例22.14-1】 重写例22.5的XML文档,并保存为note.xml文件。
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
【例22.14-2】 将例22.12-2中定义XML文档的DTD部分保存为note.dtd,
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
行1定义note元素有有4各元素:to,from,heading,body;行2~5定义元素的类型为#PCDATA。
【例22.14-3】 为描述XML模板语言,以描述note.xml的模板为例,并将它保存为note.xsd,
<?xml version="1.0"?>
<xsd:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="to" type="xsd:string"/>
<xsd:element name="from" type="xsd:string"/>
<xsd:element name="heading" type="xsd:string"/>
<xsd:element name="body" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
注释1:
<?xml version="1.0"?>
<xsd:schema>
...
</xsd:schema>
表示用xsd:作前缀的<xsd:schema>元素是一个XML模板。
注释2:根元素可包含属性,
<xsd:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
……
</xsd:schema>
其中,
xmlns:xs="http://www.w3.org/2001/XMLSchema"
用于识别该文档是XML模板语言,表示在这个模板 (note.xsd)中使用的元素和数据类型(如schema,element,complexType,sequence,string,boolean等)来自"http://www.w3.org/2001/XMLSchema"的名称空间。
注释3:
targetNamespace="http://www.w3schools.com"
表示由这个模板(note.xsd)定义的元素(note,to,from,heading,body)要加入到
http://www.w3schools.com这个名称空间。
注释4:
xmlns="http://www.w3schools.com"
表示默认的目标名称空间(targetNamespace)是http://www.w3schools.com。
注释5:
elementFormDefault="qualified"
告诉这个模板声明的实例文档所使用的任何元素必需是合格的(qualified)。
注释6:
<xsd:element name="note">
……
</xsd:element>
表示这是note元素。由于note元素包含其他元素,因此把它称为具有复杂类型(complex
type)的元素,其中的to,from,heading,body元素因为没有包含其他元素,因此称为简单类型(simple types)元素。
2,XML文档引用DTD
【例22.14-4】 note.xml 文档引用DTD的文档如下,
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://www.w3schools.com/dtd/note.dtd">
<note>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
这个例子与例22.12-2不同地方是,note.dtd所在的地址不是在本机,而使用URL:
"http://www.w3schools.com/dtd/note.dtd">
3,XML文档引用XML模板
【例22.14-5】 下例表示note.xml文档如何引用XML模板
<?xml version="1.0"?>
<note xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
其中,
xmlns="http://www.w3schools.com"
表示使用默认的名称空间声明,告诉模板有效器(schema-validator):在这个实例文档中的所有元素来自http://www.w3schools.com;
xsi:schemaLocation="http://www.w3schools.com note.xsd"
用于schemaLocation告诉模板有效器,http://www.w3schools.com名称空间是由note.xsd模板定义的;
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
用于告诉模板有效器:使用的schemaLocation属性是XML模板实例(XMLSchema-instance)名称空间中的一个。
22.9.3 简单型元素的概念只含文本的一种XML元素叫做简单类型(XML)元素,它不允许包含其他元素和属性。但“只含文本”这个限制非常容易被人误解。文本可以有不同的类型,它可以是包含在XML模板定义中的类型之一(如boolean,string或date等),它也可以包含客户自己定义的类型。此外,还可以对数据类似添加限制以限定其内容。
定义简单型元素的语法如下,
<xsd:element name="xxx" type="yyy"/>
其中,xxx是元素名称,yyy是元素的数据类型。例如,
<lastname>Chen</lastname>
<age>28</age>
<dateborn>1973-07-07</dateborn>
可定义为,
<xsd:element name="lastname" type="xsd:string"/>
<xsd:element name="age" type="xsd:integer"/>
<xsd:element name="dateborn" type="xsd:date"/>
XML模板有许多内置的数据类型。其中,最普通的模板数据类型为:xsd:string,xsd:decimal,xsd:integer,xsd:boolean,xsd:date,xsd:time。
简单型元素可设置默认值或固定值。设置默认值的语法如下例所示,
<xsd:element name="color" type="xsd:string" default="red"/>
设置固定值的语法如下例所示,
<xsd:element name="color" type="xsd:string" fixed="red"/>
22.9.4 复杂型元素的概念包含其他元素和属性的一种XML元素叫做复杂型(XML)元素。复杂型元素包括4种元素:空元素,包含其他元素的元素、只含文本的元素、包含其他元素和文本的元素。每个元素都可以有属性。
例如,表示product元素为空的复杂型XML元素(元素没有任何内容),
<product pid="1345"/>
表示只含其他的元素的复杂型employee元素,
<employee>
<firstname>Dagong</firstname>
<lastname>Lin</lastname>
</employee>
表示只含文本的复杂型food元素,
<food type="dessert">Ice cream</food>
表示包含其他元素和文本的复杂型description元素
<description>
It happened on <date lang="norwegian">03.03.99</date>,...
</description>
练习与思考题
XML的目标是要取代HTML
⑴ 对
⑵ 错用XML可定义多少种不同的数据类型?
说出下面的XML元素由哪几部分组成、各部分的名称和元素的值。
<name>Your Name</name>
属性值必要用双引号
⑴ 对
⑵ 错声明XML版本的正确语法是
⑴ <xml version="1.0" />
⑵ <?xml version="1.0" />
⑶ <?xml version="1.0"?>
XML使用哪些方法描述XML数据
⑴ 使用XSL描述数据。
⑵ 使用DTD描述数据。
⑶ 使用XML Schema描述数据。
下面的陈述哪一个是真的:
⑴ 所有XML文档必需有一个DTD
⑵ 所有XML元素必需是小写字母
⑶ 所有XML元素必需要有结束标签正确引用"mystyle.xsl"的方法是
⑴ <?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>
⑵ <link type="text/xsl" href="mystyle.xsl" />
⑶ <stylesheet type="text/xsl" href="mystyle.xsl" />
仿照例22.9-1、例22.8-2和例22.9-3的代码,用IE 5.0以上浏览器显示下列数据(至少5名学生的数据)。
通讯录学号
姓名
性别
电子邮件
籍贯
参考答案:
22.1.(2),22.2.没有上限,22.4.(2),22.5.(3),22.6.(2)(3),22.7.(3),22.8.(3)
参考文献和站点
W3C Recommendation 6 October 2000,Extensible Markup Language (XML) 1.0 (Second Edition),http://www.w3.org/TR/2000/REC-xml-20001006。
Extensible Markup Language (XML),http://www.w3.org/XML/。
Norwegian Opera浏览器,http://www.opera.com/。
The Extensible Stylesheet Language (XSL),http://www.w3.org/Style/XSL/。
Cascading Style Sheets home page,http://www.w3.org/Style/CSS/。
What's New in the July 2001 Microsoft XML Parser 4.0 Technology Preview,http://msdn.microsoft.com/library/en-us/dnmsxml/html/dnmsxmlnewinjuly.asp
Free Webmaster Help, Tutorials,http://www.freewebmasterhelp.com/tutorials/index.htm。
Roger L,Costello,XML Schema Tutorial,Last updated July 5,2002,http://www.xfront.com/xml-schema.html
Refsnes Data,XML Tutorial,http:// www.w3schools.com/xml/default.asp。
W3C Recommendation,2 May 2001,XML Schema Part 0,Primer,http://www.w3.org/TR/xmlschema-0/。
W3C Recommendation 2 May 2001,XML Schema Part 1,Structures,http://www.w3.org/TR/xmlschema-1/。
W3C Recommendation 02 May 2001,XML Schema Part 2,Datatypes,http://www.w3.org/TR/xmlschema-2/。
W3C Recommendation 27 June 2001,XML Linking Language (XLink) Version 1.0,http://www.w3.org/TR/xlink/。
W3C Last Call Working Draft 8 January 2001,XML Pointer Language (XPointer) Version 1.0,http://www.w3.org/TR/WD-xptr。
可扩展标记语言(Extensible Markup Language,XML)是万维网协会(W3C)推荐的一个开放标准,它是构造Web上的文档和数据的通用格式。XML有着越来越广泛的应用前景。它的应用范围包括数据库系统、搜索引擎、数据编辑器、文档编辑器、Web网页、电子商务、Java、新闻、公共对象请求代理体系结构(Common Object Request Broker Architecture,CORBA)等。
XML是一大技术系列,除了XML 本身之外还涉及很多技术规范,例如,
CSS (cascading style sheets):级联样式语言。
XSL (Extensible Stylesheet Language):可扩展样式语言。
XSLT (XSL Transformation):可扩展的样式语言转换语言。
DTD (Document Type Definition):文档类型定义。
XML Schemas:XML模板语言。
DOM (Document Object Model):文档对象模型。
XLink (XML Linking Language):XML链接语言。
XPointer (XML Pointer Language),XML指针语言。
XPath (XML Path Language):XML路径语言。
WAP (Wireless Application Protocol):无线应用协议。
SOAP (Simple Object Access Protocol):简单对象存取协议。
WSDL (Web Services Description Language):Web服务描述语言。
本章主要介绍XML的基本概念,目的是为进一步学习、应用和开发Web标准打基础。由于标准文件写得很精炼,读懂它需要时间和比较广泛的知识,仅有本章介绍的知识离理解标准还很不够,因此在本章的最后列出了很多非常优秀的参考文献和站点,[7]~[12]尤其适合初学者。在本章介绍的例子中,许多例子都没有使用中文,一方面是笔者用的计算机没有安装更新的应用软件,另一方面是有些执行规范的软件暂时还不支持中文。
22.1 XML是什么
22.1.1 XML不是标记语言标记(markup)是组织和标注文档内容的一套字符集,是写在待排版原稿上的详细的格式说明。用作标记的标签(tag)用于标记元素、实体引用、声明、注释、处理指令和段落的开始与结束。标记语言(markup language)是用于表示和组织数据的一套规则,用标签来编写文本的一种符号。标签用来表示文本的结构,标签有名称和属性,标签还可包含部分的文本。标记语言提供许多构造文档的方法,如使用元素对文档的局部作标记、使用文档类型定义(DTD)来强制文档的结构以及使用实体引用来输入数据。
XML名为标记语言,但它本身不是标记语言,而是用于创建标记语言的一套规则,是一种元语言。所谓元语言是用来描述另一种语言的语言。例如,我们用名词、动词、副词和形容词等来描述自然语言中句子的结构,因此这些词是用于描述一种语言的语言。XML定义的是各种标签以及它们之间关系的一套规则,用来描述数据(或称信息),定义数据是什么样的数据。因此从这个意义上说,XML是用来定义另一种语言的元语言,是一种构造语言和分析语言的语言。
XML使用与HTML类似的标签结构。它们之间主要差别是,HTML定义如何显示文档元素,而XML定义包含什么文档元素;HTML使用预先定义的标签,而XML允许网页开发人员定义自己的标签。
把XML看成标记语言是一种误解,认为XML要取代HTML也是一种误解。实际上,HTML已经在努力用XML格式重写,重写后的HTML认为是下一代的标记语言,叫做XHTML(可扩展超文本标记语言)。也许XML不会用来创作未来的网页,但XHTML将肩负这个重任。
22.1.2 XML文档什么样认识XML文档并不难,首先让我们看一个简单的例子。
【例22.1】 一个简单的XML文档:
1: <?xml version="1.0"?>
2, <!--一个简单的XML文档-->
3, <message>
4, <to>Student</to>
5, <from>Teacher</from>
6, <subject>Introduction to XML</subject>
7, <body>Welcome to XML!</body>
8,</message>
在这个例子中,XML文档由下面三个部分组成:
⑴ XML声明(第1行):说明使用的XML版本号。这是XML文档最先要声明的。
⑵ 文档注释(第2行):说明该文档是“一个简单的XML文档”
⑶ 文档元素(第3~8行):这些是XML文档的基本的构造块。其中,<message>…</message>是“大”元素,message元素中还包含像to,form,subject和 body这样的“小元素”。
22.2 XML元素
22.2.1 什么是XML元素
XML元素是由一对标签界定的一个数据单位。标签由尖括号(< >)和包含在尖括号里的含有意义的文字组成,因此它是一种有语义的标签。一个XML元素由开始标签、结束标签和它们之间的数据组成。开始标签和结束标签用来描述它们之间的数据,并把数据作为这个元素的值。例如,一个名为doctor的XML元素,
<doctor>Jiamin Li</doctor>
其中,“Jiamin Li”是XML数据,也称doctor元素的值。<doctor>是开始标签,而</doctor>是结束标签。
给元素赋予有含义的名称是值得重视的事情,这样就容易区别数据相同而标签不同的元素。在我们的日常生活中,也有许多类似的情况。例如,有一个教师的姓名也叫做“Jianmin Li”,我们就可以用<teacher>标签来表示,
<teacher>Jiamin Li</teacher>
这样就从语义上给具有相同姓名的人做了标记,一个是“doctor”,另一个是“teacher”。
在XML标签内,字母的大小写是有区别的。例如,
<internet>,<Internet>,<INTERNET>
是三个不同的标签。
XML元素可以嵌入到其他的元素中。例如,
<slideshow>
<slide> My Name</slide>
<slide>My topic</slide>
</slideshow>
其中,slideshow元素包含两个slide元素。
22.2.2 XML元素的命名规则
XML元素的名称必需遵照如下的命名规则:
⑴ 名称可以包含字母、数字和其他字符。
⑵ 名称不能用数字或标点符号开始。
⑶ 名称不能用xml,XML或Xml文字开始。
⑷ 名称不能包含空格。
在对XML元素命名时,还须要注意:
⑴ 可以使用任何名称,没有保留字。但希望起的名称要有一定的含义,与说明的内容比较贴近;多个词组成的名称最好用下划线“_”隔开,如<first_name>,<last_name>,避免使用“-”和“.”。
⑵ 名称的长度没有具体限制,但希望赋予的名称短一点,简单一点,不要太长。例如,书(book)元素名称使用<book_title>,而不使用<the_title_of_the_book>。
⑶ XML元素的名称允许非英文字符,但需要注意应用软件是否支持非英文字符集。
⑷ 冒号“:”是保留符号,在XML元素名称中不允许使用。
22.2.3 XML元素的特性
XML元素具有可扩展性、父子关系、一个元素可包含不同内容和一个元素可包含不同属性等四种特性。
1,可扩展性
XML元素可以扩展,使XML文档包含更多的信息。
【例22.2】 一个XML note文档为,
<note>
<to>Lucy</to>
<from>Lin</from>
<body>Don't forget me this weekend!</body>
</note>
在这个文档中,可把日期信息(如<date>2002-07-15</date>)添加进去,如下所示,
<note>
<date>2002-07-15</date>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
2,父子关系
XML元素具有“父子”关系。为便于理解XML元素之间的关系,先举例说明XML元素如何命名和描述元素的内容。
【例22.3】 用XML描述一本书的前两章:
Book Title,Multimedia Fundamentals
Chapter 1,Introduction to Multimedia
What is Multimedia
What is Web
Chapter 2,Color Space
What is Color Space
Color Space Conversion
用XML描述这本书时,其文档如下所示:
<book>
<title> Multimedia Fundamentals </title>
<prod isbn="7-302-03933" media="paper"></prod>
<chapter> Introduction to Multimedia
<para> What is Multimedia </para>
<para> What is Web </para>
</chapter>
<chapter> Color Space
<para> What is Color Space </para>
<para> Color Space Conversion </para>
</chapter>
</book>
其中,book是根元素。title,prod和chapter都是book元素的子元素,book是title,prod和chapter的父元素。title,prod和chapter是姐妹元素,因为它们的父母亲是相同的。
3,一个元素可包含不同内容一个XML元素可以有不同类型的内容。其内容可以是元素内容、混合内容、简单内容复杂内容或无内容。例如,例22.3中的book元素含有元素内容,因为它包含其他元素;chapter元素含有混合内容,因为它包含文本和其他元素;para含有简单内容,因为它仅包含文字;prod包含的内容是空的,因为isbn和media是元素的属性,不是元素的内容。
4,一个元素可包含不同属性一个XML元素可以包含不同类型的属性。例如,例22.3中的prod元素有isbn和media两种不同类型的属性,而且都有值。属性名为isbn的属性值为7-302-03933,属性名为media的属性值为paper。22.2.4节将对属性作更多的介绍。
22.2.4 XML元素的属性属性是XML标签的一个修饰词,用来提供元素的附加信息。属性用属性名、等号和属性值表示。例如,<book>标签的属性,
<book isbn = "7-302-03933">
<--! 属性名 = "属性值" -->
XML元素的属性有如下几个特性。
1,属性只能指定一次一个XML元素可包含一个或多个属性,但每个属性值只能指定一次,其次序不分先后。例如,一个slide元素如下所示,
<slide title="XML Tutorial">
在这个标签中,title="XML Tutorial"是属性。其中,title是属性名,XML Tutorial是属性值。在一个文档中,title的属性值只能是"XML Tutorial"。
2,属性不是元素数据一个元素的属性不是元素数据的一部分,而是说明数据的。例如,
<file type="jpg">Ronaldo.jpg</file>
在这个XML元素中,标签中的type属性是与Ronaldo.jpg数据无关的,但对处理这个元素的软件来说是重要的。
3,属性值要用引号属性值必需要用引号表示。表示属性值的引号可以是单引号,也可以是双引号。例如,一个人的性别标签可以写成,
<person sex="female">
或者
<person sex='female'>
最常用的是双引号,但有时(如属性值本身包含引号的情况下)必需使用单引号。
4,属性可存放数据
XML元素的数据可以存储在子元素中,也可存储在属性中。
【例22.4-1】 假设female是数据,它可存储在属性中。
<person sex="female">
<first_name>Lucy</first_name>
<last_name>Zhao</last_name>
</person>
【例22.4-2】 假设female是数据,它可存储在子元素中。
<person>
<sex>female</sex>
<first_name>Lucy</first_name>
<last_name>Zhao</last_name>
</person>
例22.4-1和例22.4-2都提供相同的信息。至于什么时候使用属性存储数据,什么时候使用子元素存储数据,还没有看到有规则可循。如果感到信息像一种数据(如罗纳尔多助巴西第五次捧世界杯),则通常使用子元素。仅当提供的信息与数据无关的情况下,才考虑用属性。这是因为属性不能包含多个值,而子元素则可以;属性不能描述结构,而子元素则可以;处理程序处理属性相对于处理子元素比较困难等因素。总而言之,关于数据的数据,称为元数据(metadata),应该存储在属性中,而数据本身则应该存储在子元素中。
22.3 XML文档和语法
22.3.1 XML文档的基本结构一个基本的XML文档就是一个XML元素,其嵌套XML元素可有可无。XML文档使用文档类型定义(DTD)或者XML模式(XML Schema)来描述数据。使用DTD或者XML Schema的XML文档叫做自描述文档,XML文档的文件扩展名用.xml表示。
【例22.5】 下面是一个使用自描述的XML文档:
1:<?xml version="1.0" encoding="ISO-8859-1"?>
2:<note>
3,<to>Lucy</to>
4,<from>Lin</from>
5,<heading>Reminder</heading>
6,<body>Don't forget me this weekend!</body>
7:</note>
第1行是XML声明(XML declaration),
<?xml version="1.0" encoding="ISO-8859-1"?>
用来说明XML的版本号和在文档中使用的字符编码。在这个XML文档中,说明该文档使用XML 1.0规范和ISO-8859-1(拉丁文-1/西欧)字符集。
第2行描述文档的根元素(root element),
<note>
其含义为“这是一个备忘录”。
第3~6行描述根元素(note)的4个子元素(child element)为to(送给)、from(来自),heading(标题)和body(主体),
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
第7行表示根元素结束,
</note>
22.3.2 XML语法
XML文档是一个自描述的文档。通过分析例22.5,我们可以看到XML的一些基本语法规则。
⑴ 在XML文档中,所有XML元素必需要使用一个开始标签(或称打开标签)和一个结束标签(或称关闭标签)。在本教材中,这一对标签称为开闭标签。例如,
<p>这是一个段</p>
<p>这是另外一段</p>?
而在HTML文档中,不一定要使用开闭标签。例如,
<p>这是一个段
<p>这是另外一段注意:在例22.5中,第一行的XML声明没有使用开闭标签,即
<?xml version="1.0" encoding="ISO-8859-1"?>
这是因为XML声明不是XML元素,它不是XML文档本身的一部分,因此不应该有开闭标签。
⑵ 在XML文档中,XML标签区分字母的大小。例如,Message和message是不同的,因此<Message>标签和<message>标签是两个不同的标签。
⑶ 在XML文档中,开始标签和结束标签必需是相同的。如果开标签使用<Message>,则闭标签也要使用</Message>。例如,
<Message>这是错误的标签对</message>
<message>这是正确的标签对</message>
⑷ 在XML文档中,所有XML元素必需正确嵌套。例如,
<p><b>这段用加粗的宋体</b></p>
而在HTML文档中,HTML元素没有正确嵌套也未尝不可。例如,
<p><b>这段用加粗的宋体</p></b>
⑸ 在XML文档中,第一个标签和最后一个标签叫做根标签(root tag)。所有XML文档必需要有一对开闭根标签,其他的元素必需嵌套在这对根标签内。
<root>
<child>
<subchild>.....</subchild>
</child>
</root>
⑹ 在XML文档中,XML元素可以有属性值,但必需使用双引号(" "),就像HTML中的文档一样。例如,
<?xml version="1.0" encoding="ISO-8859-1"?>
<note date="7/7/2002">
……
</note>
date是note的属性,属性值为"7/7/2002"。
⑺ 在XML文档中,空格是保留的。
⑻ 在XML文档中,CR / LF字符只存储LF字符。在过去,新行字符包括回车(carriage return,CR)和换行(line feed,LF)两个字符。在Windows环境下,文本中的新行字符存储CR和LF两个字符;在UNIX环境下,文本中的新行字符只存储LF字符。
⑼ 在XML文档中,使用与HTML文档中类似的注释。例如,
<!--这是一个注释-->
注释行的开始部分由4个字符组成:<!--,结束部分由3个字符组成:-->。在它们之间可以包含任何种类的文字。
22.4 XML文档类型
XML.10规范指定了两种类型的文档,一种叫做合格XML文档(Well-Formed XML document),另一种叫做有效XML文档(Valid XML document)。
22.4.1 什么是合格XML文档一个严格遵照XML语法规则构造的文档叫做合格XML文档。XML语法规则在22.3.2中作了介绍,详细的规则可在万维网协会(W3C)推荐的XML 1.0标准中找到[1]。
下面所示的文档是一个合格XML文档。
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
HTML的规则比较松散,这就迫使Web浏览器要补充许多丢失的说明。XML则很严谨,一个合格XML文档必需符合下列XML文档结构规则:
⑴ 每个元素必需有开始标签和结束标签。
⑵ 文档必需有一个包含所有其他元素的根元素。
⑶ 标签必需正确嵌套。
一个合格XML文档不要求一定要用文档类型定义(DTD)或XML模式(XML schema),它们将分别在22.7和22.9中介绍。由于合格XML文档不需要附加的DTD,因此它比较容易创建,在网上传输时也不需要下载DTD文件。
22.4.2 什么是有效XML文档有效XML文档(“Valid”XML document)是遵照XML语法规则和文档类型定义(DTD)规则构造的一种文档。有效XML文档是一种合格XML文档。
【例22.6】 一个遵照XML和DTD规则编写的有效文档如下,
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "InternalNote.dtd">
<note>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
其中,DOCTYPE是Document Type Declaration的简写,不同于DTD。一个序言(prolog)通常包含一个这种形式的语句:
<!DOCTYPE foo SYSTEM "foo.dtd">
其中,foo叫做占位符,在实际的语句中用真实的名称。
22.5 XML与Web浏览器
22.5.1 XML Web浏览器最近几年大家用得比较多的Internet Explorer 5.0 (IE 5.0)以上版本和Netscape Navigator 6.0以上版本都支持XML 1.0和XML DOM标准。以IE 5.0为例,它可支持的功能包括:
⑴ 显示XML文档。
⑵ 支持W3C DTD标准。
⑶ 作为数据岛嵌入在HTML中的XML文档。
⑷ 把XML数据捆绑到HTML元素。
⑸ 用XSL转换和显示XML文档(见22.6)。
⑹ 用CSS显示XML文档(见22.6)。
⑺ 访问XML DOM(见22.6.6)。
此外,挪威Opera浏览器是Norwegian Opera Software公司开发的一种Web浏览器[3],是继Netscape Navigator和Internet Explorer之后的浏览器。它一直在扩展对W3C标准的支持能力。Opera因其速度快、软件小巧和对标准的兼容性好而得到终端用户和出版工业界的广泛赞扬。
22.5.2 XML文档显示
Internet Explorer 5.0以上版本可以显示原始XML文档。如果要像HTML格式那样显示XML文档中的数据,则需要用其他代码(如JavaScript)输入XML文档的数据才能显示。
1,在浏览器中显示XML文档在浏览器中显示XML文档,只要在它的地址栏中输入文档的URL就可以。如果XML文档在本机上,点击XML文档名就可以调用浏览器来显示。
【例22.7-1】 将下面的XML文档
<?xml version="1.0" encoding="ISO8859-1"?>
<note>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
保存到C:\temp目录下,文件名用note.xml。因笔者的计算机上安装的浏览器是IE 6.0,用IE 6.0显示时,显示的样式如图22-1(a)所示。
(a) IE 6.0浏览器上显示的note.xml (b) 记事本器上显示的note.xml
图22-1原始XML文档的显示在图22-1(a)中,根元素和子元素的标签都用颜色作标记。<note>左边有一个减号(-),点击它就隐藏标签note元素内的代码,而减号也就会变成加号(+)。如果要查看原始XML文档的源文件,则需要点击IE浏览器上的“查看(V)”,然后点击下跌选单上的“源文件(C)”,调出文件编辑器(如记事本)就可看到原始XML文档的源文件,如图22-1(b)所示。
2,用JavaScript显示XML文档数据要在当前的Web浏览器上显示XML文档的数据,可用JavaScript从XML文档中输入数据。
【例22.7-2】 用JavaScript输入XML文档数据的HTML文档如下,
<html>
<head>
<script language="JavaScript"
for="window" event="onload">
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("note.xml")
nodes = xmlDoc.documentElement.childNodes
to.innerText = nodes.item(0).text
from.innerText = nodes.item(1).text
header.innerText = nodes.item(2).text
body.innerText = nodes.item(3).text
</script>
<title>Displaying XML data inside HTML page</title>
</head>
<body bgcolor="#C4FFE6">
<h1 align="center"><font size="4">试用Web浏览器显示XML文档<br>
(2002年7月10日)</font></h1>
<hr>
<p><b>收件人,</b><span id="to"></span><br>
<b>发件人,</b><span id="from"></span> <br>
<b>主标题,</b><span id="header"></span> <br></p>
<p> <b>内 容,</b><span id="body"></span> </p>
</body>
</html>
将这个文档存储到将这个文档存储到C:\temp目录下,使用的文件名为note.htm。用IE 6.0显示时,显示的样式如图22-2所示。
图22-2 浏览器上显示的note.htm
22.5.3 XML数据岛
XML数据岛(XML data island)是在HTML文档中存在的一种XML文档,它无须通过脚本(script)或<OBJECT>标签创建,只要对照XML文档就可以进行编写。任何可以用合格XML文档表示的东西都可以是在一个数据岛内。数据岛用<xml>作为标签,用id属性提供引用的数据岛名称。
【例22.8-1】 在下面所示的文档中,第2~8行构成一个数据岛。其中,第2行和第8行是数据岛的标签。
<?xml version="1.0" encoding="ISO-8859-1"?>
<xml id="mybooks">
<title>Multimedia Fundamentals</title>
<author>Lin Dagong</author>
<country>China</country>
<company>Qinghua</company>
<price>39.90</price>
<year>2002.9</year>
</xml>
将这个数据岛加上第1行的XML声明保存在c:\temp的文件夹中,文件名可用dataisland.xml。
【例22.8-2】 编写一个HTML文档,将这个数据岛加入到HTML文档中,
<html>
<head>
<title>数据岛的概念</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<xml id="mybooks" src="dataisland.xml"></xml>
<table border="1" datasrc="#mybooks">
<tr>
<td><span datafld="author"></span></td>
<td><span datafld="title"></span></td>
<td><span datafld="price"></span></td>
<td><span datafld="year"></span></td>
</tr>
</table>
将这个文档保存在c:\temp的文件夹中,文件名可用dataisland.htm,用IE 6.0中看到的文档如图22-3所示。
图22-3 使用IE 6.0显示的dataisland.htm文件
22.6 XML与XSL
可扩展样式语言(Extensible Stylesheet Language,XSL)是万维网协会(W3C)于2001年10月推荐的一个标准,用于表示文档样式的一种语言。XSL由XSLT,XPath和XSL Formatting Objects组成。它可以把XML转换成HTML,可以对XML数据进行过滤和分类,可以定义XML文档的部件,可以根据数据值编排XML数据的格式,等等。
本节将学习什么是XSL,以及如何使用XSL把XML文档转换成HTML文档。
22.6.1 HTML样式与CSS
级联样式语言(cascading style sheets,CSS)是由万维网协会(W3C)为基于Web的样式表签署的第一个规范[5]。版本CSS 1.0提供了数百个可下载的版面设置,这些设置可应用到各种各样的HTML文档。版本CSS 2.0和CSS3.0还可支持XML等功能。该规范允许HTML文档作者和用户把HTML样式表(如网页如何显示、网页上文本字体等样式表)附加到HTML文档上。该规范也可指导HTML文件与用户的样式表进行混合。
由于HTML使用预先定义的标签,这些标签的含义很好理解。例如p元素定义一个段落,h1元素定义一级标题,因此浏览器就知道如何显示它们。使用CSS把新的样式添加到HTML元素也并不困难,告诉浏览器用什么字体和颜色显示每个元素也容易做到,浏览器也不难理解。但用CSS来格式XML文档似乎不是Web网页的未来。
22.6.2 XML样式与XSL
由于XML不使用预先定义的标签,它允许使用任何标签,因此标签的意义就不好理解。例如<table>标签可以表示HTML的表格、办公室或家里的桌子或者其他东西。因此,目前的浏览器就不知道如何显示XML文档,这就必需要给XML文档添点东西来描述文档如何显示,这个东西就是可扩展样式语言(XSL)。XSL是为XML文档制定样式的一种语言,它由下列三个部分组成:
⑴ XSLT:转换XML文档的一种语言。
⑵ XPath:定义XML文档部件的一种语言
⑶ XSL Formatting Objects:格式XML文档的词汇
XSLT (XSL Transformation)是一种可扩展的样式语言转换语言,是XSL标准中最重要的组成部分。XSLT用于把XML文档转换成另一种XML文档,或者转换成浏览器能够识别的文档。例如,使用XSLT把XML元素转换成HTML元素,使用XSLT把XML文档转换成XHTML文档,以便用Web浏览器来显示文档。XSLT也可把新的元素添加到输出文件,或者删除元素。它还可以对元素进行分类、测试和判断什么元素要显示等。
描述转换过程的行话是XSL使用XSLT把XML源树(source tree)转换成XML结果树(result tree)。在转换过程中,XSLT使用XPath定义源文档中与预先定义的模板相匹配的部分,然后把相匹配的部分转换成结果文档(result document)。源文档中与模板不匹配的部分将保留在结果文档中。
22.6.3 XSL浏览器微软公司开发了多种版本的XML分析器,用来支持XSL语言。其中,MSXML Parser 2.0是与IE 5.0一起发行的XML分析器;MSXML Parser 2.5 是与Windows 2000和IE 5.5一起发行的XML 分析器;XML Parser 3.0是与IE 6.0和Windows XP 一起发行的XML分析器。MSXML 4.0是2001年7月发布的XML分析器[7]。
XML Parser 4.0是根据W3C XSLT 1.0和W3C XPath 1.0标准开发的,支持最终的W3C XML Schema (XSD)标准,并支持基于SAX (Simple API for XML)(事实上的标准)的连续的XML处理体系结构。
22.6.4 用XSLT显示XML文档下面将举例说明如何使用XSLT把XML文档转换成HTML文档。在举例说明过程中,凡是用应用程序(如字处理器,Dreamweaver,HTML编辑器等)创建的任何东西(如文章、源程序等)都叫做文档(document),把创建的这些东西保存到盘上时,则赋予它一个能被检索的唯一的文件名,通常叫做某某文件(file)。在下面的例子中,使用应用程序创建的XSL文档用的文件名为mycatalog.xsl,使用应用程序创建的XML文档用的文件名为mycatalog.xml。
1,XSL样式声明声明XSL样式的根元素是<xsl:stylesheet>或<xsl:transform>。按照W3C XSL推荐标准,目前声明XSL样式的方法如下,
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
或
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
其中,
⑴ <xsl:stylesheet>和<xsl:transform>是同义词,用那一个都可以。
⑵ xmlns:xsl=http://www.w3.org/1999/XSL/Transform表示使用W3C XSL推荐标准的名称空间(见22.8)。如果要使用该名称空间,就要包含version="1.0"属性;如果使用IE 6.0或Netscape Navigator 6.0就要使用上述声明方法中的一种。
2,编写XML文档
【例22.9-1】 假设已经编写了一个合格XML文档,
<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
<book>
<title>Multimedia Fundamentals</title>
<author>Lin Dagong</author>
<country>China</country>
<company>Qinghua</company>
<price>39.90</price>
<year>2002.9</year>
</book>
…
</catalog>
然后把它存放在c:\temp文件夹下,文件名为mycatalog.xml。
3,创建XSL样式
【例22.9-2】 使用转换模板创建XSL样式。假设已经编写了一个如下所示的XSL样式,
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h3 align="left">My Books</h3>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left" bgcolor="#66FFFF">Book Title</th>
<th align="left" bgcolor="#66FFFF">Author</th>
<th align="left" bgcolor="#66FFFF">Country</th>
<th align="left" bgcolor="#66FFFF">company</th>
<th align="left" bgcolor="#66FFFF">Price</th>
<th align="left" bgcolor="#66FFFF">Year</th>
</tr>
<xsl:for-each select="catalog/book">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="author"/></td>
<td><xsl:value-of select="country"/></td>
<td><xsl:value-of select="company"/></td>
<td><xsl:value-of select="price"/></td>
<td><xsl:value-of select="year"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
然后把它存放在c:\temp文件夹下,文件名为mycatalog.xsl。
4,把XSL样式链接到XML文档
【例22.9-3】 把引用XSL样式的代码添加到XML文档,
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="mycatalog.xsl"?>
<catalog>
<book>
<title>Multimedia Fundamentals</title>
<author>Lin Dagong</author>
<country>China</country>
<company>Qinghua</company>
<price>39.90</price>
<year>2002.9</year>
</book>
<book>
<title>Multimedia and CD-ROM</title>
<author>Dagong Lin </author>
<country>China</country>
<company>Qinghua</company>
<price>25.90</price>
<year>1995.3</year>
</book>
<book>
<title>Multimedia Dictionary</title>
<author>Zhang Linyou </author>
<country>China</country>
<company>Qinghua</company>
<price>59.90</price>
<year>2002.12</year>
</book>
</catalog>
然后把它存放在c:\temp文件夹下,覆盖原来保存的mycatalog.xml。
5,在浏览器上显示XML文档使用支持XSL语言的浏览器,就可把XML文档转换成HTML文档。IE 6.0是支持XSL语言的一种浏览器,打开在c:\temp文件夹下名为mycatalog.xml的文件,就可以看到XML文档,如图22-4所示。
图22-4 使用IE 6.0显示的mycatalog.xml文件
22.6.5 XSL元素
1,XSL <xsl:template>模板元素一个XSL样式由一套规则组成,它们被称为模板。一个<xsl:template>模板元素包含用于匹配节点的规则。使用match(匹配)属性把模板与XML元素发生联系。match属性也可以用来为XML文档中的一个完整部分定义模板,而match="/"则定义整个文档。
例如,例22.9-2所示的XSL样式,
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
……
</body>
</html>
</xsl:template>
</xsl:stylesheet>
第1行,文档开始使用xml声明,表示它是一个XML 1.0文档,文档的字符编码标准是ISO-8859-1。
第2行,元素<xsl:stylesheet>表示样式定义从这里开始。
第3行,元素<xsl:template> 表示模板定义从这里开始。match="/" 表示把模板与XML源文档的根元素相关联。
除了最后两行用来定义模板结束和样式结束之外,文档的其余部分是它本身的模板。
2,XSL <xsl:value-of> 元素
XSL <xsl:value-of>元素使用其中的select属性来选择XML元素的值,然后把它添加到输出流中。在例9-2中,选择属性值为"title"和"year"的代码如下,
<xsl:for-each select="catalog/book">
<tr>
<td><xsl:value-of select="title"/></td>
……
<td><xsl:value-of select="year"/></td>
</tr>
</xsl:for-each>
3,XSL <xsl:for-each> 元素
XSL <xsl:for-each>元素可以在XSL中做循环操作。它可以用来选择指定节点集中的每一个XML元素。在例22.9-2中,它的代码如下,
<xsl:for-each select="catalog/book">
<tr>
<td><xsl:value-of select="title"/></td>
……
<td><xsl:value-of select="year"/></td>
</tr>
</xsl:for-each>
4,过滤输出过滤输出(filtering the output)的含义是,使用XSL对XML数据进行过滤,其方法是把过滤条件添加到<xsl:for-each>中的select属性。合法的过滤操作符为,
⑴ = 等于
⑵ != 不等于
⑶ < 小于
⑷ > 大于例如,要把2002年9月出版的书选出来,可将例22.9-2中的代码
<xsl:for-each select="catalog/book">
改为
<xsl:for-each select="catalog/book[year='2002.9']">
在IE 6.0中显示如下的输出结果:
My Books
Book Title
Author
Country
company
Price
Year
Multimedia Fundamentals
Lin Dagong
China
Qinghua
39.90
2002.9
5,XSL <xsl:sort>元素
XSL <xsl:sort> 元素用来对XML文档的输出进行排序。其方法是在XSL文件中的for-each元素内添加sort元素。例如,在例22.9-2中加入按照author(作者)排序元素的代码如下所示,
<xsl:for-each select="catalog/book">
<xsl:sort select="author"/>
……
</xsl:for-each>
6,XSL<xsl:if> 元素
XSL<xsl:if>元素包含一个模板,当满足指定条件时就使用它。其方法是在XSL文件中添加<xsl:if>即可。例如,在例22.9-2中加入按照author(作者)排序的元素如下,
<xsl:if test="price>'10'">
some output,..
</xsl:if>
其中,test属性的属性值包含评价表达式。例如,在例22.9-2中加入test元素的代码如下所示,
<xsl:for-each select="catalog/book">
<xsl:if test="price<'30'">
<tr>
<td><xsl:value-of select="title"/></td>
……
<td><xsl:value-of select="year"/></td>
</tr>
</xsl:if>
</xsl:for-each>
7,XSL <xsl:choose> 元素
XSL<xsl:choose>元素用于联接<xsl:when>和<xsl:otherwise> 这两个元素,以表示多重条件测试。插入条件选择的方法是把<xsl:choose>,<xsl:when>和<xsl:otherwise>三个元素添加到XSL文件中。插入选择price做test条件的代码如下,
<xsl:choose>
<xsl:when test="price>'30'">
,.,some code,..
</xsl:when> <xsl:otherwise>
,.,some code,...
</xsl:otherwise>
</xsl:choose>
【例22.9-4】 把上面的代码插入到例22.9-2的mycatalog.xsl文件,该文件的完整代码如下,
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h3 align="left">My Books</h3>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left" bgcolor="#66FFFF">Book Title</th>
<th align="left" bgcolor="#66FFFF">Author</th>
<th align="left" bgcolor="#66FFFF">Country</th>
<th align="left" bgcolor="#66FFFF">company</th>
<th align="left" bgcolor="#66FFFF">Price</th>
<th align="left" bgcolor="#66FFFF">Year</th>
</tr>
<xsl:for-each select="catalog/book">
<tr>
<!-- <td><xsl:value-of select="title"/></td> -->
<xsl:choose>
<xsl:when test="price>'30'">
<td bgcolor="#FFFFCC">
<xsl:value-of select="title"/></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="title"/></td>
</xsl:otherwise>
</xsl:choose>
<td><xsl:value-of select="author"/></td>
<td><xsl:value-of select="country"/></td>
<td><xsl:value-of select="company"/></td>
<td><xsl:value-of select="price"/></td>
<td><xsl:value-of select="year"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
在运行以上代码时,如果遇到价格大于30元的书,将在Book Title栏中加淡黄色的底色。在IE 6.0上显示的结果如图22-5所示。
图22-5使用IE 6.0显示使用条件选择的mycatalog.xml文件
8,XSL <xsl:apply-templates> 元素
XSL <xsl:apply-templates>元素把模板规则用到当前的元素或子节点。如果把select属性添加到<xsl:apply-templates>,XSL将仅处理与属性值匹配的子元素。使用select属性可指定处理子节点的顺序。
【例22.9-5】 应用< xsl:apply-templates >元素和select属性,把属性值等于"title"的元素用红色表示,把属性值等于"author"的元素用蓝色表示。实现这些要求可使用如下所示的代码,
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My Books</h2>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="book">
<p>
<xsl:apply-templates select="title"/>
<xsl:apply-templates select="author"/>
</p>
</xsl:template>
<xsl:template match="title">
Title,<span style="color:#ff0000">
<xsl:value-of select="."/></span>
</xsl:template>
<xsl:template match="author">
Author,<span style="color:#0000ff">
<xsl:value-of select="."/></span>
</xsl:template>
</xsl:stylesheet>
运行以上代码,在IE 6.0上显示的结果如图22-6所示。
图22-6使用IE 6.0显示使用应用模板的mycatalog.xml文件
22.6.6 XSL在客户机上通过例22.9-1~9-5可以看到,如果使用支持XML的浏览器,那么就可以在客户机上使用XSL文档把XML文档转换成HTML文档。
在22.5.2中已经看到,使用JavaScript来显示XML文档。从22.6.4中已经看到,使用XSL可以把XML文档转换成HTML文档,然后在浏览器中显示。同样可以使用JavaScript把XML文档转换成HTML文档,这样就便于在目前的浏览器上阅读。
1,用JavaScript转换XML文档
【例22.10】 将例22.9-2所示的XML文档保存为mycatalog.xml文件,将例22.9-3所示的XSL文档保存为mycatalog.xsl文件。使用JavaScript把XML文档转换为HTML文档可试用如下的源代码,
<html>
<body>
<script type="text/javascript">
// Load XML
var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async = false
xml.load("mycatalog.xml")
// Load XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("mycatalog.xsl")
// Transform
document.write(xml.transformNode(xsl))
</script>
</body>
</html>
在源代码中,第一个码块用来创建XML分析器的一个实例,然后把XML文档装载到内存。第二个码块用于创建分析器的另一个实例,然后把XSL文档装载到内存。最后一行代码是使用XSL文档对XML文档进行转换,然后将转换结果写到HTML文档。
将该文档保存为mycatalog.htm文件,然后使用IE 6.0浏览器就可看到与图22-5完全相同的网页。
2,Microsoft XML分析器在例22.10中,Microsoft.XMLDOM表示这是微软公司开发的XML文档对象模型(XML Document Object Model,XML DOM),它是XML文档的编程接口。XML文档对象模型是一种对象集,用来访问和管理存储在XML文档中的数据。XML文档以树的样式进行构造,树中的每一个元素当作一个节点,每个节点包含文档中的实际数据。树和节点用对象表示,对象带有各种属性和方法(method),方法是一种对象关联的操作或子程序,用来操作对象的数据。
对象是在XML分析器加载和分析XML文档时创建的,通过ID值可引用树或文档对象。例如,
<XML ID="MyXMLDocument">
<class>
<student studentID="991406">
<name>Jia Sheng</name>
<GPA>4.5</GPA>
</student>
</class>
</XML>
其中,MyXMLDocument是文档对象的ID值,通过文档对象的属性和方法可以访问树的根元素(或叫做节点)和子元素(或叫做子节点)。根元素(即文档元素)是文档中最高层的节点,在一个文档中只能出现一次。
Microsoft XML分析器与IE 5.0一起发行。如果在计算机上安装了IE 6.0,在HTML文档和ASP文档中的脚本都可以用XML分析器。XML分析器支持JavaScript,VBScript,Perl,VB,Java,C++ 等语言,支持W3C XML 1.0,XML DOM和DTD等标准。
如果使用IE中的JavaScript,创建XML文档对象的代码为,
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM")
如果使用VBScript,创建XML文档对象的代码为,
set xmlDoc=CreateObject("Microsoft.XMLDOM")
如果在ASP中使用VBScript,创建XML文档对象的代码为,
set xmlDoc=Server.CreateObject("Microsoft.XMLDOM")
把XML文件加到XML分析器可使用脚本。在例22.10中,把mycatalog.xml文档加到XML分析器的代码如下,
<script type="text/javascript">
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM")
xmlDoc.async="false"
xmlDoc.load("mycatalog.xml")
//,......(其他文档)
</script>
其中,第2行代码创建一个Microsoft XML分析器的实例;第3行代码关闭异步加载功能,以确保分析器在文档加载完成之后才继续执行;第4行代码告诉分析器加载的XML文档叫做mycatalog.xml。
22.6.7 XSL在服务机上由于不是所有的浏览器都支持XML和XSL,因此把XML文档转换成HTML文档的一种解决方法方案是在服务机上进行。
【例22.11】 将例22.9-2所示的XML文档保存为mycatalog.xml文件,将例22.9-3所示的XSL文档保存为mycatalog.xsl文件。在服务器上把XML文档转换为HTML文档的一个参考代码如下,
<%
'Load XML
set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("mycatalog.xml"))
'Load XSL
set xsl = Server.CreateObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load(Server.MapPath("mycatalog.xsl"))
'Transform file
Response.Write(xml.transformNode(xsl))
%>
在源代码中,第一个码块用来创建一个XML分析器的实例,然后把XML文档装载到内存。第二个码块用于创建分析器的另一个实例,然后把XSL文档装载到内存。最后一行代码是使用XSL文档对XML文档进行转换,然后把结果返回给浏览器。
将该文档保存为mycatalog.asp文件。如果条件允许,可把mycatalog.asp,mycatalog.xml和mycatalog.xsl三个文件放在服务器上,然后用IE 6.0试试看能否显示正确的结果。
22.7 XML与DTD
22.7.1 DTD介绍在SGML中,文档类型定义(DTD)是描述SGML文档内容的一种语言。在XML中,DTD用来定义XML文档的构造块,说明XML数据如何组织。DTD规范是XML规范中的 一部分,而不是一个独立的实体。DTD是一种选择性的规范,XML文档可以不用它。
DTD指定了可以包括在XML文档中的许多标签,以及这些标签之间的关系。它可以用来确认XML文档结构的有效性。然而,要对一个复杂文档指定一种DTD是很困难的事情。DTD是第一个但不是最终一个用来指定有效文档结构的一种方法。因此,提出了许多比DTD更加灵活的模板(schema),目的是企图取代DTD。
一个DTD文件可以嵌入到XML文档,也可以作为一个单独的外部文件,通过外部引用嵌入到XML文档。
22.7.2 内部DTD
如果DTD要包含在XML源文档中,就要把它包在内部文档类型(internal DOCTYPE)定义中。把DTD包装在DOCTYPE定义中的语法如下,
<!DOCTYPE root-element [element-declarations]>
【例22.12-1】 使用内部型DTD声明的XML文档如下,
1:<?xml version="1.0"?>
2,<!DOCTYPE note [
3,<!ELEMENT note (to,from,heading,body)>
4,<!ELEMENT to (#PCDATA)>
5,<!ELEMENT from (#PCDATA)>
6,<!ELEMENT heading (#PCDATA)>
7,<!ELEMENT body (#PCDATA)>
8,]>
9,<note>
10,<to>Lucy</to>
11,<from>Lin</from>
12,<heading>Reminder</heading>
13,<body>Don't forget me this weekend</body>
14:</note>
其中,
第2行:!DOCTYPE note定义该文档是一个note文档。
第3行:!ELEMENT note定义note元素有4个元素,即to,from,heading,body。
第4行:!ELEMENT to定义to元素为“#PCDATA”型元素。
第5~7行:定义其他元素为“#PCDATA”型元素。
PCDATA(分析字符数据)是parsed character data的简写。分析字符数据可想象为XML文档元素的开始标签和结束标签之间的文本。PCDATA是由XML分析器(XML parser)使用XML语法进行解释的一种文本。在文本内部的标签将作为标记来处理,并对实体参考符进行扩展。
此外,还有一个常见的标签是CDATA(字符数据),是character data的简写。CDATA是一个预先定义的XML标签,用于告诉XML分析器对它的文本不进行解释,对文本内部的标签不作为标记来处理,对其中的实体参考符也不进行扩展。例如,
<![CDATA[ <slide>...A sample slide...</slide> ]]>
显示为,
<slide>...A sample slide..,</slide>
22.7.3 外部DTD
如果DTD不包含在XML源文档中,就要用外部型文档(external DOCTYPE )声明。把DTD包含在DOCTYPE定义中的语法如下,
<!DOCTYPE root-element SYSTEM "filename">
【例22.12-2】 一个使用外部型DTD声明的XML文档如下所示,
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
DTD的note.dtd文件如下所示,
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
使用DTD的好处是,每一个XML文档可以携带它自己的格式声明,这样一来,不同团体就可使用共同的DTD来交换数据,应用程序也可以使用一个标准的DTD来校验从外部世界接收到的数据是否有效,同样也可校验自己的数据是否有效。
22.8 XML名称空间
XML名称空间(Namespaces)是给DTD定义的元素名称指定唯一标签的一种标准。它提供了一种方法,使得用DTD定义的文档可包含在任何其他文档中,以避免元素名称之间发生冲突。
22.8.1,名称冲突问题在XML文档中,由于元素名称不是固定的,当两个不同文档使用相同的名称描述不同的元素类型时,往往产生名称上的冲突。
【例22.13-1】 一个XML文档在table元素中有如下的信息,
<table>
<tr>
<td>苹果</td>
<td>香蕉</td>
</tr>
</table>
【例22.13-2】 一个XML文档在table元素中有如下信息,
<table>
<name>饭桌</name>
<length>120公分</length>
<width>80公分</width>
</table>
这两个XML文档都包含table元素,如果把它们放在一起,两个名称相同但含义和定义不同的元素就会发生冲突。
现在,解决名称冲突的方法是在元素的开始标签中加前缀,再添加xmlns用来表示元素的属性。例如,例22.13-1的元素可使用如下所示的标签,
<h:table xmlns:h="http://www.w3.org/TR/html4/">
……
</h:table>
例22.13-2的元素可使用如下所示的标签,
<f:table xmlns:f="http://www.w3schools.com/furniture">
……
</f:table>
22.8.2,名称空间的属性名称空间属性放在元素的开始标签中,它使用如下的语法,
xmlns:namespace-prefix="namespace"
W3C名称空间规范指出,名称空间本身应该是一个统一资源标识符(Uniform Resource Identifier,URI)。URI是识别因特网资源(如文件)的一串字符。统一资源标识符包括统一资源名(Uniform Resource Names,URN)和统一资源地址(Uniform Resource Locators,URL)。在大多数情况下,使用URL标识名称空间的属性,因为它是唯一的。例如,
xmlns:h="http://www.w3.org/TR/html4/
由于名称空间定义在开始标签中,因此具有相同前缀的所有子元素都与相同的名称空间相关联。
22.8.3,默认的名称空间定义元素的默认名称空间可免去在所有子元素中都使用前缀。使用默认名称空间的语法如下,
<element xmlns="namespace">
例22.13-1和例22.13-2使用的默认名称空间代码分别为,
<table xmlns="http://www.w3.org/TR/html4/">
……
</table>
和
<table xmlns="http://www.w3schools.com/furniture">
……
</table>
22.9 XML模板语言
XML模板是定义文档内容的一种语言,用于描述XML文档的结构。XML模板语言也称为XML模板定义(XML Schema Definition,XSD)。不像DTD,XML模板是使用XML语法写成的,虽然它显得有点冗长,但可以使用任何XML工具创建。XML模板最初是微软公司提出的,在2001年5月成为W3C正式的推荐标准。
22.9.1 XML模板的目标开发XML模板语言的目的是定义XML文档的合法构造块。它定义的内容包括:
文档中出现的元素。
文档中出现的属性。
哪些元素是子元素。
子元素的次序。
子元素的数目。
空元素或可包含文本的元素。
元素和属性的数据类型。
元素和属性的默认值和固定值。
由于XML模板是用XML开发的,并且是一种可扩展的语言,它支持名称空间和多种数据类型,比DTD更丰富和更有用。因此,在大多数Web应用中XML模板比DTD更受重视,也可能取代DTD。
22.9.2 XML文档与XML模板
XML文档可引用DTD或XML模板。在说明如何引用DTD或XML模板之前,先介绍一个具体的XML模板[9]。
1,XML文档引用模板为更好地理解XML模板的概念,先回顾XML文档和DTD文档的实例。
【例22.14-1】 重写例22.5的XML文档,并保存为note.xml文件。
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
【例22.14-2】 将例22.12-2中定义XML文档的DTD部分保存为note.dtd,
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
行1定义note元素有有4各元素:to,from,heading,body;行2~5定义元素的类型为#PCDATA。
【例22.14-3】 为描述XML模板语言,以描述note.xml的模板为例,并将它保存为note.xsd,
<?xml version="1.0"?>
<xsd:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
<xsd:element name="note">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="to" type="xsd:string"/>
<xsd:element name="from" type="xsd:string"/>
<xsd:element name="heading" type="xsd:string"/>
<xsd:element name="body" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
注释1:
<?xml version="1.0"?>
<xsd:schema>
...
</xsd:schema>
表示用xsd:作前缀的<xsd:schema>元素是一个XML模板。
注释2:根元素可包含属性,
<xsd:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3schools.com"
xmlns="http://www.w3schools.com"
elementFormDefault="qualified">
……
</xsd:schema>
其中,
xmlns:xs="http://www.w3.org/2001/XMLSchema"
用于识别该文档是XML模板语言,表示在这个模板 (note.xsd)中使用的元素和数据类型(如schema,element,complexType,sequence,string,boolean等)来自"http://www.w3.org/2001/XMLSchema"的名称空间。
注释3:
targetNamespace="http://www.w3schools.com"
表示由这个模板(note.xsd)定义的元素(note,to,from,heading,body)要加入到
http://www.w3schools.com这个名称空间。
注释4:
xmlns="http://www.w3schools.com"
表示默认的目标名称空间(targetNamespace)是http://www.w3schools.com。
注释5:
elementFormDefault="qualified"
告诉这个模板声明的实例文档所使用的任何元素必需是合格的(qualified)。
注释6:
<xsd:element name="note">
……
</xsd:element>
表示这是note元素。由于note元素包含其他元素,因此把它称为具有复杂类型(complex
type)的元素,其中的to,from,heading,body元素因为没有包含其他元素,因此称为简单类型(simple types)元素。
2,XML文档引用DTD
【例22.14-4】 note.xml 文档引用DTD的文档如下,
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "http://www.w3schools.com/dtd/note.dtd">
<note>
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
这个例子与例22.12-2不同地方是,note.dtd所在的地址不是在本机,而使用URL:
"http://www.w3schools.com/dtd/note.dtd">
3,XML文档引用XML模板
【例22.14-5】 下例表示note.xml文档如何引用XML模板
<?xml version="1.0"?>
<note xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
<to>Lucy</to>
<from>Lin</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
其中,
xmlns="http://www.w3schools.com"
表示使用默认的名称空间声明,告诉模板有效器(schema-validator):在这个实例文档中的所有元素来自http://www.w3schools.com;
xsi:schemaLocation="http://www.w3schools.com note.xsd"
用于schemaLocation告诉模板有效器,http://www.w3schools.com名称空间是由note.xsd模板定义的;
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
用于告诉模板有效器:使用的schemaLocation属性是XML模板实例(XMLSchema-instance)名称空间中的一个。
22.9.3 简单型元素的概念只含文本的一种XML元素叫做简单类型(XML)元素,它不允许包含其他元素和属性。但“只含文本”这个限制非常容易被人误解。文本可以有不同的类型,它可以是包含在XML模板定义中的类型之一(如boolean,string或date等),它也可以包含客户自己定义的类型。此外,还可以对数据类似添加限制以限定其内容。
定义简单型元素的语法如下,
<xsd:element name="xxx" type="yyy"/>
其中,xxx是元素名称,yyy是元素的数据类型。例如,
<lastname>Chen</lastname>
<age>28</age>
<dateborn>1973-07-07</dateborn>
可定义为,
<xsd:element name="lastname" type="xsd:string"/>
<xsd:element name="age" type="xsd:integer"/>
<xsd:element name="dateborn" type="xsd:date"/>
XML模板有许多内置的数据类型。其中,最普通的模板数据类型为:xsd:string,xsd:decimal,xsd:integer,xsd:boolean,xsd:date,xsd:time。
简单型元素可设置默认值或固定值。设置默认值的语法如下例所示,
<xsd:element name="color" type="xsd:string" default="red"/>
设置固定值的语法如下例所示,
<xsd:element name="color" type="xsd:string" fixed="red"/>
22.9.4 复杂型元素的概念包含其他元素和属性的一种XML元素叫做复杂型(XML)元素。复杂型元素包括4种元素:空元素,包含其他元素的元素、只含文本的元素、包含其他元素和文本的元素。每个元素都可以有属性。
例如,表示product元素为空的复杂型XML元素(元素没有任何内容),
<product pid="1345"/>
表示只含其他的元素的复杂型employee元素,
<employee>
<firstname>Dagong</firstname>
<lastname>Lin</lastname>
</employee>
表示只含文本的复杂型food元素,
<food type="dessert">Ice cream</food>
表示包含其他元素和文本的复杂型description元素
<description>
It happened on <date lang="norwegian">03.03.99</date>,...
</description>
练习与思考题
XML的目标是要取代HTML
⑴ 对
⑵ 错用XML可定义多少种不同的数据类型?
说出下面的XML元素由哪几部分组成、各部分的名称和元素的值。
<name>Your Name</name>
属性值必要用双引号
⑴ 对
⑵ 错声明XML版本的正确语法是
⑴ <xml version="1.0" />
⑵ <?xml version="1.0" />
⑶ <?xml version="1.0"?>
XML使用哪些方法描述XML数据
⑴ 使用XSL描述数据。
⑵ 使用DTD描述数据。
⑶ 使用XML Schema描述数据。
下面的陈述哪一个是真的:
⑴ 所有XML文档必需有一个DTD
⑵ 所有XML元素必需是小写字母
⑶ 所有XML元素必需要有结束标签正确引用"mystyle.xsl"的方法是
⑴ <?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>
⑵ <link type="text/xsl" href="mystyle.xsl" />
⑶ <stylesheet type="text/xsl" href="mystyle.xsl" />
仿照例22.9-1、例22.8-2和例22.9-3的代码,用IE 5.0以上浏览器显示下列数据(至少5名学生的数据)。
通讯录学号
姓名
性别
电子邮件
籍贯
参考答案:
22.1.(2),22.2.没有上限,22.4.(2),22.5.(3),22.6.(2)(3),22.7.(3),22.8.(3)
参考文献和站点
W3C Recommendation 6 October 2000,Extensible Markup Language (XML) 1.0 (Second Edition),http://www.w3.org/TR/2000/REC-xml-20001006。
Extensible Markup Language (XML),http://www.w3.org/XML/。
Norwegian Opera浏览器,http://www.opera.com/。
The Extensible Stylesheet Language (XSL),http://www.w3.org/Style/XSL/。
Cascading Style Sheets home page,http://www.w3.org/Style/CSS/。
What's New in the July 2001 Microsoft XML Parser 4.0 Technology Preview,http://msdn.microsoft.com/library/en-us/dnmsxml/html/dnmsxmlnewinjuly.asp
Free Webmaster Help, Tutorials,http://www.freewebmasterhelp.com/tutorials/index.htm。
Roger L,Costello,XML Schema Tutorial,Last updated July 5,2002,http://www.xfront.com/xml-schema.html
Refsnes Data,XML Tutorial,http:// www.w3schools.com/xml/default.asp。
W3C Recommendation,2 May 2001,XML Schema Part 0,Primer,http://www.w3.org/TR/xmlschema-0/。
W3C Recommendation 2 May 2001,XML Schema Part 1,Structures,http://www.w3.org/TR/xmlschema-1/。
W3C Recommendation 02 May 2001,XML Schema Part 2,Datatypes,http://www.w3.org/TR/xmlschema-2/。
W3C Recommendation 27 June 2001,XML Linking Language (XLink) Version 1.0,http://www.w3.org/TR/xlink/。
W3C Last Call Working Draft 8 January 2001,XML Pointer Language (XPointer) Version 1.0,http://www.w3.org/TR/WD-xptr。