XSLT3.0への道(16) 閑話休題 Exelt

ほったらかしにしていて閑話休題もないですが、


で紹介した.Exeltの開発が進んでいるようです.

A distributed, streaming XSLT 3.0 processor .Net 
Exelt

7月22日にprivate betaの予定とのことですが、まだ遅れているようです.でもデモページでサンプルが見られます.


でもここにのっているサンプルを見てなんのことかと考え込んでしまいました.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
    exclude-result-prefixes="xs"    
    version="3.0">
    <xsl:output method="xml" version="1.0" use-when="1"/>
    <xsl:template match="/">
        <xsl:apply-templates select="concat('&quot;', ?, '&quot;')" />
    </xsl:template>
    <xsl:template match="~function( * )">
        <h1>
            <xsl:value-of select=".('Hello world')" />
        </h1>
    </xsl:template>
</xsl:stylesheet>

<xsl:template match="~function( * )">は関数にマッチするテンプレートを表しています.でも、それを呼び出していると思われる、

<xsl:apply-templates select="concat('&quot;', ?, '&quot;')" />

は何なのでしょう?このコードを実行すると

<?xml version="1.0" encoding="UTF-8"?><h1>"Hello world"</h1>

と出力されます.

そうでした、このapply-templatesは「関数」に「テンプレートを適用」しているのでした.つまり、標準の関数concatにマッチしたら、select=".('Hello world')"で文字列'Hello world'を渡して、処理させます.この場合、ダブルクォートで囲まれた結果が返ります.

concat('&quot;', ?, '&quot;')は「カリー化」された関数です.単なるconcatではなく、3つの引数のうち最初と最後がクォートである関数を表しています.

ためしにoXygen15に搭載されているSaxon 9.5(oXygen14.2の9.4ではダメ)で次のように変えて試してみました.

<?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:output method="xml" version="1.0" use-when="1"/>
    <xsl:template match="/">
        <xsl:apply-templates select="function-lookup(xs:QName('ahf:doBold'),1)" />
    </xsl:template>
    <xsl:function name="ahf:doBold" as="node()">
        <xsl:param name="prmInput" as="xs:string"/>
        <span style="font-weight:bold">
            <xsl:value-of select="$prmInput"/>
        </span>
    </xsl:function>
    <xsl:template match="~function( * )">
        <h1>
            <xsl:copy-of select=".('Hello world')" />
        </h1>
    </xsl:template>
</xsl:stylesheet>

この結果は、

<?xml version="1.0" encoding="UTF-8"?>
<span style="font-weight:bold">Hello world</span>
</h1>

となります.思ったとおりでした.XSLT3.0では関数に対してもapply-templatesができてしまいます.スゴイ!相当勉強して頭を切り替えないといけません.

ちなみにこのExeltの作者Abel Braaksmaによる紹介プレゼンテーションが以下にあります.


ぜひご覧ください.