3.2 可扩展标记语言XML
可扩展标记语言XML(eXtensible Markup Language)是为了克服HTML缺乏灵活性和伸缩性的缺点以及SGML过于复杂、不利于软件应用的缺点而发展起来的一种元标记语言。SGML功能强大,但是为能实现强大的功能,要做非常复杂的准备工作,首先要创建一个文档类型定义,在该定义中给出标记语言的定义和全部规则,然后再编写SGML文档,并把文档类型定义和SGML文档一起发送,才能保证用户定义的标记能够被理解。HTML简单易学,但也有不足之处:首先,HTML的标记是固定的,不允许用户创建自己的标记;其次,HTML中标记的作用是描述数据的显示方式,并且只能由浏览器进行处理;另外,在HTML中,所有标记都独立存在,无法显示数据之间的层次关系。
XML吸取了两者的优点,摒弃了它们的缺点,已成为互联网标准的重要组成部分,目前ADO 2.5和IE 5.0已支持XML。在XML中,我们可以根据自己所要描述的数据元素定义不同的标签,表达各种丰富的内容和意义。XML文档分层嵌套形成一个树形结构,我们不仅可以简单地把一个XML文档看成一个文件,而且还可以看成一棵标记树。
3.2.1 XML概述
XML是一种数据存储语言,它使用一系列简单标记描述数据。XML同时也是一组规范,用户都遵守这组规范进行开发,这样,不同计算机系统之间就可以相互交流信息。
XML继承了SGML和HTML的功能,是一种用于定义标记的语言,又称为“元语言”。创建一个XML文档时,用户需根据描述的数据自己来定义各种标记。
1. XML与HTML的比较
先看一个示例。
【例3-11】XML与HTML的比较示例。
<BODY> Here we have some text <H1> This is a heading </H1> This bit is normal text <B> This is some bold text </B> And finally some more normal text </BODY>
如果上面的代码是HTML文档,将其加载到浏览器,就会显示如图3-10所示的结果,其作用是格式化文档。但是,如果上面的代码是XML文档,那么其中的标记就不具有任何含义,其内容只是说明:
图3-10 浏览器中显示的HTML文档
• 有一名为BODY的标记,在这个标记里面有一些文本。
• 有一名为H1的标记,在这个标记里有一些文本。
• 有一名为B的标记,在这个标记里有一些文本。
如果例3-11的代码作为一个XML文档(文件扩展名为.xml)加载到IE浏览器中,其结果如图3-11所示。浏览器只是把这些标记原封不动地显示出来。
图3-11 浏览器中显示的XML文档
HTML提供了固定的预定义元素集,可以使用这些元素来标记一个Web页的各个组成部分。而XML没有预定义的元素,用户可以创建自己的元素,并自行命名。XML标记是可以扩展的,用户可以根据需要定义新的标记。XML标记用来描述文本的结构,而不是用于描述如何显示文本。表3-9给出了HTML与XML的主要不同点比较。
表3-9 HTML与XML的比较
目前,XML并没有取代HTML,还在与HTML一起使用。XML极大地扩展了Web页的能力,使Web页能传递任意类型的文档、对数据进行各类管理,以及操作高度结构化的信息,并且XML可以与HTML进行互操作。
2. XML的特性
(1)实现应用程序之间的数据交换。XML是跨平台的,它提供在不同应用程序之间进行数据交换的公共标准,是一种公共的交互平台。
(2)数据与显示分离。一个XML文件并不能决定数据的显示样式,数据的显示部分需要由其他语言来确定(如由CSS样式来确定),这样就可按用户意愿给一份数据设置多种样式,如图3-12所示。
图3-12 XML显示样式示意图
(3)数据分布式处理。XML文档通过网络传送给用户后,用户可通过各类应用软件从XML文档中提取数据,进而对数据进行各种处理,如编辑、排序等。XML文档对象模型(Document Object Model,DOM)允许使用脚本语言或其他编程语言处理XML数据,从而使得数据可以在各用户端处理,而不必都集中在Web服务器上,实现了数据的分布式处理,如图3-13所示。
图3-13 XML分布式数据处理示意图
此外XML还具有可扩展性强、易学易用等特点。
3. XML文档处理流程
一般地,一个XML文档的处理流程如图3-14所示。
图3-14 XML文档处理流程
整个处理过程分为三个阶段:
① 编辑。使用通用的字处理软件或专用的XML编辑工具生成XML文档。
② 解析。对XML文档进行语法分析、合法性检查。读取其中的内容,通常以树形结构交给后续的应用程序进行处理,后续程序通常为浏览器或其他应用程序。
③ 浏览。将由XML解析器传来的XML树形结构以用户需要的格式显示或处理。
4. XML工具
针对图3-14所示的XML文档处理流程,XML的开发应用环境包括XML编辑工具、解析工具和浏览工具等。
(1)XML编辑工具。XML文档的编辑与保存都是纯文本格式,因此使用通用的文本编辑软件,如Windows记事本、写字板、MS Office等,都可以创建XML文档。但是这些通用文字处理软件不能真正理解XML。专用的XML编辑器可以理解XML,将它们显示为树形结构。常见的专用XML编辑器有XMLwriter、XML Spy、XML Pro、Visual XML等。
(2)XML解析工具。也称解析器(Parser),它是XML的语法分析程序。其主要功能是读取XML文档并检查其文档结构是否完整,是否有结构上的错误;对于结构正确的文档,读出其内容,交给后续程序去处理。常见的XML解析器有Apache Xeces、MSXML等。
(3)XML浏览工具。XML解析器会将XML文档结构和内容传输给用户端应用程序。大多数情况下,用户端应用程序可能是浏览器或其他应用程序(如将数据转换后存入数据库)。如果是浏览器,数据就会显示给用户。当前支持XML的浏览器有IE 5.0及以上版本、Mozilla等。
3.2.2 XML文档的编写
1. XML文档的组成
XML定义了如何标记文档的一套规则。可根据需要给标记取任何名字,例如<BOOK>、<TITLE>、<AUTHOR>等。下面是一个格式正确的XML文档示例。
【例3-12】一个XML文档示例。
<?xml version='1.0' standalone='yes' ?> <!-- File Name:Example.xml --> <?xml-stylesheet type="text/css" href="Example.css"?> <INVENTORY> <BOOK> <TITLE>The Adventures of Huckleberry Finn</TITLE> <AUTHOR>Mark Twain</AUTHOR> <BINDING>mass market paperback</BINDING> <PAGES>298</PAGES> <PRICE>$5.49</PRICE> </BOOK> <BOOK> <TITLE>Leaves of Grass</TITLE> <AUTHOR>Walt Whitman</AUTHOR> <BINDING>hardcover</BINDING> <PAGES>462</PAGES> <PRICE>$7.75</PRICE> </BOOK> <BOOK> <TITLE>The Legend of Sleepy Hollow</TITLE> <AUTHOR>Washington Irving</AUTHOR> <BINDING>mass market paperback</BINDING> <PAGES>98</PAGES> <PRICE>$2.95</PRICE> </BOOK> <BOOK> <TITLE>The Marble Faun</TITLE> <AUTHOR>Nathaniel Hawthorne</AUTHOR> <BINDING>trade paperback</BINDING> <PAGES>473</PAGES> <PRICE>$10.95</PRICE> </BOOK> <BOOK> <TITLE>Moby-Dick</TITLE> <AUTHOR>Herman Melville</AUTHOR> <BINDING>hardcover</BINDING> <PAGES>724</PAGES> <PRICE>$9.95</PRICE> </BOOK> <BOOK> <TITLE>The Portrait of a Lady</TITLE> <AUTHOR>Henry James</AUTHOR> <BINDING>mass market paperback</BINDING> <PAGES>256</PAGES> <PRICE>$4.95</PRICE> </BOOK> <BOOK> <TITLE>The Scarlet Letter</TITLE> <AUTHOR>Nathaniel Hawthorne</AUTHOR> <BINDING>trade paperback</BINDING> <PAGES>253</PAGES> <PRICE>$4.25</PRICE> </BOOK> <BOOK> <TITLE>The Turn of the Screw</TITLE> <AUTHOR>Henry James</AUTHOR> <BINDING>trade paperback</BINDING> <PAGES>384</PAGES> <PRICE>$3.35</PRICE> </BOOK> </INVENTORY>
可见,XML文档中不包含格式信息,而是定义了<BOOK>、<TITLE>、<AUTHOR>等标记来表示数据的真实含义。XML标记就是定界符(即<>)以及用定界符括起来的文本。
与HTML类似,在XML中,标记也是成对出现的。处于前面的,如<BOOK>、<TITLE>、<AUTHOR>等是开标记,而位于后面的,如</BOOK>、</TITLE>、</AUTHOR>等是闭标记。与HTML不同的是:在XML中,闭标记是不可省略的。另外,标记是区分大小写的,如<BOOK>和<Book>是两个不同的标记。标记和开/闭标记之间的文字结合在一起构成元素。所有元素都可以有自己的属性,属性采用“属性/值”对的方式写在标记中。
一个XML文档主要由两部分组成:序言和文档元素。在文档元素之后可以包括注释、处理指令和空格等。
(1)序言
例3-12给出的示例文档的序言由三行组成:第一行是XML声明,它说明这是一个XML文档,并且给出了版本号。XML声明还包括一个独立文档声明(standalone = 'yes')。这个声明可以被某些XML文档用来简化文档处理。XML声明是可选的。第二行包括了一个注释,这样可以增强文档的可读性。第三行有一条处理指令。该处理指令告诉应用程序使用文件Example.css中的CSS。处理指令的目的是给有关XML应用程序提供信息。
(2)文档元素
XML文档元素是以树形分层结构排列的,元素可以嵌套在其他元素中。文档必须只有一个顶层元素,称为文档元素(也称根元素),类似于HTML页中的BODY元素,其他所有元素都嵌套在其中。在例3-12中,文档元素是INVENTORY,其起始标记是<INVENTORY>,结束标记是</INVENTORY>,内容是8个嵌套的BOOK元素。
在XML文档中,元素指出了文档的逻辑结构,并且包含了文档的信息内容。一个典型的元素有起始标记、元素内容和结束标记。元素内容可以是字符、数据、其他(嵌套的)元素或两者的组合。
2. 创建XML文档的基本规则
一个格式正确的文档是符合最小规则集的文档,它可以被浏览器或其他程序处理。下面是创建格式正确的XML文档的一些基本规则:
(1)文档必须有一个顶层元素(文档元素或根元素),所有其他元素必须嵌入到其中。
(2)元素必须被正确地嵌套。也就是说,如果一个元素在另一个元素中开始,那么它必须在同一个元素中结束。
(3)每一个元素必须同时拥有起始标记和结束标记。与HTML不同,XML不允许忽略结束标记,即使浏览器能够推测出元素在何处结束时也是如此。
(4)起始标记中的元素类型名必须与相应结束标记中的名称完全匹配。
(5)元素类型名是区分大小写的。实际上,XML标记中的所有文本都是区分大小写的。例如,下列元素是非法的,因为起始标记的类型名与结束标记的类型名不匹配。
<TITLE>Leaves of Grass</Title>
3. 元素内容的类型
元素内容是起始标记和结束标记之间的文本。其中可以包括嵌套元素和字符数据两种类型。当给元素添加字符数据时,用户无法插入左尖括号(<)、&符号或字符串“]]>”作为字符数据的一部分,因为XML解析器会把“<”解释为嵌套元素的起始,把“&”解释为一个实体引用或字符引用的开始,把“]]>”解释为CDATA节的结束。如果要想把<和&作为字符数据的一部分,可以使用CDATA节。还可以通过字符引用插入任意字符,或通过使用预定义的通用实体引用来插入某个字符(如<或&)。有关实体引用、字符引用和CDATA节的内容将在后面介绍。
4. 给元素添加属性
在一个元素的起始标记中,可以包含一个或多个属性。属性由属性名、等号及属性值组成。属性名可以由用户任意定义。例如,下面的PRICE元素包含一个名为Type的属性,它被赋值为retail。
<PRICE Type="retail">$12.50</PRICE>
给元素添加属性是为元素提供信息的一种方法。当使用CSS显示XML文档时,浏览器不会显示属性以及它们的值。但是,若使用数据绑定、HTML页中的脚本或者XSL样式表显示XML文档时,则可以访问属性及其值。
5. 处理指令的使用
处理指令的一般形式为:
< ? target instruction ? >
这里,target是指令所指向的应用名称。名称必须以字母或下划线开头,后面跟若干个数字、字母、句点、连字符或下划线。“xml”是保留名称,它是处理指令的一种类型。例如:
<?xml version='1.0' standalone='yes' ?>
在XML文档中使用的处理指令取决于读取文档的处理器。如果使用IE 5.0作为XML处理器,那么处理指令主要有两种用途:
(1)可以使用标准的、预留处理指令来告诉IE 5.0怎样处理和显示文档。
(2)如果编写了Web页脚本用于处理和显示XML文档,那么可以在文档中插入任意非保留的处理指令。
6. CDATA节的使用
CDATA节以字符“<![CDATA[”开始,并以字符“]]>”结束。在这两个限定字符组之间,可以输入包括<或&的任意字符,“]]>”除外。CDATA节中的所有字符都会被当作元素中字符数据的常量部分,而不是XML标记。在任何出现字符数据的地方都可以插入CDATA节。下面是一个合法CDATA节的例子:
<?xml version= "1.0" ?> <MUSICAL> <TITLE_PAGE> <! [CDATA[ <oklahoma!> By Rogers&Hammerstein ]]> </TITLE_PAGE> </MUSICAL>
通过以上学习,我们了解了XML文件的基本规则,这样就能够编写一个规范的XML文件了。但是,这个XML文件可能并不能准确地描述客观事物,这是因为还没有一个更加详细的规范来约束XML文件,即还缺乏XML数据的底层数据结构。为此,人们制定了两个对XML文件的约束规范:文档类型定义DTD(Document Type Definition)、XML Schema。其中,XML Schema是继DTD之后的第二代用于描述XML文件的标准,功能更为强大。我们把符合XML语法规则的XML文件称为规范的XML文件,也称为良构的XML文件,而将符合DTD或XML Schema规范的XML文件称为有效的XML文件。限于篇幅,本书不再详细介绍DTD和XML Schema,有兴趣的读者可参阅有关资料。
3.2.3 XML文档的显示
如果需要将XML文档在浏览器中按特定的格式显示出来,必须要有另一个文件告诉浏览器如何显示。XML文档由专门的样式文档来执行,可以是级联样式表(CSS)或是可扩展样式表语言XSL(eXtensionible Stylesheet Language)。
1. 使用CSS样式表显示XML文档
可以直接在浏览器中打开XML文档,就像打开一个HTML Web页一样。如果XML文档没有包含指向样式表的链接,那么浏览器只显示整个文档的文本,包括标记和字符数据。浏览器用带颜色的代码来区分不同的文档组成部分,并且以收缩和扩展树的形式显示文档元素,以便清楚地指出文档的逻辑结构并允许详细地查看图层。
如果XML文档包含指向样式表的链接,那么浏览器只显示文档元素的字符数据,并根据样式表中指定的规则格式化数据。可以使用级联样式表CSS或可扩展样式表语言XSL编写样式表。使用级联样式表(CSS)显示XML文档有两个基本步骤:① 创建CSS样式表文件;② 链接CSS样式表到XML文档。其中,创建CSS样式表文件的问题将在5.3节介绍。例如,对于例3-12,可以建立如下的样式表文件Example.css:
BOOK {display:block; margin-top:12pt; font-size:10pt} TITLE {font-style:italic} AUTHOR {font-weight:bold}
要链接级联样式表到XML文档,则需插入保留的xml-stylesheet处理指令到XML文档中。这个处理指令有如下所示的通用格式,其中CSSFilePath指示样式表文件位置的URL。
<?xml-stylesheet type="text/css" href=CSSFilePath ?>
例如:例3-12中的XML文档中包含如下处理指令:
<?xml-stylesheet type="text/css" href="Example.css" ?>
例3-12的XML文档在浏览器中的显示效果如图3-15所示。
图3-15 应用CSS样式文件显示XML文档
2. 使用XSL样式文件显示XML文档
与CSS样式表类似,一个XSL样式表链接到一个XML文档后,浏览器就可以显示XML数据了,而无须使用中介HTML页。但是,对于显示XML来说,XSL样式表的功能远比CSS强大和灵活。CSS只允许指定每个XML元素的格式,而XSL样式表允许对输出进行完整的控制。特别地,XSL允许精确地选择想要显示的XML数据,允许用任意顺序和排列表示数据,并且随意修改或添加信息。XSL可以访问所有的XML组件(包括元素、属性、注释和处理指令),允许排序和过滤XML数据,允许在样式表中包含脚本,同时提供一组方法以便处理信息。
(1)使用XSL样式表的基本步骤
使用XSL样式表显示XML文档有两个基本步骤:
① 创建XSL样式表文件。XSL是XML的一个应用。也就是说,一个XSL样式表是一个遵守XSL规则的格式正确的XML文档。
② 链接XSL样式表到XML文档。尽管使用XML来创建XML文档和XSL样式表,但是它们分别保存在各自独立的文件中:XML文档文件(扩展名为.xml)和XSL样式表文件(扩展名为.xsl)。通过在XML文档中包含一个xml-stylesheet处理指令,链接XSL样式表到XML文档,而处理指令有下列通用格式:
< ? xml-stylesheet type= "text/xsl" href=XSLFilePath? >
这里,XSLFilePath是一个带引号的URL,它指出样式表文件的位置。例如:
< ? xml-stylesheet type= "text/xsl" href= "Example.xsl" ? >
通常,把xml-stylesheet处理指令添加到XML文档的序言中,并放在XML声明之后。
如果一个XSL样式表已链接到XML文档,那么就可以直接在IE 5.0浏览器中打开该文档,而且浏览器将使用样式表中的转换指令显示XML文档。与级联样式表不同,如果链接了多个XSL样式表到XML文档,那么浏览器将使用第一个而忽略其他的。如果同时链接了一个CSS和XSL样式表到XML文档,那么浏览器将只使用XSL样式表。
(2)使用单个XSL模板
不像CSS那样包含规则,XSL样式表包含一个或多个模板(Template),每个模板包含显示XML文档中元素的某个分支的信息。
每一个XSL样式表必须有一个如下所示的文档元素:
< xsl:stylesheet xmlns:xsl= "http://www.w3.org/TR/WD-xsl"> < ! – one or more template elements … -- > < /xsl:stylesheet >
XML样式表的文档元素xsl:stylesheet必须包含一个或多个XSL模板元素,也可把模板元素简称为模板。它具有下列形式:
< xsl:template match= "/" > < ! – child elements … -- > < / xsl:template >
浏览器使用模板来显示样式表所链接的XML文档中元素层次结构的某个分支。模板的match属性指定某个分支(match属性类似于CSS规则的选择器)。match属性的值被称为模式(pattern)。模式(“/”)代表整个XML文档的根。每一个XSL样式表必须包含一个match属性被设置为值为“/”的模板,还可以包括一个或多个包含指令的附加模板来显示XML文档元素结构的特定子分支。每个模板必须有一个与特定分支匹配的模式。下面是一个XSL样式表和XML文档示例。
XSL样式表XslDemo.xsl清单如下:
<?xml version="1.0"?> <!-- File Name:XslDemo.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <H2>Book Description</H2> <SPAN STYLE="font-style:italic">Author:</SPAN> <xsl:value-of select="BOOK/AUTHOR"/><BR/> <SPAN STYLE="font-style:italic">Title:</SPAN> <xsl:value-of select="BOOK/TITLE"/><BR/> <SPAN STYLE="font-style:italic">Price:</SPAN> <xsl:value-of select="BOOK/PRICE"/><BR/> <SPAN STYLE="font-style:italic">Binding type:</SPAN> <xsl:value-of select="BOOK/BINDING"/><BR/> <SPAN STYLE="font-style:italic">Number of pages:</SPAN> <xsl:value-of select="BOOK/PAGES"/> </xsl:template> </xsl:stylesheet>
XML文档XslDemo.xml清单如下:
<?xml version="1.0"?> <!-- File Name:XslDemo.xml --> <?xml-stylesheet type="text/xsl" href="XslDemo.xsl"?> <BOOK> <TITLE>Moby-Dick</TITLE> <AUTHOR> <FIRSTNAME>Herman</FIRSTNAME> <LASTNAME>Melville</LASTNAME> </AUTHOR> <BINDING>hardcover</BINDING> <PAGES>724</PAGES> <PRICE>$9.95</PRICE> </BOOK>
上面给出的示例XML文档只包含一个BOOK元素。但是,如果一个文档包含几个BOOK元素,那么使用XSLDem1.xsl中的技术就只能显示第一个元素。例如,考虑具有下列文档元素的XML文档:
<INVENTORY> <BOOK> <TITLE> The Adventures of Huckleberry Finn </TITLE> <AUTHOR> <FIRSTNAME> Mark </FIRSTNAME> <LASTNAME> Twain </LASTNAME> </AUTHOR> <BINDING> mass market paperback </BINDING> <PAGES> 298 </PAGES> <PRICE> $5.49 </PRICE> </BOOK> <BOOK> <TITLE> The Adventures of Tom Sawyer </TITLE> <AUTHOR> <FIRSTNAME> Mark </FIRSTNAME> <LASTNAME> Twain </LASTNAME> </AUTHOR> <BINDING> mass market paperback </BINDING> <PAGES> 205 </PAGES> <PRICE> $4.75 </PRICE> </BOOK> <BOOK> <TITLE> The Ambassadors </TITLE> <AUTHOR> <FIRSTNAME> Henry </PIRSTNAME> <LASTNAME> James </LASTNAME> </AUTHOR> <BINDING> mass market paperback </BINDING> <PAGES> 305 </PAGES> <PRICE> $5.95 </PRICE> </BOOK> </INVENTORY>
假设用于显示该文档的样式表包含如下所示的模板:
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/TR/WD-xsl"> <xsl:template match= "/"> <H2>Book Descriptiont < /H2> <SPAN STYLE = "font-style:italic">Author:</SPAN> <xsl:value-of select= "INVENTORY/ BOOK/AUTHOR"/><BR/> <SPAN STYLE= " font-style:italic"> Title:</SPAN> <xsl:value-of select= "INVENTORY / BOOK /TITLE"/><BR/> <SPAN STYLE= "font-style:italic">Price:</SPAN> <xsl:value-of select = "INVENTORY / BOOK / PRICE"/><BR/> <SPAN STYLE= "font- style:italic">Binding type:</SPAN> <xsl:value-of select = "INVENTORY / BOOK / BINDING"/><BR/> <SPAN STYLE= "font-style:italic"> Number of pages:</SPAN> <xsl:value-of select = "INVENTORY / BOOK / PRICE"/> </xsl:template> </xsl:stylesheet>
注意,赋予每个select属性的模式都以文档元素开头,在该例中是INVENTORY(例如,“INVENTORY/BOOK/AUTHOR”)。
但是,每个模式匹配三个不同的元素。例如,“INVENTORY/BOOK/AUTHOR”匹配所有这三个BOOK元素中的AUTHOR元素。在这种情况下,浏览器只使用第一个匹配的元素。因此,样式表只显示第一个BOOK元素的内容。
一种显示所有匹配元素的技术是使用XSL的for-each元素(它会重复输出所包含的元素),每个在XML文件中找到的匹配元素输出一次。下列XSL样式表采用这种技术。
<?xml version="1.0"?> <!-- File Name:XslDemo02.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <H2>Book Inventory</H2> <xsl:for-each select="INVENTORY/BOOK"> <SPAN STYLE="font-style:italic">Title:</SPAN> <xsl:value-of select="TITLE"/><BR /> <SPAN STYLE="font-style:italic">Author:</SPAN> <xsl:value-of select="AUTHOR"/><BR /> <SPAN STYLE="font-style:italic">Binding type:</SPAN> <xsl:value-of select="BINDING"/><BR /> <SPAN STYLE="font-style:italic">Number of pages:</SPAN> <xsl:value-of select="PAGES"/><BR /> <SPAN STYLE="font-style:italic">Price:</SPAN> <xsl:value-of select="PRICE"/><P /> </xsl:for-each> </xsl:template> </xsl:stylesheet>
(3)使用多个XSL模板
另一种显示重复性XML文档的方法是为重复元素创建一个独立的模板,然后使用XSL的apply-templates元素调用该模板。下列XSL样式表就使用了这种技术。
<?xml version="1.0"?> <!-- File Name:XslDemo03.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <H2>Book Inventory</H2> <xsl:apply-templates select="INVENTORY/BOOK" /> </xsl:template> <xsl:template match="BOOK"> <SPAN STYLE="font-style:italic">Title:</SPAN> <xsl:value-of select="TITLE"/><BR/> <SPAN STYLE="font-style:italic">Author:</SPAN> <xsl:value-of select="AUTHOR"/><BR/> <SPAN STYLE="font-style:italic">Binding type:</SPAN> <xsl:value-of select="BINDING"/><BR/> <SPAN STYLE="font-style:italic">Number of pages:</SPAN> <xsl:value-of select="PAGES"/><BR/> <SPAN STYLE="font-style:italic">Price:</SPAN> <xsl:value-of select="PRICE"/><P/> </xsl:template> </xsl:stylesheet>
这个样式表包含两个模板:一个模板包含了显示整个文档的指令(即带有指定文档根的match=“/”设置的模板),所有XSL样式表都需要这个模板。另一个模板包含显示BOOK元素的指令(match=“BOOK”的模板)。浏览器从处理匹配文档根的模板开始:
< xsl:template match= "/" > <H2>Book Inventory </H2> <xsl:apply-templates select= "INVENTORY/BOOK" /> </xsl:template>
XSL的apply-templates元素告诉浏览器,对于根元素INVENTORY中的每个BOOK元素,它应该处理与BOOK元素相匹配的模板,即match属性被设置为“BOOK”的模板。该样式表包括下列与BOOK元素相匹配的模板:
<xsl:template match= "BOOK" > <SPAN STYLE= "font-style:italic" > Title:</SPAN> <xsl:value-of select = "TITLE" / > <BR/> <SPAN STYLE= "font-style:italic">Author:</SPAN> <xsl:value-of select = "AUTHOR" /> <BR/> <SPAN STYLE = "font-style:italic" > Binding type:</SPAN> <xsl:value-of select = "BINDING" / > <BR/> <SPAN STYLE = "font-style:italic" Number of pages:</SPAN> <xsl:value-of select = "PAGES" / > <BR/> <SPAN STYLE = "font-style:italic" > Price:</SPAN> <xsl:value-of select= "PRICE"/> <P/> </xsl:template>
因为这个模板匹配BOOK元素,所以BOOK是模板上下文中的当前元素。因此,BOOK的每个子元素都可以通过包含元素名的模式来访问。