気の向くままに辿るIT/ICT/IoT
XSLT

【Callable Components / 呼び出し可能なコンポーネント】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0

ホーム前へ次へ
XSLTのCallable Components / 呼び出し可能なコンポーネント?

【Callable Components / 呼び出し可能なコンポーネント】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0

XSLT 2.0【Callable Components / 呼び出し可能なコンポーネント】とは

 W3C勧告XSLTバージョンXSLT 2.0の「Callable Components / 呼び出し可能なコンポーネント」とは

 XSL Transformations (XSLT) Version 2.0 / W3C Recommendation 23 January 2007の目次に沿った日本語訳です。

 当サイト管理人が2009年04月、意訳したものですが、構文解釈の違いや翻訳の違いが含まれるかもしれません。正式文書はW3C 各種仕様書(英語版)である事を予めご了承ください。

<< 9. 変数とパラメータ / Variables and Parameters

XSLT 2.0呼び出し可能なコンポーネント目次


10 呼び出し可能なコンポーネント / Callable Components
 10.1 名前付きテンプレート Named Templates
  10.1.1 通過パラメータ Passing Parameters to Templates
  10.1.2 トンネルパラメータ Tunnel Parameters
 10.2 名前付き属性セット Named Attribute Sets
 10.3 スタイルシート関数 Stylesheet Functions

10 呼び出し可能なコンポーネント

このセクションは、スタイルシートのいかなる場所からも行使できるサブルーチンのような機能性を提供する為に利用される事が可能な 名前付きテンプレート(参照:10.1 名前付きテンプレート)、 名前付き属性セット(参照先: 10.2 名前付き属性セット)、 スタイルシート関数(参照:10.3 スタイルシート関数) という3つの構築を記述します。

10.1 名前付きテンプレート

<!-- カテゴリ: 命令 -->
<xsl:call-template
  name = qname>
  <!-- Content: xsl:with-param* -->
</xsl:call-template>

[定義:  テンプレートは名前によって行使される事ができます。 name 属性を伴うxsl:template 要素は、名前付きテンプレートを定義します。 ] name 属性の値は、5.1 適格な名前で記述したように拡張されるQNameです。 もし、xsl:template 要素が、 name 属性を持つ場合には、それは、必要はありませんが、 match 属性も持つ場合があります。 xsl:call-template 命令は、名前によってテンプレートを実行します; それは、行使されるテンプレートを識別する name 属性を要求しています。 xsl:apply-templatesxsl:call-template 命令とは違い、 focus/フォーカスを変更しません。

xsl:template 要素上にある matchmodepriority 属性は、 テンプレートが、xsl:call-template 命令によって実行される際には、存在しない効果を持ちます。 とてもよく似た xsl:template 要素上にある name 属性は、 テンプレートが、 xsl:apply-templates 命令によって実行される際には、存在しない効果を持ちます

[ERR XTSE0650] もし、スタイルシートにあるいくつかの xsl:templatename 属性とマッチしない name 属性のある xsl:call-template 命令を含む場合には、 それは、静的エラーです。

[ERR XTSE0660] もし、スタイルシートが、同じ名前と同じ取り込み優先度を持つテンプレートを1つ以上含む場合には、 それが、同じ名前とより高い取り込み優先度を持つテンプレートもまた含まない限り(含んでいる場合を除き)、 それは、静的エラーです。

xsl:call-template 命令における目標テンプレートは、 xsl:call-template 命令の name 属性とマッチする name 属性のあるテンプレートと この名前を伴ういくつかの他のテンプレートよりも、より高い取り込み優先度を持ちます。 xsl:call-template 命令の評価結果は、 その目標テンプレートの中で含んだシーケンスコンストラクタ (参照先: 5.7 シーケンスコンストラクタ) を評価する事によって生成したシーケンスです。

10.1.1 テンプレートにパラメータを通過させる

<xsl:with-param
  name = qname
  select? = expression
  as? = sequence-type
  tunnel? = "yes" | "no">
  <!-- Content: sequence-constructor -->
</xsl:with-param>

パラメータは、 xsl:with-param 要素を利用してテンプレートを通過させます。 要求した name 属性は、テンプレートパラメータの名前を記述します (変数は、置き換えられるように結び付けられた値)。 name 属性の値は、5.1 適格な名前で記述したように拡張されるQNameです。

