Web程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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的每个子元素都可以通过包含元素名的模式来访问。