以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 XSL/XSLT/XSL-FO/CSS 』 (http://bbs.xml.org.cn/list.asp?boardid=8) ---- (转载)在 XSLT 中用递归实现循环 (http://bbs.xml.org.cn/dispbbs.asp?boardid=8&rootid=&id=20998) |
-- 作者:d_hao20@ustc.edu -- 发布时间:8/9/2005 12:47:00 PM -- (转载)在 XSLT 中用递归实现循环 在 XSLT 中用递归实现循环 扩展 XSLT 能力的技术 XSLT 是一种函数式编程语言,类似于 Haskell 或 Scheme,但是与 C 和 Fortran 不同。因此这种语言没有循环,也没有可变的变量。相反,必须用递归和参数来代替这些结构。这篇技巧示范了如何使用命名模板和 xsl:call-template、xsl:with-param、xsl:param 元素来提供这种功能。 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++) { if (n > 0) { <xsl:if test="$count > 0"> |
-- 作者:菜籽 -- 发布时间:8/10/2005 11:52:00 AM -- 怎么没有人顶啊,好贴
|
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
62.500ms |