【问题标题】:Is XSLT a functional programming language?XSLT 是一种函数式编程语言吗?
【发布时间】:2008-09-21 02:21:44
【问题描述】:

关于函数式编程语言的几个问题让我开始思考 XSLT 是否是一种函数式编程语言。如果没有,缺少哪些功能? XSLT 2.0 是否缩短或缩小了差距?

【问题讨论】:

  • Eric,您很想知道 XSLT 3.0 一种真正的函数式编程语言。它使用 XPath 3.0,其中函数是第一类对象,可以作为参数传递给其他函数或作为调用函数的结果返回。
  • 我看到你是关于复数视觉的优秀 XML 课程

标签: xslt functional-programming fxsl


【解决方案1】:

XSLT 是声明性的,而不是有状态的。

虽然 XSLT 是基于函数式编程思想的,但它不是一个完整的函数式编程语言,它缺乏将函数视为第一类数据类型的能力。它具有惰性求值等元素,可减少不必要的求值,并且不存在显式循环。

不过,就像函数式语言一样,我认为它可以与跨多个处理器的自动安全多线程很好地并行化。

来自Wikipedia on XSLT

作为一种语言,XSLT 受到以下因素的影响 函数式语言,并通过 基于文本的模式匹配语言 像 SNOBOL 和 awk。它最直接 前身是 DSSSL,一种语言 为 SGML 执行相同的功能 XSLT 为 XML 执行的。 XSLT 可以 也被视为模板 处理器。

这是一个在 FXSL 的帮助下使用 XSLT as a functional language 的好网站。 FXSL 是一个实现对高阶函数的支持的库。

由于 FXSL,我认为 XSLT 本身不需要功能齐全。也许 FXSL 将来会作为 W3C 标准包含在内,但我没有这方面的证据。

【讨论】:

  • @recursive:这些不是命令意义上的循环。不保证执行顺序(这简化了并行实现)。我认为与xsl:for-each 类似,您可以在集合上创建一个投影
  • @Abel:输出的顺序似乎有保证,我看不出实际执行顺序和最终结果的顺序之间有什么有用的区别。这似乎是一个实现细节。
  • @recursive,确切地说,这就是为什么这些循环与命令式语言中的循环不同的原因。假设您有一个xsl:message,它会产生副作用,但不能保证调用它的频率和顺序(尽管有一些方法可以强制执行)。所以,这不仅仅是一个实现细节。然而,它在很大程度上是函数式编程的一个属性。
  • 您链接的伟大网站是 404 :C
【解决方案2】:

我相信你们现在已经找到了这个链接 :-) http://fxsl.sourceforge.net/articles/FuncProg/Functional%20Programming.html .

XSLT 中的函数是一流的公民,毕竟有一些变通办法 :-)

【讨论】:

    【解决方案3】:

    这就是我在编程时的感觉。

    XSLT 完全基于定义函数并将它们应用于输入流中的选定事件。

    XSLT 允许您设置变量。函数式编程不允许函数有副作用 - 这是一个大问题。

    尽管如此,使用 XSLT 编写时,“感觉就像以 FP 方式工作一样。您正在使用输入 - 您没有更改它 - 以创建输出。

    这是一种非常、非常不同于使用 DOM API 时使用的编程模型。 DOM 根本不分离输入和输出。你得到了一个数据结构——你可以按照你认为合适的方式破坏它——没有犹豫、限制或悔恨。

    只要说你喜欢 FP 及其背后的原则,你可能会觉得在其中工作很舒服。就像事件驱动编程的经验(以及 XML 本身)一样,您也会对它感到满意。

    如果您唯一的经验是使用自上而下的非事件驱动程序 - 那么 XSLT 将是非常陌生的,确实是陌生的风景。至少一开始是这样。积累一点经验,然后当 XPath 表达式和事件处理对您来说真的很舒服时再回到 XSLT,将会获得丰厚的回报。

    【讨论】:

    • 是的,XSL 让你设置一个变量,但它是不可变的。
    • 你是对的!我在这一点上是正确的。感谢您关注它。一旦在 XSLT 中设置了变量值,就无法更改它。当我忘记/忽略这一点时,我实际上遇到了一些问题。
    • 你知道,我认为他们应该在语言本身中更明确地说明这一点,因为我相信你和我不是唯一陷入这种情况的人。 <variable> 让我想到了一些变化(在运行时)-<constant> 会更准确。事实上,我记得我使用 XSLT 的经历很尴尬,特别是因为我希望它的行为方式与它实际上并不打算的方式不同,就像 Java 程序员第一次使用 Javascript 时的感觉一样。跨度>
    • @CamiloMartin,它被称为变量,因为它可以根据select-表达式或包含sequence constructor 的上下文而变化。一个常数在整个程序中都是相同的。这里的混淆是变量不能在同一范围内重新分配。但它的值绝对是variable,因此得名。反之亦然:XSLT 没有常量的概念(这在 XSLT 3.0 中有所改变)。
    • @Abel 4 年多之后,但我仍然觉得 XSLT 令人难以置信。这就像有人设计了一艘宇宙飞船来修剪草坪。
    【解决方案4】:

    在很大程度上,XSLT 不是 100% 函数式编程语言的原因在于它无法将函数视为一流的数据类型。

    可能还有其他一些——但这是显而易见的答案。

    祝你好运!

    【讨论】:

      【解决方案5】:

      Saxon-SA 引入了一些扩展函数,使 XSLT 正常工作。您可以使用saxon:function() 创建一个函数值(实际上是一个{http://net.sf.saxon/java-type}net.sf.saxon.expr.UserFunctionCall 值),然后使用saxon:call() 调用它。

      Saxon-B 与 saxon:expression()saxon:eval() 的配对具有相似的功能。不同之处在于saxon:expression() 采用任何XPath 表达式,saxon:eval() 对其求值,而saxon:function() 采用saxon:call() 调用的函数的名称。

      【讨论】:

      • fwiw 这在 .NET 中也可以通过扩展再次实现,而且恕我直言不那么优雅
      • XSLT 中的函数式编程不需要扩展,Jeni 很清楚这一点:fxsl.sf.net。 FXSL——XSLT 的函数式编程库已经存在 8 年多了。它完全用 XSLT 本身编写。几乎完全实现了 Haskell Prelude 函数。
      • 在 XPath 3.0 或 3.1 附带的 XSLT 3.0 中,函数现在是一等公民,可以作为项目传递或调用等。不再需要扩展。
      【解决方案6】:

      这不是真正的参数,因为您只能声明变量,而不能在声明后更改它们的值。从这个意义上说,它是声明式而不是命令式,正如 Novatchev 先生的文章中所述。

      Scheme 或 Erlang 等函数式编程语言也可以让您声明变量,在 Haskell 中您也可以这样做:

      -- 函数 'test' 获取变量 x 并将其添加到列表 xs 的每个元素上

      test :: [Int] -> [Int]
      test xs = map (+ x) xs
      where x = 2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-27
        • 2010-09-28
        • 2018-02-22
        • 2011-09-04
        • 2017-12-16
        • 2011-01-17
        • 1970-01-01
        • 2011-03-18
        相关资源
        最近更新 更多