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

    >> 本版讨论XSL,XSLT,XSL-FO,CSS等技术
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XSL/XSLT/XSL-FO/CSS 』 → [转载]了解XSLT 2.0新特性 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 3404 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: [转载]了解XSLT 2.0新特性 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     hgpimac 帅哥哟,离线,有人找我吗?
      
      威望:1
      等级:大三暑假(编写VC程序赚了5000元)
      文章:141
      积分:886
      门派:XML.ORG.CN
      注册:2006/1/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hgpimac发送一个短消息 把hgpimac加入好友 查看hgpimac的个人资料 搜索hgpimac在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hgpimac的博客楼主
    发贴心情 [转载]了解XSLT 2.0新特性

    应用程序开发者应了解XSLT 2.0新特性 作者: builder.com.cn
    2007-03-21 15:49:48

    除非你整个假期一直在看《萤火虫》(Firefly)全集和电影《冲出宁静号》(即Serenity,根据Firefly改编),并比较家庭成员向洗劫一个小镇的Reavers怪物打开他们的礼物,否则你可能已经听说现在万维网联盟在推荐XSLT 2.0。
    你想到的问题是——现在推荐XSLT 2.0是什么意思?简单来说,这表示XSLT 2.0就像刻在了石头上,那些编写XSLT的程序员现在可以使用它,写他们的XSLT处理器,而不必担心被最后一刻的改变弄得不知所措。
    不过,对我来说,XSLT 2.0得到正式采用和度假这两件事激发我建立一个XSLT 2.0最佳功能的简短列表。你可以把它看作是一个“最佳”特性集,我认为它们是最常用的一些特性。XSLT 1.0中有一些特性,我发现我一年之中也只用了一两次。除开那些现在无益的特性,我主要讨论那些能够立即满足应用程序开发需求的特性。
    分组
    我发现,似乎每次我开始写一个XSL式样表, 随后就需要用到分组信息。这种需求可能是由于某种对数据进行分类,使其更具可读性的深层次要求所引起的;或者只是由于我神经过敏!可能制定这些要求的人以 前在国家狩猎委员会工作:“你可以钓一只鲑鱼和六磅其它供垂钓的鱼或一磅供垂钓的鱼和一只鲑鱼。”如果你曾经看过有关钓鱼方面的法律,你就会明白我的意 思。
    在XSLT 1.0中,使用分组就像在冒险,这些事情需要不断实践,像是在洞穴探险时不被Grue怪吃掉。XSLT 1.0中的首选分组方法叫做Meunchian分组,它由Oracle的Steve Meunch开发。
    它的工作方式如下:编码一个xsl:key元素,指定将会用作关键字的元素或属性,以及关键字提交的元素。比较每个关键字的第一个实例提交的元素的 ID和文档中的相同元素ID即可完成分组。如果两个ID匹配,则节点相同。这保证式样表中每个关键字只处理一次,并可以处理含有那个关键字值的所有元素。
    下面列出一个XML样本文档和一个XSLT 1.0 Muenchian分组实例,如列表A和B。
    列表A——XML样本文档
    <?xml version="1.0" encoding="UTF-8"?>
    <world>
    <country name="Canada" continent="North America">
    <city>Toronto</city>
    <city>Vancouver</city>
    </country>
    <country name="Jamaica" continent="North America">
    <city>Kingston</city>
    <city>Ocho Rios</city>
    </country>
    <country name="United States" continent="North America">
    <city>Allentown</city>
    <city>Mobile</city>
    </country>
    <country name="United Kingdom" continent="Europe">
    <city>London</city>
    <city>Dundee</city>
    </country>
    <country name="France" continent="Europe">
    <city>Paris</city>
    <city>Nice</city>
    </country>
    <country name="Japan" continent="Asia">
    <city>Tokyo</city>
    <city>Osaka</city>
    </country>
    </world>
    列表B——XSLT 1.0 Muenchian分组
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:key name="keyContinent" match="//country" use="@continent"/>
    <xsl:template match="/">
    <xsl:element name="world">
    <xsl:for-each select="//country[generate-id(.) = generate-id(key('keyContinent',@continent)[1])]">
    <xsl:sort select="@continent" data-type="text" order="ascending"/>
    <xsl:variable name="continent" select="@continent"/>
    <xsl:apply-templates select="//country[@continent = $continent]" mode="group">
    <xsl:sort select="@name" data-type="text" order="ascending"/>
    </xsl:apply-templates>
    </xsl:for-each>
    </xsl:element>
    </xsl:template>
    <xsl:template match="*" mode="group">
    <xsl:copy-of select="."/>
    </xsl:template>
    </xsl:stylesheet>
    在XSLT 2.0中,分组方法有了一些改变,但应该指出的是,Meunchian分组方法依然可用。所不同的是,Meunchian分组为可选方法,因为XSLT 2.0中内置了分组功能,因此实际上不必再使用Meunchian分组。开发者可以使用xsl:for-each-group来代替它,如列表C所示。
    列表C——XSLT 2.0中的分组
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes">
    <xsl:template match="/">
    <xsl:element name="world">
    <xsl:for-each-group select="//country" group-by="@continent">
    <xsl:sort select="@continent" data-type="text" order="ascending"/>
    <xsl:variable name="continent" select="@continent"/>
    <xsl:apply-templates select="//country[@continent = $continent]" mode="group">
    <xsl:sort select="@name" data-type="text" order="ascending"/>
    </xsl:apply-templates>
    </xsl:for-each-group>
    </xsl:element>
    </xsl:template>
    <xsl:template match="*" mode="group">
    <xsl:copy-of select="."/>
    </xsl:template>
    </xsl:stylesheet>
    虽然这些分组方法各不相同,但它们的最终结果是一样的,如列表D所示。
    列表D——分组结果
    <?xml version="1.0" encoding="UTF-8"?>
    <world>
    <country name="Japan" continent="Asia">
    <city>Tokyo</city>
    <city>Osaka</city>
    </country>
    <country name="France" continent="Europe">
    <city>Paris</city>
    <city>Nice</city>
    </country>
    <country name="United Kingdom" continent="Europe">
    <city>London</city>
    <city>Dundee</city>
    </country>
    <country name="Canada" continent="North America">
    <city>Toronto</city>
    <city>Vancouver</city>
    </country>
    <country name="Jamaica" continent="North America">
    <city>Kingston</city>
    <city>Ocho Rios</city>
    </country>
    <country name="United States" continent="North America">
    <city>Allentown</city>
    <city>Mobile</city>
    </country>
    </world>
    多文档输出
    在使用XSLT 1.0时,我经常遇到式样表输出限制。我指的是文档输出问题,它一次只允许输出一个文档。这表示有必要在结果文档生成时进行处理。
    以列表A中的XML文档为例,假设我们要把它分成几个XML文档,每个国家一个。过去必须用选择的语言编写一些代码建立单独的XML文档。XSLT 2.0改变了这种做法。
    现在XSLT 2.0使用xsl:result-document元素,它与xsl:output元素结合生成几个输出文档。有趣的是,使用方法属性,不同的xsl:output文档可以用来生成不同的文档类型。列表E中的式样表说明了使用这种特性的一种可能方法,列表F-L中的XML文档为处理结果。
    列表E——在XSLT 2.0中生成多个输出文档
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes">
    <xsl:output name="xml" method="xml"/>
    <xsl:template match="/">
    <xsl:apply-templates select="//country"/>
    </xsl:template>
    <xsl:template match="country">
    <xsl:variable name="name" select="concat(@name,'.xml')"/>
    <xsl:result-document href="" format="xml">
    <xsl:copy-of select="."/>
    </xsl:result-document>
    </xsl:template>
    </xsl:stylesheet>
    列表F -- Canada.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <country name="Canada" continent="North America">
    <city>Toronto</city>
    <city>Vancouver</city>
    </country>
    列表H -- Jamiaca.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <country name="Jamaica" continent="North America">
    <city>Kingston</city>
    <city>Ocho Rios</city>
    </country>
    列表I -- United States.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <country name="United States" continent="North America">
    <city>Allentown</city>
    <city>Mobile</city>
    </country>
    列表J -- United Kingdom.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <country name="United Kingdom" continent="Europe">
    <city>London</city>
    <city>Dundee</city>
    </country>
    列表K -- France.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <country name="France" continent="Europe">
    <city>Paris</city>
    <city>Nice</city>
    </country>
    列表 L -- Japan.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <country name="Japan" continent="Asia">
    <city>Tokyo</city>
    <city>Osaka</city>
    </country>
    其它特性
    除已经列举的特性外,我的最喜爱特性列表中还有其它一些特性。第一个是XPath 2.0支持。作为一个XML爱好者,我期待着试用这些新特性和XPath 2.0的功能。第二个特性,XQuery 1.0,可帮助其他人更易于理解XSLT。XQuery 1.0有望帮助那些对XPath“过敏”的用户使用XSLT 2.0。
    应用XSLT 2.0
    不幸的是,如果你对试用XSLT 2.0版本的新特性感兴趣,当前只能使用少数几个处理器。第一个为Michael Kay的Saxon处理器,如果你希望遵从万维网联盟的推荐,这个开源XSLT处理器为你提供了一个选择。另一个是Altova的XMLSpy处理器,它是我见过的速度最快的XML编辑器。它们的网站提供这个处理器的30天试用版本。唯一的问题是,30天试用到期后,你就想购买这个处理器了!


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    量力而行,不求最好,只要不错就行!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/22 20:45:00
     
     hgpimac 帅哥哟,离线,有人找我吗?
      
      威望:1
      等级:大三暑假(编写VC程序赚了5000元)
      文章:141
      积分:886
      门派:XML.ORG.CN
      注册:2006/1/8

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hgpimac发送一个短消息 把hgpimac加入好友 查看hgpimac的个人资料 搜索hgpimac在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hgpimac的博客2
    发贴心情 
    经测试,原文列表E中有点问题,改为:
       <xsl:result-document href="{$name}" format="xml">
    就是href变了一下,测试在xmlspy2007中通过。

    为了生成的xml文件有缩进格式,最好在output中加上indent,如下:
    <xsl:output name="xml" method="xml" indent="yes"/>

    ----------------------------------------------
    量力而行,不求最好,只要不错就行!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/23 8:57:00
     
     jx 帅哥哟,离线,有人找我吗?
      
      
      等级:大四(GRE考了1500分!)
      文章:232
      积分:1079
      门派:XML.ORG.CN
      注册:2007/1/10

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

    ----------------------------------------------
    岁月在人的心里留下痕迹~

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/25 6:40:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XSL/XSLT/XSL-FO/CSS 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2026/9/13 21:53:03

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

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