特に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
が の 2 つの因数である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 コードの他の例: