前にも述べましたがXSLT 3.0の「高階関数」の機能はオープンソースのSaxon HEでは使えません.と思っていたら最新のoXygenで外部プラグインとして、最新の9.7.0.15が使用できるとのメールがありました.早速ダウンロードして見ると次のように組み込むことが出来ます.
oXygenにはXSLTスタイルシートのデバッグができる機能があるのですが、それは使えないとのこと.これには特別なビルドをしたSaxonが必要なのです.しかし、最新のSaxon EEを使ったXSLTスタイルシートの検証と実行はできます.つぎのようにオプションでXSLT 3.0のValidation Engineの設定を変えてやれば良いのです.
これで単に文字列を返す関数を作りそれを配列にしてみました.最新のSaxonを使用しているので、今度は検証エラーは出ません.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:array="http://www.w3.org/2005/xpath-functions/array"
xmlns:ahf="http://www.acme.com/names/xslt"
exclude-result-prefixes="xs"
version="3.0">
<xsl:function name="ahf:returnFuncArray" as="array(function(*)*)">
<xsl:variable name="f1" as="function(*)" select="function() as xs:string {'売っちゃった'}"/>
<xsl:variable name="f2" as="function(*)" select="function() as xs:string {'タダ同然で'}"/>
<xsl:variable name="f3" as="function(*)" select="function() as xs:string {'国有地!'}"/>
<xsl:variable name="f4" as="function(*)" select="function() as xs:string {'「云々」も'}"/>
<xsl:variable name="f5" as="function(*)" select="function() as xs:string {'読めずに話した'}"/>
<xsl:variable name="f6" as="function(*)" select="function() as xs:string {'下手英語!'}"/>
<xsl:variable name="f7" as="function(*)" select="function() as xs:string {'媚びるのと'}"/>
<xsl:variable name="f8" as="function(*)" select="function() as xs:string {'ゴルフだけは'}"/>
<xsl:variable name="f9" as="function(*)" select="function() as xs:string {'うまくなり'}"/>
<xsl:sequence select="[($f1,$f2,$f3),($f4,$f5,$f6),($f7,$f8,$f9)]"/>
</xsl:function>
<xsl:template match="/">
<xsl:variable name="funcVar" as="array(function(*)*)" select="ahf:returnFuncArray()"/>
<xsl:for-each select="1 to array:size($funcVar)">
<xsl:variable name="functions" as="function(*)*" select="$funcVar(position())"/>
<xsl:variable name="haiku" as="xs:string*" select="for $n in 1 to count($functions) return $functions[$n]()"/>
<xsl:message select="string-join($haiku,' ')"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
いざこれを実行してみると次のような画面になります.ちゃんと関数の配列は機能していてくれます.