新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   >>中国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语法介绍 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 50662 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: XSL语法介绍 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     hsower 帅哥哟,离线,有人找我吗?狮子座1983-8-21
      
      
      威望:7
      等级:大四寒假(收到IBM的Offer啦)
      文章:72
      积分:1606
      门派:XML.ORG.CN
      注册:2004/4/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hsower发送一个短消息 把hsower加入好友 查看hsower的个人资料 搜索hsower在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hsower的博客楼主
    发贴心情 XSL语法介绍

    首先注意到的是,XSL文件本身即是一份 XML文件,所以在XSL文件的开头,一样有和XML文件相同的声明。W3C这个XML的标准机构为XSL定义了很多标记(元素),XSL文件就是这些标记和HTML标记的组合。在XSL文件中,必须有如下一行的代码:

      <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

      这里,xsl:stylesheet是XSL文件的根元素,在根元素中包含了所有的排版样式,样式表就是由这些排版样式组合成的;xmlns:xsl="http://www.w3.org/TR/WD-xsl"这一句主要用来说明该XSL样式表是使用W3C所制定的XSL,设定值就是XSL规范所在的URL地址。

      实际上,这里"http://www.w3.org/TR/WD-xsl"就是一个名字空间(namespace),我们在上面关于XML Schema语法介绍的时候已经进行过介绍。这是一个标准的名字空间。"stylesheet","template","for-each"等等关键字都是这个名字空间所定义的。

      当然在xsl:stylesheet还可以设定其他的属性,其他的属性有:

       1. default-space:决定是否保留XML文件中的空白,仅当值为"default"时保留。  

       2. indent-result:决定是否保留XSL文件中的空白,值为"yes"时保留。  

       3. language:设定在XSL文件中使用的脚本语言。

      然后,我们在上面的代码中看到有如下的代码:

      <xsl:template match="/">
        ………
      </xsl:template>

      这里实际上是表示了XSL解析器对XML文档的处理过程,它从根节点(由match="/"决定,这里"/"就表示根节点)开始,对XML文档进行遍历,并根据具体的代码从XML文档中取出相关的内容。这里关于属性match的取值是一个比较复杂的问题。它实际上表示的含义是从XML文档中取出一个特定的节点集合(XML文档可以被看成一个树的结构,这个在后面关于XML解析器分析中有详细的介绍)。这里,我们通过几个简单的例子来说明属性match的取值。

      比如下面一行代码:

      <xsl:template match="/">

      这行代码的意思是告诉XSL解析程序,当前需要处理的节点是根节点下的内容(用"/"来表示根节点),其实这里的match值内容的编写是要符合XPath的语意。关于XPath我们在后面的章节中会进行详细的介绍。

      再举一个例子:

      <xsl:template match="shoppingcart/item">

      这行代码要匹配的是shoppingcart元素下的item元素。而不管shoppingcart在XML文档结构树下的哪一个位置。比如XML文档的其中一段是这样的。

      <shoppingcart>
      <item>
      <itemNo>3333</itemNo>
      <itemName>屠龙刀</itemName>
      </item>
      <item>
      <itemNo>4444</itemNo>
      <itemName>离别钩</itemName>
      </item>
      </shoppingcart>

      那么它匹配的内容就是
       <item>
       <itemNo>3333</itemNo>
       <itemName>屠龙刀</itemName>
       </item>
       <item>
       <itemNo>4444</itemNo>
       <itemName>离别钩</itemName>
       </item>

      而下面这个例子:

      <xsl:template match="/shoppingcart/item">

    表示只匹配XML文档根节点下的shoppingcart这个节点下的所有item元素。也就是说如果shoppingcart不是直接在根节点下的,它就不符合这个匹配条件。

      再看一个例子:

      <xsl:template match="price[@unit='USD']">

    这个例子说明要匹配的是这样的节点:一个带unit属性的元素price,而且unit的值必须为"USD"。比如一段XML代码是这样的。

      <price>
       <unit>USD</unit>
       <amount>100</amount>
      </price>
      <price>
       <unit>RMB</unit>
       <amount>300</amount>
      </price>

      那么它匹配的内容就是:

      <price>
       <unit>USD</unit>
       <amount>100</amount>
      </price>

      实际上,存在许多各种符号用来表示匹配规则,我们在XPath语法介绍中会详细涉及到。现在知道这么一个大概的概念就可以了。

      我们用<xsl:template match="具体匹配表达式">这条语句找到了一些节点集合以后,我们就要从这个集合中找到特定的元素或者元素属性的值,那么采用什么语句呢?就是用xsl:value-of select = ""这样的语句来寻找特定的内容。

      比如下面的例子中<xsl:value-of select="名称"/>这行代码就是表示定位XML文档中的名称元素的内容。在指定集合中可能存在多个名字元素,如果我们需要把它们一一列举出来进行处理的话,就需要用到语句xsl:for-each select = "",注意这里涉及到一个作用范围的概念,也就是说xsl:for-each select = ""这条语句是在一个指定的集合空间中执行的。比如上面例子中如下的代码

      这里的<xsl:for-each select="词语">是在<xsl:template match="网络用语集合">所指定的集合空间里面寻找元素"词语"的。

      同时,我们需要注意的是上面的代码中,出现了一条语句

       <xsl:apply-templates select="网络用语集合" />

      它表示什么意思呢,它实际上相当于C++中的一个过程调用,当XSL解析器执行到该语句的时候,它就会在代码中寻找以<?xml:namespace prefix = xsl /><xsl:template match="网络用语集合">开头的代码,所以在上面的例子程序中,以下的代码可以看成是过程的实现。

      
      把看成是一个过程调用,把<xsl:template match="网络用语集合">  

      …….
      </xsl:template>

      看成是过程的实现,有助于我们对XSL解析器执行过程的理解。这里match="网络用语集合"可以理解为是传递给过程的参数,它表示过程实现体的集合范围是该match所匹配的节点集合空间("网络用语集合")。

      如果我们要对表格中的元素进行排序该什么办呢?比如说,在上面的例子中,我们需要按照名称进行排序。很简单对,改写为如下的形式即可:

      <xsl:for-each select="词语" order-by="+名称">,其中"+"表示按降序排列;"-"表示按升序排列。"order-by"是XSL语法中的关键字。

      如果我们只想在列表中取出某几行该怎么操作呢?比如我们只想取出名称为"恐龙"的行,见下面的代码:

      这里有一个新的句法为:<xsl:template match="网络用语集合">  
      <table Border="1">
       <xsl:for-each select="词语" order-by="-名称">
       <xsl:if test=".[名称='恐龙']">
       <tr>
        <td><xsl:value-of select="名称"/></td>
        <td><xsl:value-of select="含义"/></td>
       </xsl:if>
       </xsl:for-each>  
      </table>
      </xsl:template>

      

      它表示如果".[名称='恐龙']"为真(TRUE)的话,就执行该段里面的语句,要是为假(FALSE)的话就不执行。它和C++中的if语句的概念基本是一样的。

      前面我们用<xsl:value-of select=""/>取出的都是一个元素的值,但是我们要取出元素某一个属性的值该怎么做呢?采用下面的形式:

      <xsl:value-of select="元素名称/@属性名称"/>

      比如一段XML代码是这样的:

      <王朔 网址="www.wangshuo.com">知名作家加著名评论家王朔先生的地方</王朔>

      我们可以用<xsl:value-of select="王朔/@网址"/>来得到值"www.wangshuo.com"。

      以上包括了XSL的大多数基本的语法,更加详细和完整的介绍需要参看W3C相关的最新的文档,可以在WWW.W3C.ORG/TR下找到。

      根据上面的分析,我们可以看到XSL实际上采用的是一种转换的思想,它最终将XML文档转换为另一种可用于输出的文档,而CSS则没有任何转换动作,在整个过程中没有任何新码产生。 另外,在XSL中90%的样式规定在CSS中都有定义,但仍然有一些效果是CSS无法描述的,必须使用XSL不可。这些功能包括文本的置换、根据文本内容决定显示方式、文档内容排序等,都是XSL所独有的。再者,XSL遵从XML的语法,而CSS的语法自成体系。  

      选择样式单还要考虑不同浏览器对样式单的支持程度。目前IE5与Netscape的最新版本都支持CSS,但支持的程度都有限。至今为止,IE5尚不能完全支持CSS1,即便是支持的部分也存在很多错误,对于CSS2也只提供部分支持。Netscape在对CSS的支持上已经优于IE5,它采用新一代的Raptor/Gecko引擎技术,已经能够完全支持CSS1,但对CSS2的支持计划尚不明朗。而对XSLT而言,只有IE5支持,Netscape5并不支持。


       收藏   分享  
    顶(3)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2004/6/19 14:14:00
     
     cuimingda 帅哥哟,离线,有人找我吗?魔羯座1901-1-1
      
      
      等级:大一新生
      文章:26
      积分:147
      门派:XML.ORG.CN
      注册:2005/3/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cuimingda发送一个短消息 把cuimingda加入好友 查看cuimingda的个人资料 搜索cuimingda在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看cuimingda的博客2
    发贴心情 

      前面我们用<xsl:value-of select=""/>取出的都是一个元素的值,但是我们要取出元素某一个属性的值该怎么做呢?采用下面的形式:
      <xsl:value-of select="元素名称/@属性名称"/>
      比如一段XML代码是这样的:
      <王朔 网址="www.wangshuo.com">知名作家加著名评论家王朔先生的地方</王朔>
      我们可以用<xsl:value-of select="王朔/@网址"/>来得到值"www.wangshuo.com"。


    研究了一个多小时,怎么从xsl中读取xml的属性值,谢谢啦。

    ----------------------------------------------
    我是一只小海豚 在网络的海洋里寻找自己的知识天堂 在社会的海洋里寻找自己的爱情天使

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/10 17:07:00
     
     java99 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:19
      积分:138
      门派:XML.ORG.CN
      注册:2005/3/3

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给java99发送一个短消息 把java99加入好友 查看java99的个人资料 搜索java99在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看java99的博客3
    发贴心情 
    非常感谢
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/4/17 10:42:00
     
     bluekeke 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:4
      积分:72
      门派:XML.ORG.CN
      注册:2005/5/26

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给bluekeke发送一个短消息 把bluekeke加入好友 查看bluekeke的个人资料 搜索bluekeke在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看bluekeke的博客4
    发贴心情 
    辛苦了
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/10/7 18:43:00
     
     carygrant 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:16
      积分:134
      门派:XML.ORG.CN
      注册:2005/5/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给carygrant发送一个短消息 把carygrant加入好友 查看carygrant的个人资料 搜索carygrant在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看carygrant的博客5
    发贴心情 
    请教一下,ie6对css和xml的支持程度又如何呢?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/10/20 18:49:00
     
     karl_chen 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:6
      积分:87
      门派:XML.ORG.CN
      注册:2005/10/17

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给karl_chen发送一个短消息 把karl_chen加入好友 查看karl_chen的个人资料 搜索karl_chen在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看karl_chen的博客6
    发贴心情 
    不怎么样,IE6对xml命名空间只支持老版本的,而且你也可以编写一个xml文件和一个xsl文件,其中xsl是用来将xml文件以xml格式输出的,结果你就会发现ie无法按照你想要的输出了.
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/10/21 16:02:00
     
     xueanda 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:11
      积分:96
      门派:XML.ORG.CN
      注册:2005/10/22

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给xueanda发送一个短消息 把xueanda加入好友 查看xueanda的个人资料 搜索xueanda在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看xueanda的博客7
    发贴心情 
    终于明白~~~~~~~~`:)
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/10/22 2:10:00
     
     Ignorence 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:63
      门派:XML.ORG.CN
      注册:2005/10/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Ignorence发送一个短消息 把Ignorence加入好友 查看Ignorence的个人资料 搜索Ignorence在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Ignorence的博客8
    发贴心情 
    <?xml version="1.0" encoding="GB2312"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:template match="/">
      <xsl:apply-templates select="StudentInfo/Student"/>
     </xsl:template>
     <xsl:template match="StudentInfo/Student">
      <xsl:apply-templates select="Name"/>
     </xsl:template>
     <xsl:template match="Name">
      <xsl:value-of/>
     </xsl:template>
    </xsl:stylesheet>
    这里用<xsl:value-of/>应该可以把Name元素的内容输出啊,为什么总是报错:"缺少所需的属性 'select'."?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/10/30 21:07:00
     
     weiwei811130 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:3
      积分:62
      门派:XML.ORG.CN
      注册:2005/11/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给weiwei811130发送一个短消息 把weiwei811130加入好友 查看weiwei811130的个人资料 搜索weiwei811130在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看weiwei811130的博客9
    发贴心情 
    受益了
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/2 15:20:00
     
     Ignorence 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:63
      门派:XML.ORG.CN
      注册:2005/10/30

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Ignorence发送一个短消息 把Ignorence加入好友 查看Ignorence的个人资料 搜索Ignorence在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看Ignorence的博客10
    发贴心情 
    问题已经解决了.
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/11/3 10:27:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/29 10:32:51

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

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