xsl:with-param は、 xsl:call-templatexsl:apply-templatesxsl:apply-importsそして xsl:next-match の中で許容されます。

[ERR XTSE0670] もし、単独の xsl:call-templatexsl:apply-templatesxsl:apply-importsまたは、 xsl:next-match が、 name 属性とのマッチを伴う2つ以上の xsl:with-param 要素を含む場合には、 それは、静的エラーです。

パラメータの値は、 xsl:variablexsl:param (参照:9.3 変数とパラメータの値)における同じ方法で記述され、 selectas 属性の値のアカウントと、 もしあれば、 xsl:with-param 要素のコンテンツを取得します。

注釈:

それは、呼んだテンプレートの公式パラメータを記述している xsl:param 要素との一致における as 属性とは異なる xsl:with-param 要素上にある as 属性を持つ事を可能とします。

このシチュエーションでは、提供したパラメータの値は、 xsl:with-param 要素上にある as 属性の規則と一致して最初に処理されるでしょう、 更に結果値は、 xsl:param 要素上にある違う as 属性の規則と一致してその時に処理されるでしょう。

例えば、提供した値が、 タイプ注釈 xs:untypedAtomic を伴うノードであり、 xsl:param 要素が、 as="xs:double" を記述する間、 xsl:with-param 要素は、 as="xs:integer" を記述するものとします。 その時、そのノードは、最初に原子化され、区分されない原子化された値の結果は、 xs:integer に投入されるでしょう。 もし、これが成功であれば、 xs:integer は、その時、 xs:double に昇格されるでしょう。

focus/フォーカスが、 xsl:with-param 要素によって記述した値の算出において利用した事は、 それが現れる中にある xsl:apply-templatesxsl:apply-importsxsl:next-match、または、 xsl:call-template 要素において利用したのと同じです。

[ERR XTSE0680] xsl:call-template のケースでは、 x と名付けたテンプレートパラメータを持たないテンプレートに x と名付けたパラメータをトンネルせずに通過させる事は、 xsl:call-template 命令において後方互換性挙動が利用可能とならない限り、 それは、静的エラーですxsl:apply-templatesxsl:apply-importsxsl:next-match のケースでは、つまり、パラメータが単に無視されるケースでは、これは、エラーではありません。

付加的な tunnel 属性は、トンネルパラメータであるパラメータを示すために利用される場合があります。 既定は、 no です。 トンネルパラメータは、10.1.2 トンネルパラメータの中で記述されます。

[ERR XTSE0690] もし、テンプレートが、 仮に呼んだ命令によって提供されるこのパラメータにおいて存在しない値である場合に required="yes" と記述し、 tunnel="yes" と記述しない テンプレートパラメータを宣言する xsl:call-template を利用して 実行される場合には、それは、静的エラーです。

[ERR XTDE0700] 他のケースでは、もし、テンプレートが、 required="yes" と呼んだ命令によって提供されるこのパラメータにおいて 存在しない値を伴うテンプレートパラメータを宣言する実行がなされる場合には、 回復されない動的エラーです。

例:名前付きテンプレート

この例は、数字のフォーマットを操作する為の引数を伴う numbered-block において名前付きテンプレートを定義します。

<xsl:template name="numbered-block">
	<xsl:param name="format">1. 
</xsl:param>
	<fo:block>
		<xsl:number format="{$format}"/>
		<xsl:apply-templates/>
	</fo:block>
</xsl:template>
<xsl:template match="ol//ol/li">
	<xsl:call-template name="numbered-block">
		<xsl:with-param name="format">a. 
</xsl:with-param>
	</xsl:call-template>
</xsl:template>

注釈:

XPath 関数呼び出しの一部として提供したスタイルシート関数への引数は、 10.3 スタイルシート関数参照。

10.1.2 トンネルパラメータ

[定義:  パラメータは、トンネルパラメータとして定義される場合があり、それはテンプレートを通過させます。 トンネルパラメータは、それが呼び、その為に再帰的にあるいくつかの違うテンプレートの為にテンプレートを呼ぶことによって自動的に通過させるプロパティを持ちます。 ] トンネルパラメータは、このように、パラメータを認知している段階中に利用したそれぞれのテンプレートの為に必要とする事なく、処理するスタイルシート全体の段階中にアクセスされる設定をされる値を許容します。

注釈:

トンネルパラメータは、いくつかの機能上のプログラム言語にある動的にスコープした変数にとてもよく似た概念です。

トンネルパラメータは、 tunnel="yes" を記述する xsl:with-param 要素を利用して生成されます。 トンネルパラメータの値へのアクセスを要求したテンプレートは、 tunnel="yes" をも記述する xsl:param 要素を利用して宣言しなければいけません。

xsl:apply-templates を利用して呼ぶいくつかのテンプレートにおいては、 xsl:call-templatexsl:apply-imports または、 xsl:next-match 命令、トンネルパラメータのセットは、 呼んだテンプレートを呼んでいるテンプレートから通過させます。 このセットは、 <xsl:with-param tunnel="yes"> を利用して明示的に生成したいくつかのパラメータで構成し、トンネルパラメータの基準セット上に置きます。 もし、 xsl:apply-templatesxsl:call-templatexsl:apply-imports 、 または、 xsl:next-match 命令が、スタイルシートにある先祖要素として xsl:template 宣言を持つ場合には、 その基準セットは、テンプレートを通過させるトンネルパラメータで構成します; その他のものは、 (例えば、もし命令が、グローバル変数宣言、属性セット 宣言、または、スタイルシート関数の中にある場合)、 基準セットは、カラです。 もし、 パラメータが、基準セットにあるパラメータとして同じ拡張QNameを持つ <xsl:with-param tunnel="yes"> を利用して生成した場合には、 xsl:with-param を利用して生成したパラメータは、基準セットにあるパラメータを優先します; その他のものは、 xsl:with-param を利用して生成したパラメータは、基準セットに追加されます。

テンプレートが、 xsl:param tunnel="yes" を伴うそれを宣言する事によって トンネルパラメータの値にアクセスする際には、 これは、このテンプレートによって呼んだいくつかのテンプレートを通過させるトンネルパラメータの基準セットからパラメータを削除しません。

2つの氏族 xsl:with-param 要素は、トンネルパラメータ1つで他にない時でさえ、パラメータ名を識別していなければいけません。 同様に、テンプレートパラメータを再表示する2つの氏族 xsl:param 要素は、 トンネルパラメータが1つで他にない場合でさえ、パラメータ名を識別していなければいけません。 しかしながら、テンプレート呼び出しの中で暗黙の内に通過させるトンネルパラメータは、 同じ呼び出しで明示的に通過させる非トンネルパラメータの複数の名前である名前を持つ場合があります。

トンネルパラメータは、スタイルシート関数を呼ぶ中では、通過させません。

他の全ての xsl:with-paramxsl:param のオプションは、 非トンネルパラメータを伴っているかのようにトンネルパラメータを利用可能にします。 例えば、パラメータは、命令として、付加的な既定値として宣言される場合があり、既定値が記述される場合と要求タイプが記述される場合があります。 もし、いくつかの変換が、 xsl:param で記述した要求タイプに提供したトンネルパラメータの値から要求される場合には、 その変換した値は、再帰的にテンプレート内で利用されますが、しかし、その値は、変換前に提供したオリジナルの値であるいくつかの違うテンプレート呼び出しの中で通過させます。 同様に、 いくつかの既定値は、違うテンプレート呼び出しの中で通過させるトンネルパラメータのセットを変更しないトンネルパラメータにおいては既定値を記述しているテンプレートへの位置です。

トンネルパラメータのセットは、カラである初期テンプレートを通過させます。

トンネルパラメータは、ビルトイン(組み込み)テンプレート規則を通して変更せずに通過させます (参照先: 6.6 ビルトイン(組み込み)テンプレート規則)。

例:トンネルパラメータを利用する

順次的な番号付けがなされるが、しかし、等式が現れる中において文脈に依存する番号のフォーマットである科学紙にある等式があるものとします。 それは、フォームの規則を利用してこれを反映する事を可能とします:

<xsl:template match="equation">
	<xsl:param name="equation-format" select="'(1)'" tunnel="yes"/>
	<xsl:number level="any" format="{$equation-format}"/>
</xsl:template>

このレベルの上にあるいくつかの処理のレベルでは、等式がどのように番号付けされるかを決める事を可能とし、例えば、:

<xsl:template match="appendix">
	...
	<xsl:apply-templates>
		<xsl:with-param name="equation-format" select="'[i]'" tunnel="yes"/>
	</xsl:apply-templates>
	...
</xsl:template>

そのパラメータ 値は、 match="equation" を伴う規則に到達する場合を除き、テンプレート規則の全ての中間レイヤーを通して透過を通過させます。 その効果は、パラメータが、変換の異なる段階中に異なる値を取得する事ができる場合を除き、グローバル変数を利用する事にとてもよく似ています。

10.2 名前付き属性セット

<!-- カテゴリ:宣言 -->
<xsl:attribute-set
  name = qname
  use-attribute-sets? = qnames>
  <!-- Content: xsl:attribute* -->
</xsl:attribute-set>

[定義:  xsl:attribute-set 要素は、異なる要素の構築を繰り返し利用される事が可能な属性定義のコレクションである名前付き属性セットを定義します。 ]

要求した name 属性は、属性セットの名前を記述します。 name 属性の値は、5.1 適格な名前で記述した拡張されるQNameです。 xsl:attribute-set 要素の内容は、そのセットにある属性を生成する為に評価されるゼロ以上の xsl:attribute 命令で構成します。

属性セットを評価した結果は、属性ノードのシーケンスです。 同じ属性セット評価は、他方で属性セットは、パラメータを持つ事をせず、それは、式、または、文脈の評価に依存する値のある命令を含む場合があるので1回以上異なる結果を生成する事ができます。

属性セットは、 xsl:element 上にある use-attribute-sets 属性、 または、 xsl:copy 命令を記述する事によって、または、 リテラル結果要素上にある xsl:use-attribute-sets 属性を記述する事によって利用されます。 属性セットは、 xsl:attribute-set 要素それ自身にある use-attribute-sets 属性を利用する事によって他の属性セットの用語の中に定義される場合があります。 [xsl:]use-attribute-sets 属性の値は、属性セットの名前のホワイトスペースで区切られたリストケースごとにあります。 それぞれの名前は、5.1 適格な名前で記述したように拡張さるQNameです。

use-attribute-sets 属性を記述することは、 use-attribute-sets 属性で記述される属性セットの名前において同じ命令にある [xsl:]use-attribute-sets 属性を伴う命令の内容の始まるところに名前付き属性セットごとに各属性における xsl:attribute 命令を追加する事と広義においては(同じではないものの)同様です。

より公式には、 xsl:use-attribute-sets 属性は、次に続く再帰的なアルゴリズム、または、同じ結果を生成するいくつかのアルゴリズムを利用して拡張されます:

  • 属性の値は、QNameのリストとしてトークン分割されます。

  • リスト中の各QNameは、次に続くように命令の中で処理されます:

    • QNameは、スタイルシートにある xsl:attribute-set 宣言内の1つ以上の name 属性とマッチしなければならない。

    • 名前がマッチする各 xsl:attribute-set 宣言は、次に続くように処理される。 2つのこのような宣言が、異なる取り込み優先度を持つ場合、 取り込み優先度の低い方から最初に処理される。 2つの宣言が、同じ取り込み優先度である場合、それらは、宣言指定の中で処理される。

xsl:attribute 命令は、要素を評価する事において利用されるのと同じfocus/フォーカスを利用して評価されます。 要素は、アルゴリズムに初期入力を形成する [xsl:]use-attribute-sets 属性の親です。 しかしながら、評価における静的文脈は、スタイルシートにある xsl:attribute 命令の位置に依存します: このように、単に xsl:attribute 命令内で宣言したローカル変数とグローバル変数は、可視です。

xsl:use-attribute-sets を拡張する事によって生成される属性ノードのセットは、同じ名前を持ついくつかの属性を含む場合があります。 属性が、要素ノードに追加される際には、単に複数ある中の1つが、効果を受け取ります。

各命令における方法は、関連する命令における仕様で記述される [xsl:]use-attribute-sets 属性を拡張した結果を利用します:11.1 リテラル結果要素11.2 [ xsl:element ]を利用して要素ノードを生成する 11.9 ノードをコピーする参照。

[ERR XTSE0710] もし、xsl:copyxsl:element 、または、 xsl:attribute-set 要素の use-attribute-sets 属性の値、または、リテラル結果要素xsl:use-attribute-sets 属性の値が、 QNamesホワイトスペース区切りのシーケンスでない場合、 または、 もし、スタイルシートにあるいくつかの xsl:attribute-set 宣言の name 属性とマッチしないQNameを含む場合には、 それは、静的エラーです。

[ERR XTSE0720] もし、直接 xsl:attribute-set 要素、または、間接的に use-attribute-sets 属性に含んだ名前経由でそれ自身を参照する場合には、それは、静的エラーです。

属性セットを拡張する事によって生成された各属性ノードは、属性ノードを生成した xsl:attribute 命令における規則によって決められるタイプ注釈を持ちます: 11.3.1 構築した属性ノードにおけるタイプ注釈を設定する参照。 これらのタイプ注釈は、属性が利用される中において要素を創出する命令における規則によって保存、除去、または、置換される場合があります。

属性セットは、次に続くように利用されます:

  • xsl:copyxsl:element 命令は、 use-attribute-sets 属性を持ちます。 この属性を評価する事によって生成した属性ノードのシーケンスは、命令の中に含んだシーケンスコンストラクタをシーケンスの先頭に追加されます。

  • リテラル結果要素は、 xsl:elementxsl:copyuse-attribute-sets 属性と同じ方法で評価される xsl:use-attribute-sets 属性を許容します。 この属性を評価する事によって生成した属性ノードのシーケンスは、リテラル結果要素を伴って含んだシーケンスコンストラクタを評価する事によって生成したシーケンスを先頭に追加されて戻る中で、リテラル結果要素の属性を評価する事によって生成した属性ノードのシーケンスを先頭に追加されます。

例:属性セットを利用する

次に続く例は、名前付き属性セット title-style を創出し、テンプレート規則の中でそれを利用します。

<xsl:template match="chapter/heading">
	<fo:block font-stretch="condensed" xsl:use-attribute-sets="title-style">
		<xsl:apply-templates/>
	</fo:block>
</xsl:template>
<xsl:attribute-set name="title-style">
	<xsl:attribute name="font-size">12pt</xsl:attribute>
	<xsl:attribute name="font-weight">bold</xsl:attribute>
</xsl:attribute-set>

 

例:属性セットにある最優先属性

次に続く例は、名前付き属性セット base-style を創出し、 属性の複数の仕様を伴うテンプレート規則の中でそれを利用します:

font-family

単に属性セットの中に記述されます

font-size

属性セットの中に記述され、リテラル結果要素上に、また xsl:attribute 命令の中に記述されます

font-style

属性セットの中とリテラル結果要素上に記述されます

font-weight

属性セットの中に、また xsl:attribute 命令の中に記述されます

スタイルシート断片:

<xsl:attribute-set name="base-style">
	<xsl:attribute name="font-family">Univers</xsl:attribute>
	<xsl:attribute name="font-size">10pt</xsl:attribute>
	<xsl:attribute name="font-style">normal</xsl:attribute>
	<xsl:attribute name="font-weight">normal</xsl:attribute>
</xsl:attribute-set>
<xsl:template match="o">
	<fo:block xsl:use-attribute-sets="base-style"
			font-size="12pt"
			font-style="italic">
		<xsl:attribute name="font-size">14pt</xsl:attribute>
		<xsl:attribute name="font-weight">bold</xsl:attribute>
		<xsl:apply-templates/>
	</fo:block>
</xsl:template>

結果:

<fo:block font-family="Univers"
		font-size="14pt"
		font-style="italic"
		font-weight="bold">
...
</fo:block>

10.3 スタイルシート 関数

[定義:  xsl:function 宣言は、スタイルシートにあるいくつかのXPath から呼ばれる事が可能な名前、パラメータ、スタイルシート関数の手法を宣言します。 ]

<!-- カテゴリ:宣言 -->
<xsl:function
  name = qname
  as? = sequence-type
  override? = "yes" | "no">
  <!-- Content: (xsl:param*, sequence-constructor) -->
