人们经常可以找到漂亮的 XSLT 代码示例,尤其是当 XSLT 用作一种函数式编程语言时。
有关示例,请参阅这篇关于FXSL 2.0 的文章——XSLT 2.0的函数式编程库。
作为一种 FP 语言,XSLT 也是一种声明性语言。除其他外,这意味着一个人声明,指定现有关系。
这样的定义通常不需要任何额外的代码来产生结果——它本身就是它自己的实现,或者一个可执行的定义或可执行的规范。
这是一个小例子。
这个 XPath 2.0 表达式定义了“自然数的最大素因子”:
if(f:isPrime($pNum))
then $pNum
else
for $vEnd in xs:integer(floor(f:sqrt($pNum, 0.1E0))),
$vDiv1 in (2 to $vEnd)[$pNum mod . = 0][1],
$vDiv2 in $pNum idiv $vDiv1
return
max((f:maxPrimeFactor($vDiv1),f:maxPrimeFactor($vDiv2)))
用英语发音,一个数的最大素因数pNum
就是这个数本身,如果 pNum
是素数,否则如果 vDiv1
和vDiv2
是 的两个因数pNum
,那么 的最大素因数是和的最大素因数中pNum
较大的一个。vDiv1
vDiv2
我们如何使用它来实际计算XSLT 中的最大素因子?我们简单地将上面的定义包装在一个<xsl:function>
和......得到结果!
<xsl:function name="f:maxPrimeFactor" as="xs:integer">
<xsl:param name="pNum" as="xs:integer"/>
<xsl:sequence select=
"if(f:isPrime($pNum))
then $pNum
else
for $vEnd in xs:integer(floor(f:sqrt($pNum, 0.1E0))),
$vDiv1 in (2 to $vEnd)[$pNum mod . = 0][1],
$vDiv2 in $pNum idiv $vDiv1
return
max((f:maxPrimeFactor($vDiv1),f:maxPrimeFactor($vDiv2)))
"/>
</xsl:function>
然后,我们可以计算任何自然数的 MPF,例如:
f:maxPrimeFactor(600851475143)
= 6857
至于效率,嗯,这个转换只需要 0.109 秒。
其他优雅高效的 XSLT 代码示例: