XSLT3.0への道(23) 配列型(オマケ)

前にも述べましたがXSLT 3.0の「高階関数」の機能はオープンソースのSaxon HEでは使えません.と思っていたら最新のoXygenで外部プラグインとして、最新の9.7.0.15が使用できるとのメールがありました.早速ダウンロードして見ると次のように組み込むことが出来ます.

イメージ 1

oXygenにはXSLTスタイルシートデバッグができる機能があるのですが、それは使えないとのこと.これには特別なビルドをしたSaxonが必要なのです.しかし、最新のSaxon EEを使ったXSLTスタイルシートの検証と実行はできます.つぎのようにオプションでXSLT 3.0のValidation Engineの設定を変えてやれば良いのです.

イメージ 2


これで単に文字列を返す関数を作りそれを配列にしてみました.最新のSaxonを使用しているので、今度は検証エラーは出ません.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    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>

いざこれを実行してみると次のような画面になります.ちゃんと関数の配列は機能していてくれます.

イメージ 3


でも高階関数(High Order Function)はとても便利な機能です.オープンソース版でこれが出来てしまえばSaxonicaのビジネスモデルはなくなっちゃうのでしょうけれども、ちょっと残念ではあります.