我正在使用 XSLT。我知道内联函数表达式,有没有办法在 xpath 表达式中声明一个命名函数?因为我需要函数名来实现递归调用。
问问题
194 次
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 回答