</xsl:function>

xsl:function 宣言は、スタイルシートの中で利用した(パターンにある述語の中で利用したXPath式を含む)いくつかのXPath から呼ばれる事が可能なスタイルシート関数を定義します。 name 属性は、関数の名前を記述します。 name 属性の値は、5.1 適格な名前で記述したように拡張されるQNameです。

xsl:function 宣言は、スタイルシートモジュールにあるトップレベル要素としてのみ現れる事が可能です。

[ERR XTSE0740] スタイルシート関数は、既定関数名前空間にある関数を伴ういくつかの衝突のリスクを排除する為に前置詞付きの名前を持っていなければいけません。 もし、名前が存在しない前置詞を持つ場合には、それは、静的エラーです。

注釈:

結果文書内に現れる関数名において利用した名前空間宣言を回避する為には、 xsl:stylesheet 要素上にある exclude-result-prefixes 属性上で利用します:11.1.3 リテラル結果要素における名前空間ノード参照。

前置詞は、予約済み名前空間を参照してはいけません[参照:ERR XTSE0080]

xsl:function 要素の内容は、関数によって返される為の値を定義するシーケンスコンストラクタによって次に続く関数の公式な引数を記述するゼロ以上の xsl:param 要素で構成します。

[定義:  スタイルシート関数のarity(関数における引数の数)は、関数定義にある xsl:param 要素の数です。 ] 付加的な引数は、許容されません。

[ERR XTSE0760] スタイルシート関数呼び出しにおける引数は、全て記述されなければならないので、 xsl:function 要素内にある xsl:param 要素は、既定値を記述してはいけません: これが意味するところは、それらは、カラにしなければならずselect 属性を持つ必要はないという事です。

スタイルシート関数は、(以下でない限り)スタイルシートの中で利用した全てのXPath式において、 静的文脈の スコープ内関数 に含まれます。

付加的な override 属性は、もし、手法によって、または、 [implementation-defined] メカニズムを利用して静的文脈の中で利用可能となった関数として同じ名前とarityを持つ場合には、何が起きるかを定義します。 もし、 override 属性が、値 yes を持つ場合には、この関数は優先して利用されます; もし、それが、値 no を持つ場合には、他の関数が優先して利用されます。 既定値は、 yes です。

注釈:

override="yes" を記述する事は、同じコードが、すべてのプロセッサで実行するインターオペラビリティ挙動を保証します。 override="no" を記述する事は、いくつかのプロセッサで可能となる関数のフォールバック(縮退)手法を記述する際に利便性がありますが、その他のプロセッサにはありません: それは、より効率的な拡張関数である場合には、利便性のあるスタイルシート手法における優先の中で利用される為の関数(または、拡張関数のようなユーザーの記述した手法)のベンダーの手法を許容します。

override 属性は、同じ名前とarityが、優先して取得するいくつかのスタイルシート関数において決定する規則には作用 しません

[ERR XTSE0770] 同じ拡張QNameと arity 、そしてより高い取り込み優先度を持つその他の関数がない限り、スタイルシートにおいて2つ以上の 同じ拡張QName、 同じarity、 、同じ取り込み優先度を伴う関数を含む事は、静的エラーです。

XPathで定義したように、関数は、関数呼び出しにある引数の名前と数がマッチする名前とarityのある関数において静的文脈のスコープ内関数の中で探す事によって識別される関数呼び出しの結果として実行されます。

注釈:

関数は、ポリモーフィック([polymorphic]多形体・同質異像体)ではありません。 たとえ、XPath 関数呼び出しメカニズムが、同じ名前、異なるarityを持つ2つの関数を許容したとしても、 それは、それらの引数のタイプによって識別される為のそれらを許容するわけではありません。

付加的な as 属性は、関数の結果の要求タイプを表示します。 as 属性の値は、[XPath 2.0]で定義したようにシーケンスタイプXPです。

[ERR XTTE0780] もし、 as 属性が記述される場合には、 シーケンスコンストラクタ(参照:5.7 シーケンスコンストラクタ)によって評価した結果は、 関数変換規則を利用して要求タイプに変換されます。 もし、この変換が失敗する場合には、それは、タイプエラーです。 もし、 as 属性が省略される場合には、算出した結果は、提供した時に利用され、存在しない変換が行われます。

