IT技术江湖   操作系统   安全技术   平面设计   Web开发   数据库   互联网   搜索引擎   网络广告   
引擎技术江湖  BLOG  合作联系
本站
Google
IT技术江湖
首页>Web开发>xml XSLT> 在XSLT中用递归实现循环
  • IT技术江湖
  • 在XSLT中用递归实现循环
    http://www.hack1st.com 来源: 2008-03-18 阅读: 评论

      XSLT 是图灵完成的(Turing complete)。也就是说,如果有足够的内存,那么 XSLT 可以完成其他任何图灵完成语言(如 C++)所能完成的计算。对于属性更传统的语言的程序员来说,这可能有点奇怪。毕竟 XSLT 缺少对很多算法来说极其重要的特性,其中包括循环和可变的变量。

      注意:XSLT 所谓的变量在其他多数语言中称为常量。它们更像是代数变量而不是传统的编程变量。

      函数式编程

      上述的遗漏并非疏忽所致。XSLT 是一种函数式语言而不是过程性语言。在 C 或 Pascal 这样的过程性语言中,程序被定义成一系列的步骤,这些步骤按照规定的顺序执行,并在最后一步产生最终结果。在函数式语言中,程序被定义成由其他函数组成的函数,函数求值形成最终的结果。函数式语言的最大优点是执行的顺序无关紧要。作为一个简单的例子,考虑下面两个(代数)函数:

    f(x) = 2*x
    g(x) = x - 3

      设函数 h(x) 是 f 与 g 的复合函数:

    h(x) = f(g(x))

      对该函数求值可以先计算 g:

    h(x) = f(x - 3) = 2 * (x - 3) = 2x - 6

      也可以先计算 f:

    h(x) = 2 * g(x) = 2 * (x - 3) = 2x - 6

      两者的结果是一样的。语言的函数式使其更适合并行处理,因为问题的多个部分可以同时计算,无需担心其中的一部分要先于其他部分计算。线程安全是自动实现的。

      函数式语言包括 XSLT,但不能包含传统的循环,因为循环在时间上是有序的。就是说,典型循环的编写和编译必须保证 i==1 出现在 i==2 之前。当然,也可以反向而不是正向运行循环,或者使用 1 之外的循环计数器增量,甚至像 while 语句那样完全取消循环计数器。但是无论什么类型的循环,执行的顺序都至关重要,这一点与函数式编程正好相反。

      递归

      函数式编程中,传统语言中用循环完成的多数任务都可以使用递归来完成。参数代替了变量。比如,最近有人问我如何输出在编译时不知道数量的点(句点)。比方说,格式化菜单时可能要用到,因为在菜名和价格之间常常需要不同数量的点:

    Crawfish Etoufee.......$9.95
    Fried Chicken..........$6.95

      在 C 语言中可以编写一个简单的函数:

    void printDots(int n) {
     int i;
     for (i = 0; i < n; i++) {
      printf(".");
     }
     
    }

      但是这并不是解决问题的惟一办法。可以用递归代替循环,比如:

    void printDotsRecursively(int n) {
     if (n > 0) {
      printf(".");
      printDots(n-1);
     }
     
    }

      在 C 中很少这样做,但是在 XSLT 中,这是惟一的办法。

      下面的模板准确地生成 count 参数所传递的数量的点。逻辑很简单:如果 $count 的值大于零,就输出一个点,将 count 参数减去 1 后再调用这个函数;否则什么也不做。这与 printDotsRecursively 函数采用的算法基本相同,只不过是用 XSLT 而非 C 实现的:

     <xsl:template name="dots">
     
       <xsl:param name="count" select="1"/>
       <xsl:if test="$count > 0">
        <xsl:text>.</xsl:text>
        <xsl:call-template name="dots">
         <xsl:with-param name="count" select="$count - 1"/>
        </xsl:call-template>
       </xsl:if>
       
     </xsl:template>

      比如要输出 100 个点,用 100 count 参数值调用该函数:

      <xsl:call-template name="dots">
       <xsl:with-param name="count" select="100"/>
      </xsl:call-template>

      如果不希望传递一个常数值,那么还可以根据其他数据计算要打印的点数。比如,下面的指令分别计算价格和菜名的长度(更具体地说,是上下文节点中 price 和 entree 子元素的 string-values 函数值)后,输出足够做的点数将每个菜单行填充到 80 个字符:

      <xsl:call-template name="dots">
       <xsl:with-param name="count"

    上一页12 下一页

    上一篇:XML 和XSLT结合使你的网站设计浑然一体  
    下一篇:用于数据的XML: 用EXSLT扩展XSLT的功能

    ·网友互动--用户名: (新注册) 密码: 匿名评论 [所有评论]
    评论内容:(用户发表意见仅代表其个人意见,评论内容与本站立场无关,请自觉遵守互联网相关政策法规)
    关注此文读者还看过
    • ·让你的XSLT如虎添翼 -- 浅谈XSLT扩展
      ·利用XSLT 2.0成批处理XML
      ·用XSLT 2.0生成PHP
      ·XSLT介绍
      ·通过XSLT访问Java代码
      ·Saxon: 剖析XSLT处理器
      ·使用Java和XSLT生成动态Web页面
      ·XSLT处理程序是如何工作的
      ·用XSLT进行WSDL处理
      ·XSLT查找表中的默认值和错误处理
    最新更新
    • ·让你的XSLT如虎添翼 -- 浅谈XSLT扩展
      ·利用XSLT 2.0成批处理XML
      ·用XSLT 2.0生成PHP
      ·XSLT介绍
      ·通过XSLT访问Java代码
      ·Saxon: 剖析XSLT处理器
      ·使用Java和XSLT生成动态Web页面
      ·XSLT处理程序是如何工作的
      ·用XSLT进行WSDL处理
      ·XSLT查找表中的默认值和错误处理
    文章关注度排行
    ·XSLT处理程序是如何工作的
    ·使用Java和XSLT生成动态Web页面
    ·在XSLT中用递归实现循环
    ·让你的XSLT如虎添翼 -- 浅谈XSLT扩展
    ·用XSLT进行WSDL处理
    ·Saxon: 剖析XSLT处理器
    ·XSLT介绍
    ·用XSLT 2.0生成PHP
    热点推荐
    使用Java和XSLT生成动态Web页面
    使用Java和XSLT生成动态
    用XSLT进行WSDL处理
    用XSLT进行WSDL处理
    Saxon: 剖析XSLT处理器
    Saxon: 剖析XSLT处理器
    XSLT查找表中的默认值和错误处理
    XSLT查找表中的默认值和
    频道推荐
    • ·XSLT处理程序是如何工作的
    • ·使用Java和XSLT生成动态Web页面
    • ·用XSLT进行WSDL处理
    • ·Saxon: 剖析XSLT处理器
    • ·XSLT介绍
    • ·XML 和XSLT结合使你的网站设计浑然一体
    • ·通过XSLT访问Java代码
    • ·XSLT查找表中的默认值和错误处理
    本站精华
    XSLT查找表中的默认值和错误处理
    XSLT查找表中
    用XSLT进行WSDL处理
    用XSLT进行WS
    使用Java和XSLT生成动态Web页面
    使用Java和XS
    • ·XSLT介绍
    • ·通过XSLT访问Java代码
    • ·Saxon: 剖析XSLT处理器
    • ·使用Java和XSLT生成动态Web页
    • ·XSLT处理程序是如何工作的
    • ·用XSLT进行WSDL处理
    • | 网站导航 | 联系QQ | 编辑邮箱 | RSS订阅 | 友情链接 | 官方blog
    • 版权所有:IT技术江湖 @2007-2008
    • powered by www.hack1st.com online services. all rights reserved.京ICP备07005766号