XSLT 2.0で便利になった機能(23) コンテキストに関する関数

コンテキストに関する情報を扱う関数について紹介します.
 
■ current()
current()はXSLT1.0ではnodeでの使用があたりまえでした.例えば
 
<xsl:template match="doc">
    <xsl:apply-templates select="chapter[@xml:lang=current()/@xml:lang]"/>
</xsl:template>
 
のように使えば、doc/@xml:langと同じ値を@xml:langに持ったchapterが処理されます.わざわざ次のように書かなくとも良かったわけです.
 
<xsl:template match="doc">
    <xsl:variable name="doc" select="."/>
    <xsl:apply-templates select="chapter[@xml:lang=$doc/@xml:lang]"/>
</xsl:template>
 
XSLT2.0では、current()はnodeだけでなく一般的なitem()を返すようになっています.例えば
 
<xsl:variable name="lang"
              as="xs:string*"
              select="('en-GB','en-US','ja','zh-CN','zh-TW','ko')"/>
<xsl:template match="set">
    <xsl:variable name="set" as="element()" select="."/>
    <xsl:for-each select="$lang">
        <xsl:apply-templates select="$set/book[@xml:lang=current()]"/>
    </xsl:for-each>
</xsl:template>
 
というテンプレートは、set/bookを変数$langに定義されている'en-GB','en-US','ja','zh-CN','zh-TW','ko'の順に処理します.
 
current()は"[]"(predicate)の中でそのXPath式の外のコンテキストアイテムを参照するのに便利です.従来はカレントノードと表現してきたのですが、XSLT2.0ではカレントノードという言い方はなくなり、コンテキストアイテムという言い方に置き換えられました.current()という名前はXSLT1.0からのなごりの名前ですね.
 
■ default-collation()
既定のコレーションURIを返します.
 
<xsl:message>default-collation()="<xsl:value-of select="default-collation()"/>"</xsl:message>
 
とすれば、
 
 
と表示されます.パラメータでコレーションURIを与えて、比較をする際に既定値として使用するくらいでしょう.
 
■ current-group(), current-group-key()
この2つの関数は、<xsl:for-each-group>と組み合わせて使用します.項を改めて紹介したいと思います.