新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   >>中国XML论坛<<     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论XSL,XSLT,XSL-FO,CSS等技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XSL/XSLT/XSL-FO/CSS 』 → 一个很好的网上资源:讲xsl很详细,有实例! 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5888 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 一个很好的网上资源:讲xsl很详细,有实例! 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     宇宙人 帅哥哟,离线,有人找我吗?狮子座1981-8-20
      
      
      威望:4
      等级:大一新生
      文章:96
      积分:771
      门派:W3CHINA.ORG
      注册:2004/4/22

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给宇宙人发送一个短消息 把宇宙人加入好友 查看宇宙人的个人资料 搜索宇宙人在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看宇宙人的博客楼主
    发贴心情 一个很好的网上资源:讲xsl很详细,有实例!

    http://wssok.51.net/aboutme/tm/XML/ch8.html
    XPath和XML文档的表现--XSL
    王 巍


    8.1 节点匹配路径XPath

    8.2 XSL

        CSS的功能明显不够强大,它仅允许格式化元素内容,不允许改变或重新安排这些内容,也不能显示属性值。为此,提出了XSL样式单方式,它是专为XML设计的,它不仅能显示XML文档,还能通过模板机制取出XML文档中的部分内容,并能对其中的内容进行排序。除此之外,它还能把一个XML文档转化为其它格式的文档,当然包括另一个新的XML文档。
        在XSL文档中可结合使用XSL、HTML和CSS三者的功能。另外,XSL允许在XML文档中使用中文标记,而CSS则不支持中文标记。
        XSL是通过XML进行定义的,遵循XML的语法规范,是XML的一种具体应用。它由两大部分组成:第一部分描述如何将一个XML文档进行转换,即转换为可浏览或可输出的格式;第二部分则定义了格式化对象(Formatted Object,FO)。在输出时,首先根据XML文档构造源树,然后根据给定的XSL将这个源树转换为可以显示的结果树,这个过程称作树转换,最后再按照FO解释结果树,产生一个可以在屏幕上、纸上、语音设备或其它媒体上输出的结果,这个过程称作格式化。目前,对于第一部分描述树转换工作已形成了标准,并已从XSL中分离出来,并另取名为XSLT(XSL Transformation,XSL转换语言)。XSLT规范的详细说明书可见http://www.w3.org/TR/xslt。现在一般所说的XSL大都是指XSLT,本课中亦不例外。

    XSL编程思想:
        CSS是借助矩形容器思想,通过把XML文档每个元素的数据载入相应样式属性设置的矩形容器中,实现页面中各项内容的定位与显示。只要XML文档通过处理指令与一个CSS文件联系起来之后,即使这个CSS文件并没有为文档中的某些元素设置样式表,这些元素中的数据仍然将会按照浏览器默认的样式显示到页面。而XSL在表现XML文档时却采用截然不同的实现过程,在这个过程中起着关键作用的就是XSL的模板。下面为一个XSL文件格式化XML文档过程的简要描述:
        (1)在用XSL表现XML文档时,XML解析器将XML文档解析成一个DOM对象,XSL则把这样的DOM对象看成是一棵由许多节点组成的树,这棵树称为源树,而组成XML文档的根元素和子元素都是源树的节点。
            DOM是Document Object Model(文档对象模型)的英文缩写,XSL解析器正是通过DOM技术从XML文档中获取数据。
        (2)XSL处理器将根据XSL文件各个模板中设置的筛选条件,从源树的相应节点中取出需要的数据,而这些数据又形成一棵树,称为结果树。结果树中的数据就是用XSL文件表现XML文档时得到的中间数据。
        (3)XSL处理器将根据各个模板的匹配条件,将相应的样式表附加到结果树的特定数据上并显示在浏览器窗口中。
        换句话说,当用XSL编写表现XML文档的样式文件时,就必须具备这种思想,即设计者编写XSL文件实际上是设计某种格式的模板。这些模板中包含从XML文档中提取数据来构造结果树的语句以及相应的样式代码。设计者通过编写XSL代码制作模板,在逻辑上实现结果树的构造。XSL处理器将按XSL代码中的各条指令,具体负责构造结果树的工作。带有XSL处理器的浏览器则负责将得到的结果树转化为相应的文档,并且把转换后的文档在浏览器窗口中显示出来。

    XSL文档基本结构:
    例1: 点击此处浏览,在浏览器中显示的情形见下图。(同一类型的电影排在一起,且同类型电影按票价降序排列)

    下面为XML文件清单:
    <?xml version="1.0" encoding="GB2312" ?>
    <?xml-stylesheet type="text/xsl" href="8-1.xsl" ?>
    <影片>
       <影片信息 类型="武打片">
          <片名 主演="成龙">特务迷城</片名>
          <票价>15.00元</票价>
       </影片信息>
       <影片信息 类型="生活片">
          <片名 主演="周星驰">少林足球</片名>
          <票价>24.00元</票价>
       </影片信息>
       <影片信息 类型="武打片">
          <片名 主演="郑少秋">七剑下天山</片名>
          <票价>28.00元</票价>
       </影片信息>
    </影片>

    下面为XSL文件清单:
    <?xml version='1.0' encoding="GB2312" ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns="http://www.w3.org/TR/REC-html40">
    <xsl:template match="/">
       <html>
       <head>
          <title>例子1</title>
          <style>
             .1 {font-weight:bold;font-size:12pt}
             .2 {font-size:10.5pt}
          </style>
       </head>
       <body>
          <table border="1" bgcolor="yellow">
             <tr align="center" class="1">
                <td>类型</td>
                <td>主演</td>
                <td>片名</td>
                <td>票价</td>
             </tr>
             <xsl:for-each select="影片/影片信息" order-by="@类型;-票价">
             <tr class="2">
                <td><xsl:value-of select="@类型"/></td>
                <td><xsl:apply-templates select="片名"/></td>
                <td><xsl:value-of select="片名"/></td>
                <td><xsl:value-of select="票价"/></td>
             </tr>
             </xsl:for-each>
          </table>
       </body>
       </html>
    </xsl:template>
    <xsl:template match="片名">
       <font color="blue"><xsl:value-of select="@主演"/></font>
    </xsl:template>
    </xsl:stylesheet>

    说明1:首先要在XML文档中加入XML处理指令。指令样式为:<?xml-stylesheet type="text/xsl" href="8-1.xsl" ?>。在href属性中定义配套的XSL样式文件,若在浏览XML文件时,找不到该XSL文件,就会出现出错提示信息。
    说明2:由于XSL本身是一个XML文档,因此XSL文档的首行必然是一个XML声明:<?xml version="1.0" encoding="GB2312" ?>
    说明3:XSL文件的根元素必是:<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns="http://www.w3.org/TR/REC-html40"></xsl:stylesheet>
    其中xsl:stylesheet标记的含义是将本文档作为一个样式单来处理。xmlns:xsl属性是一个名域空间声明,其前缀xsl的意思是文档中使用的元素遵守W3C的XSLT规范。xmlns=属性是一个缺省名域空间声明,表明相关元素将遵从“http://www.w3.org/TR/REC-html40”处为元素定义的约束,实际上该处就是制定HTML标准的地方,该缺省名域空间的指定属性通常可省去不写。
    说明4:标记<xsl:template match="/">和</xsl:template>元素对是定义XSL最为重要的元素,该元素用来为结果树中数据的显示定义模板。一个XSL文件中所有的样式信息都包含在xsl:template元素定义的各个模板中。亦即XSL根元素的子元素必是xsl:template元素。
        模板(template)由两部分组成:匹配模式(match pattern)和执行。其中,“模式”定义了XML源文档中哪个节点将被模板处理,模式使用XPATH来表示。“执行”则定义输出的是什么格式。
        xsl:template元素的最基本格式:
                <xsl:template match="匹配条件 mode="模板名"">
                   ......
                   进行数据提取操作的XSL语句
                   ......
                </xsl:template>
        其中,match属性确定什么样的情况下执行此模板。在编写XSL文件时,可根据需要多次使用xsl:template元素定义模板。但需注意:无论定义了多少个模板,其中必须有一个match属性值为“/”(默认值)的xsl:template元素,表示定义的模板将与XML文档的根元素相匹配,亦即说明该模板规则在XML文档中作用的起点是XML结构树的根。
        在对模板进行匹配时使用“xsl:apply-templates”标记,选择要匹配的模板,相当于一个调用的过程。对节点的匹配规则遵照XPath。
        xsl:apply-template元素的最基本格式:
                <xsl:apply-template select="匹配条件" order-by="排序标记、属性列表" mode="模板名">
        其中,select属性用于确定在此上下文环境中应执行什么模板,即选取用<xsl:template>标记建立的模板。当XSL处理器看到这个元素后,自动在文件的多个模板中查找并且使用与特定数据相匹配的模板。order-by属性以分号(;)分隔的排序标准,通常是子标记的序列,也可为属性。通常模板的匹配是由XSL处理器按<xsl:apply-templates>中的select属性指定的匹配条件自动去匹配<xsl:template>定义中规定的match属性来实现的,但若有多个具有相同match属性值的模板时,如何能实现精确定位呢?通常可以通过指定mode属性来明确指定与哪一个模板匹配。
    说明5:在XSL中,xsl:value-of元素专门用来提取数据,即把XML文档中某个满足筛选条件的元素所包含的数据提取出来,放到结果树中。它有两种基本使用格式:
            <xsl:value-of select="筛选条件"/>    或    <xsl:value-of/>
        其中,第一种格式设置了select属性,使得XSL处理器可按给定的筛选条件在XML文档中找到相应的元素并且将元素所包含的数据放入结果树;第二种格式则缺省了select属性的设置,表示将以当前的XML元素为提取数据的目标,这种格式常常需要和XSL的其它元素配合使用,如xsl:for-each元素或者xsl:template元素。
        xsl:value-of元素不仅可以提取XML元素中的内容,还可以提取XML元素属性的值,但是需注意的是取属性值,须在属性名前加上“@”符号。
    说明6:在一个XML文档的树状层次结构中,处于同一层的元素往往有多个,而且这些元素可能还有相同的名字。此时你仅用xsl:value-of元素是不够的,它仅能读取第一个符合筛选条件的元素内容,为此,必须另外通过xsl:for-each元素来实现符合筛选条件的遍历。
        比如把本例中的XSL文档中的<xsl:for-each select="影片/影片信息" order-by="@类型;-票价">和</xsl:for-each>元素对去掉。把XSL文档改为如下内容:(出于仅用于说明问题考虑,把许多HTML元素去掉了)
    点击此处浏览,在浏览器中显示的情形见下图。

    <?xml version='1.0' encoding="GB2312" ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns="http://www.w3.org/TR/REC-html40">
    <xsl:template match="/">
          <table border="1" bgcolor="yellow">
             <tr>
                <td><xsl:value-of select="影片/影片信息/片名"/></td>
                <td><xsl:value-of select="影片/影片信息/票价"/></td>
             </tr>
          </table>
    </xsl:template>
    </xsl:stylesheet>

    若加上<xsl:for-each>元素,则显示情况变成了如下图所示:(点击此处浏览)

    此时的XSL文件清单如下:
    <?xml version='1.0' encoding="GB2312" ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns="http://www.w3.org/TR/REC-html40">
    <xsl:template match="/">
          <table border="1" bgcolor="yellow">
             <xsl:for-each select="影片/影片信息">
             <tr>
                <td><xsl:value-of select="片名"/></td>
                <td><xsl:value-of select="票价"/></td>
             </tr>
             </xsl:for-each>
          </table>
    </xsl:template>
    </xsl:stylesheet>

        显然,从上面的例子中可以看出,不加<xsl:for-each>元素,仅显示XML文档根元素“影片”中的第一个子元素“影片信息”的内容;而加了<xsl:for-each>元素后,把所有匹配该元素定义中的select属性值的XML文档根元素“影片”中的各个子元素“影片信息”的内容都显示了出来。
        另外,从上面的两个简单的对比例子还可以看出:前一个例子中的<xsl:value-of>元素中的select属性中的匹配条件为“影片/影片信息/片名”,而后一个例子中则为“片名”。这是因为前一例子中的模板匹配条件为“/”,即根元素“影片”,因此要显示子元素“影片信息”中的子元素“名片”的内容,则要写出起路径信息,这与操作系统中的目录结构中的路径是类似的概念,若以“/”开头,则表示为绝对路径,否则为相对路径。对于相当路径则表示以当前的匹配元素为起点表达的路径信息。同理,因为后一例子中的<xsl:for-each select="影片/影片信息">元素中已指定了匹配条件为“影片/影片信息”,同时外侧的模板匹配条件为“/”,因此当前的匹配条件实际上是为“/影片/影片信息”,即当前匹配元素为根元素“影片”中的子元素“影片信息”,因此可直接写“名片”作为匹配条件即可,亦即在当前元素中去寻找匹配的子元素“名片”。
        <xsl:for-each>元素的作用是:在XML文档中,按照给定的筛选条件寻找所有满足要求的XML元素,并且对找到的所有元素进行规定的操作。其基本使用格式为:
                <xsl:for-each select="筛选条件" order-by="标记名称列表">
                   ......
                </xsl:for-each>
        其中,select属性用于设置对XML文档中的元素进行筛选时的条件。需注意的是,当需要在匹配条件中进一步限制匹配条件时要用方括号([])括起来。
        比如把例子1的<xsl:for-each select="影片/影片信息" order-by="@类型;-票价">标记改为“<xsl:for-each select="影片/影片信息[@类型='武打片']" order-by="@类型;-票价">”标记,则表示仅匹配“影片”元素中的“类型”属性为“武打片”的“影片信息”元素。此时输出结果为:
        又比如把例子1的<xsl:for-each select="影片/影片信息" order-by="@类型;-票价">标记改为“<xsl:for-each select="影片/影片信息[票价>'20']" order-by="@类型;-票价">”标记,则表示仅匹配“影片”元素中“影片信息”子元素中的“票价”子元素大于为“20”的“影片信息”元素(说明: 若为小于比较,则“<”必须用“&lt;”实体引用来替代)。此时输出结果为:
        order-by属性用来指定作为最终显示时排序依据的标记名称。若标记名称前没有负号或加上正号(+),则表示将根据给定的标记名称按升序排列,否则按降序排列。当然标记可为元素或属性。另外,有多个排序标记时,各标记之间以分号(;)分隔。
        比如,上面第一个例子中的<xsl:for-each select="影片/影片信息" order-by="@类型;-票价">标记中定义的order-by属性的属性值为“@类型;-票价”的含义是对所有匹配的元素先按“影片信息”子元素的“类型”属性升序排列,对与具有相同“类型”属性值的元素,则按“票价”属性值大小降序排列。


    XSL文档的进一步介绍:
    例2: 点击此处浏览,在浏览器中显示的情形见下图。(同班级学生排在一起,并按班号升序排列)

    下面为XML文件清单:
    <?xml version="1.0" encoding="GB2312" ?>
    <?xml-stylesheet type="text/xsl" href="8-2.xsl" ?>
    <成绩汇总表>
       <成绩单 班级="0411">
          <姓名 学号="041110">XuLiu</姓名>
          <英语>80</英语>
          <语文>99</语文>
          <数学>100</数学>
       </成绩单>
       <成绩单 班级="0201">
          <姓名 学号="020108">LiSi</姓名>
          <英语>50</英语>
          <语文>59</语文>
          <数学>73</数学>
       </成绩单>
       <成绩单 班级="0411">
          <姓名 学号="041104">ZhangSan</姓名>
          <英语>99</英语>
          <语文>80</语文>
          <数学>30</数学>
       </成绩单>
    </成绩汇总表>

    下面为XSL文件清单:
    <?xml version='1.0' encoding="GB2312" ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns="http://www.w3.org/TR/REC-html40">
    <!-- example 2'xsl -->
    <xsl:template match="/">
       <html>
       <head>
          <title>例子2</title>
       </head>
       <body>
          <table border="1">
          <tr align="center">
             <td>班级</td>
             <td>学号</td>
             <td>姓名</td>
             <td>英语</td>
             <td>语文</td>
             <td>数学</td>
          </tr>
          <xsl:for-each select="成绩汇总表/成绩单" order-by="@班级">
          <tr>
             <td><xsl:value-of select="@班级"/></td>
             <td><xsl:apply-templates select="姓名"/></td>
             <td><xsl:value-of select="姓名"/></td>
             <td><xsl:apply-templates select="英语"/></td>
             <td><xsl:apply-templates select="语文"/></td>
             <td><xsl:apply-templates select="数学"/></td>
          </tr>
          </xsl:for-each>
          </table>
       </body>
       </html>
    </xsl:template>
    <xsl:template match="姓名">
       <xsl:value-of select="@学号"/>
    </xsl:template>
    <xsl:template match="英语|语文|数学">
       <xsl:if test=".[value() $lt$ 60]">
          <xsl:attribute name="style">color:red</xsl:attribute>
       </xsl:if>
       <xsl:if test=".[value() $eq$ 100]">
          <xsl:attribute name="style">color:green;font-weight:bold</xsl:attribute>
       </xsl:if>
       <xsl:value-of/>
       <xsl:element name="span">
          <xsl:attribute name="style">background-color:yellow;color:black;font-size:9.5pt</xsl:attribute>
       (
       <xsl:choose>
          <xsl:when test=".[value() $le$ 50]">很差</xsl:when>
          <xsl:when test=".[value() $lt$ 60]">不及格</xsl:when>
          <xsl:when test=".[value() $le$ 75]">一般</xsl:when>
          <xsl:when test=".[value() $le$ 85]">不错</xsl:when>
          <xsl:when test=".[value() $le$ 99]">很好</xsl:when>
          <xsl:otherwise>满分</xsl:otherwise>
       </xsl:choose>
       )
       </xsl:element>
    </xsl:template>
    </xsl:stylesheet>

    说明1:由于XSL文档也是一种XML规范文档,因此XML注释方式同样适用于XSL文档,即注释格式为:
                            <!-- 注释内容 -->
    说明2:xsl:if元素是条件判断元素,通常用于在定义模板时用来设置条件,实现对XML文档相应元素的筛选,并且将规定的结果树操作和样式表作用于满足条件的元素。xsl:if元素的基本格式为:
                            <xsl:if test=".[判断条件]">
                            ......
                            </xsl:if>
        其中test属性指定判断条件。通常其属性值为使用元素或元素的属性值作为筛选条件,比如“<xsl:if test=".[元素='元素值']">”或“<xsl:if test=".[@属性='属性值']">”(其中“.”表示引用当前标记,即当前元素;又如“..”表示当前元素的上级元素,即父元素);也可为上面例子中的形式,如“<xsl:if test=".[value() $lt$ 60]">”(含义是取当前标记的元素值并转为数值型数据后与数值60进行大小比较)等,其中“$lt$”是关系运算符中的小于,其它关系运算符还有小于等于“$le$”、大于“$gt$”、大于等于“$ge$”、等于“$eq$”、不等于“$ne$”等。另外,value()为XSL函数,其它常用XSL函数主要有text()、end()、index()等。
    说明3:xsl:choose元素、xsl:when元素、xsl:otherwise元素是多重条件判断元素。其基本格式如下:
                            <xsl:choose>
                               <xsl:when test=".[判断条件1]">......</xsl:when>
                               <xsl:when test=".[判断条件2]">......</xsl:when>
                               ......
                               <xsl:when test=".[判断条件n]">......</xsl:when>
                               <xsl:otherwise>......</xsl:otherwise>
                            </xsl:choose>
        其中,xsl:when元素满足判断条件时,执行输出该元素对中的内容,若每个xsl:when元素的判断条件都不满足,则执行输出xsl:otherwise元素对中的内容。xsl:otherwise元素可按实际需要,可用也可不用。
    说明4:xsl:element元素和xsl:attribute元素分别用来在XSL样式文件中动态地创建HTML标记和HTML标记的相关属性。由于多数HTML标记都具有属性,因此xsl:element元素和xsl:attribute元素通常是结合使用的。下面为它们的基本使用格式:
                            <xsl:element name="HTML标记名称">
                               <xsl:attribute name="HTML标记的属性名称">
                                   给定的属性值或者获取属性值的XSL语句
                               </xsl:attribute>
                            </xsl:element>
        比如,“<xsl:element name="TITLE">创建元素例子</xsl:element>”的转换结果为:<TITLE>创建元素例子</TITLE>
        比如,“<SPAN><xsl:attribute name="style">color:blue</xsl:attribute>创建元素例子</SPAN>”的转换结果为:<SPAN style="color:blue">创建元素例子</SPAN>


    综合举例:
    例3: 点击此处浏览,在浏览器中显示的情形见下图。

    下面为XML文件清单:
    <?xml version="1.0" encoding="GB2312" ?>
    <?xml-stylesheet type="text/xsl" href="8-3.xsl" ?>
    <!-- XML文档样例 -->
    <名册>
       <学员 学号="020101">
          <姓名>张三</姓名>
          <性别>1</性别>
          <年龄>35</年龄>
          <电话>50441299</电话>
          <电子邮件>zhangsan@136.com</电子邮件>
          <个人网址>www.136.net/ZhangSan</个人网址>
          <技能>木工</技能>
          <技能>弱电工</技能>
          <照片>zhangsan.jpg</照片>
       </学员>
       <学员 学号="020121">
          <姓名>李莹</姓名>
          <性别>0</性别>
          <年龄>33</年龄>
          <电话></电话>
          <电子邮件>LiY@yahoo.com</电子邮件>
          <个人网址>LiYing.51.net</个人网址>
          <技能>音乐</技能>
          <技能>计算机操作</技能>
          <照片>liying.jpg</照片>
       </学员>
       <学员 学号="020109">
          <姓名>张美丽</姓名>
          <性别>0</性别>
          <年龄>22</年龄>
          <电话>13635976837</电话>
          <电子邮件>zhangmeili@yahoo.com.cn</电子邮件>
          <个人网址></个人网址>
          <技能>拍电影</技能>
          <照片>zhangmeili.jpg</照片>
       </学员>
       <学员 学号="020138">
          <姓名>陆小弟</姓名>
          <性别>1</性别>
          <年龄>44</年龄>
          <电话>58331263</电话>
          <电子邮件>luxiaodi@citiz.com</电子邮件>
          <个人网址></个人网址>
          <技能>机械制图</技能>
          <技能>计算机操作</技能>
          <照片>luxiaodi.jpg</照片>
       </学员>
       <学员 学号="020106">
          <姓名>诸葛兰</姓名>
          <性别>0</性别>
          <年龄>37</年龄>
          <电话>13934367124</电话>
          <电子邮件>zhugelan@citiz.com</电子邮件>
          <个人网址/>
          <技能>舞蹈</技能>
          <照片>zhugelan.jpg</照片>
       </学员>
    </名册>

    下面为XSL文件清单:
    <?xml version='1.0' encoding="GB2312" ?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xmlns="http://www.w3.org/TR/REC-html40">
    <!-- 例子3:XSL文档样例 -->
    <xsl:template match="/">
       <html>
       <head>
          <title>例子3</title>
          <style>
             td {font-size:10.5pt;border-color:green;border-width:1pt;border-style:ridge}
             .title1 {font-size:12pt;font-weight:bold;color:red}
             .no {color:blue}
          </style>
       </head>
       <body>
          <center><font color="fuchsia" size="5" face="华文行楷,楷体_GB2312,黑体"><b>名 单</b></font><small>(按学号升序排列,凡30岁以上的女性学员全部列出来)</small></center>
          <table border="1" align="center">
             <tr align="center" class="title1">
                <td>学号</td>
                <td>姓名</td>
                <td>性别</td>
                <td>年龄</td>
                <td>电话</td>
                <td>电子邮件</td>
                <td>个人网址</td>
                <td>技能</td>
                <td>照片</td>
             </tr>
             <xsl:for-each select="名册/学员[性别='0' $and$ 年龄&gt;'30']" order-by="@学号">
             <tr valign="middle">
                <td class="no"><xsl:value-of select="@学号"/></td>
                <td><xsl:value-of select="姓名"/></td>
                <td align="center"><xsl:apply-templates select="性别"/></td>
                <td align="center"><xsl:value-of select="年龄"/></td>
                <td><xsl:apply-templates select="电话"/></td>
                <td><xsl:apply-templates select="电子邮件"/></td>
                <td><xsl:apply-templates select="个人网址"/></td>
                <td><xsl:apply-templates select="技能"/></td>
                <td><xsl:apply-templates select="照片"/></td>
             </tr>
             </xsl:for-each>
          </table>
       </body>
       </html>
    </xsl:template>
    <xsl:template match="性别">
       <xsl:if test=".[text()='0']">女</xsl:if>
       <xsl:if test=".[text()='1']">男</xsl:if>
    </xsl:template>
    <xsl:template match="电话">
       <xsl:value-of/>
       <small>
      (<xsl:choose>
          <xsl:when test=".[value() $gt$ 13000000000]">手机</xsl:when>
          <xsl:when test=".[value() $gt$ 50000000]">固定电话</xsl:when>
          <xsl:otherwise>无电话</xsl:otherwise>
       </xsl:choose>)</small>
    </xsl:template>
    <xsl:template match="电子邮件">
       <xsl:element name="a">
          <xsl:attribute name="href">
              mailto:<xsl:value-of/>
          </xsl:attribute>
          <xsl:value-of/>
       </xsl:element>
    </xsl:template>
    <xsl:template match="个人网址">
       <a>
       <xsl:attribute name="href">
          http://<xsl:value-of/>
       </xsl:attribute>
       <xsl:attribute name="target">_blank</xsl:attribute>
       <xsl:value-of/>
       </a>
    </xsl:template>
    <xsl:template match="技能">
       <xsl:value-of/><br/>
    </xsl:template>
    <xsl:template match="照片">
       <a>
       <xsl:attribute name="href"><xsl:value-of/></xsl:attribute>
       <xsl:element name="img">
          <xsl:attribute name="src">
              <xsl:value-of/>
          </xsl:attribute>
          <xsl:attribute name="border">0</xsl:attribute>
          <xsl:attribute name="title"><xsl:value-of/></xsl:attribute>
          <xsl:attribute name="width">75</xsl:attribute>
          <xsl:attribute name="height">100</xsl:attribute>
       </xsl:element>
       </a>
    </xsl:template>
    </xsl:stylesheet>

    注释1:为更灵活、更精确地设置筛选条件,XSL提供了三个布尔运算符:
        $and$表示连接的条件必须同时满足,只有当这些条件都正确时,相应的元素才能被作为数据提取的对象。
        $or$表示连接的条件中,只要能够满足其中的一条,相应的元素就能成为数据提取的对象。$or$可以用“||”来代替。
        $not$表示只要元素不满足作为运算对象的条件,那么该元素中的数据将被提取到结果树中。
    注释2:xsl:element和xsl:attribute元素对于动态定义标记时有很大用处,比如:                 <a>
                    <xsl:attribute name="href">
                       <xsl:value-of/>
                    </xsl:attribute>
                    超链接名
                    </a>
               不能改为:
                    <a href=>
                       <xsl:value-of/>
                    超链接名
                    </a>
    注释3:本例中的<xsl:template match="电话">模板定义中的<xsl:value-of/>语句,不能改为<xsl:value-of select="电话"/>。这是因为该语句中不加select属性,则表示取当前元素的元素值,而<xsl:template match="电话">语句已表明匹配的当前元素已经是“电话”,因此若使用了<xsl:value-of select="电话"/>,则表示取当前元素“电话”中的子元素“电话”的元素值,显然根本就不存在这种结构的元素。其他几个模板中的情况亦与此类似。


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    对工作,我投入;对爱情,我专一。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/5/18 17:05:00
     
     GoogleAdSense狮子座1981-8-20
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/1 3:39:15

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    120.117ms