3

我正在使用 XSLT。我知道内联函数表达式,有没有办法在 xpath 表达式中声明一个命名函数?因为我需要函数名来实现递归调用。

4

2 回答 2

3

在 XSLT 中,我只是建议以xsl:function这种方式使用您的函数有一个名称,并且您可以在函数体内递归地调用它。

至于纯 XPath 3,Dimitre 几年前在https://dnovatchev.wordpress.com/2012/10/15/recursion-with-anonymous-inline-functions-in-xpath-3-0-2/中探索了这条路使用let和高阶函数(不幸的是,Saxon 9 HE 不支持该功能),我认为他的代码使用的函数类型语法与最终规范不太一致,因此他的示例需要

let $f := 
    function($n as xs:integer,
             $f1 as function(xs:integer, function(*)) as xs:integer) as xs:integer {
        if ($n eq 0)
        then 1
        else $n * $f1($n -1, $f1)

    },
    $F := function($n as xs:integer) as xs:integer {
        $f($n, $f)
    }
return $F(5)

可以缩短为

let $f := 
    function($n as xs:integer,
             $f1 as function(xs:integer, function(*)) as xs:integer) as xs:integer {
        if ($n eq 0)
        then 1
        else $n * $f1($n -1, $f1)

    },
    $F := $f(?, $f)
return $F(5)

我认为给出了最新的允许语法。

于 2019-12-27T07:07:19.370 回答
1

没有办法在 XPath 中声明命名函数;XPath 3.1 只允许匿名内联函数,并且这些函数不能递归。有人告诉我,有一种方法可以使用一种称为 Y-combinators 的技术在匿名函数中实现递归,但它相当令人难以置信,我从来没有想过它。正如 Martin 所建议的,您最好的方法是将这部分逻辑放在 XSLT 级别。

于 2019-12-27T09:38:49.430 回答