もし、スタイルシート関数が、固有の拡張QNameを伴って定義されている場合には、 この同じ拡張QNameに拡張する語彙的なQNameである引数を伴い、呼ばれた際に「true」を返すであろう function-available を呼びます。

xsl:param 要素は、関数に公式な引数を定義します。 これらは、局地的に解釈されます。 関数が、XPath にある関数呼び出し(ファンクションコール)を利用して呼ばれた際には、提供した最初の引数は、 最初の xsl:param 要素に割り当てられ、次に提供した引数は、 xsl:param 要素に2番目に割り当てられ。。。つづく。

xsl:param 要素の as 属性は、パラメータの要求タイプを定義します。 xsl:param 要素ごとによって要求したタイプを関数呼び出しの中で提供した実際の引数の値に変換する事については、[XPath 2.0]で定義されます。 適用する規則は、XPath 1.0互換性モードが、 false に設定される場合には、それらのケースです。

[ERR XTTE0790] もし、スタイルシート関数へのパラメータの値が、要求タイプに変換できない場合には、タイプエラー がシグナル出力されます。

もし、 as 属性が省略される場合には、存在しない変換がおこなわれ、いくつかの値が許容されます。

スタイルシート関数の本体内では、focus/フォーカスは、初期の未定義です; これが意味するところは、いくつかの文脈アイテム、文脈位置、または、文脈サイズを参照する為の試みは、回復されない動的エラーであるという事です。 [XPDY0002]

関数呼び出しが書かれる場合には、その位置でスコープにあったローカル変数の値にアクセスする為のスタイルシート関数の本体内では、利用可能ではありません。 グローバル変数は、しかしながら、そのまま利用可能です。

例:スタイルシート関数

次に続く例は、文(センテンス)を提供した中にある語句を逆にする str:reverse を指定した再帰的なスタイルシート関数を創出し、 その時、テンプレート規則の中からこの関数を実行します。

<xsl:transform 
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
	xmlns:str="http://example.com/namespace"
	version="2.0"
	exclude-result-prefixes="str">
<xsl:function name="str:reverse" as="xs:string">
	<xsl:param name="sentence" as="xs:string"/>
	<xsl:sequence	
		 select="if (contains($sentence, ' '))
			 then concat(str:reverse(substring-after($sentence、 ' ')),
			 ' ',
			 substring-before($sentence, ' '))
			 else $sentence"/>
</xsl:function>
<xsl:template match="/">
<output>
	<xsl:value-of select="str:reverse('DOG BITES MAN')"/>
</output>
</xsl:template>
</xsl:transform>

同じ関数を書く選択的な方法は、XSLTレベルにある条件付きロジックを実行する事です。この(以下の)ように:

<xsl:function name="str:reverse" as="xs:string">
	<xsl:param name="sentence" as="xs:string"/>
	<xsl:choose>
		<xsl:when test="contains($sentence, ' ')">	
			<xsl:sequence select="concat(str:reverse(substring-after($sentence, ' ')),
				' ',
				substring-before($sentence, ' '))"/>
		</xsl:when>
		<xsl:otherwise>
			<xsl:sequence select="$sentence"/>
		</xsl:otherwise>
	</xsl:choose>
</xsl:function>

 

例:関数のタイプを返す宣言

次に続く例は、関数定義にある as 属性の利用を例示します。 それは、その整数の引数、ローマ数字としての式の表現を含む文字列を返します。 例えば、関数呼び出し num:roman(7) は、文字列 "vii" を返すでしょう。 この例は、12 番号付け・連番で記述した xsl:number 命令を利用します。 xsl:number 命令は、テキストノードを返し、 そして関数変換規則は、 xsl:function 要素、言い換えると xs:string にあるタイプ宣言にこのテキストノードを変換する為に実行されます。 その為、テキストノードは、文字列に原子化されます

<xsl:function name="num:roman" as="xs:string">
	<xsl:param name="value" as="xs:integer"/>
	<xsl:number value="$value" format="i"/>
</xsl:function>

11. ノード生成と順番 / Creating Nodes and Sequences >>


ホーム前へ次へ