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
このセクションは、スタイルシートのいかなる場所からも行使できるサブルーチンのような機能性を提供する為に利用される事が可能な 名前付きテンプレート(参照:10.1 名前付きテンプレート)、 名前付き属性セット(参照先: 10.2 名前付き属性セット)、 スタイルシート関数(参照:10.3 スタイルシート関数) という3つの構築を記述します。
<!-- カテゴリ:
命令 -->
<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-templates
、 xsl:call-template
命令とは違い、
focus/フォーカスを変更しません。
xsl:template
要素上にある match
、 mode
、 priority
属性は、
テンプレートが、xsl:call-template
命令によって実行される際には、存在しない効果を持ちます。
とてもよく似た xsl:template
要素上にある name
属性は、
テンプレートが、 xsl:apply-templates
命令によって実行される際には、存在しない効果を持ちます。
[ERR XTSE0650]
もし、スタイルシートにあるいくつかの xsl:template
の name
属性とマッチしない name
属性のある xsl:call-template
命令を含む場合には、
それは、静的エラーです。
[ERR XTSE0660] もし、スタイルシートが、同じ名前と同じ取り込み優先度を持つテンプレートを1つ以上含む場合には、 それが、同じ名前とより高い取り込み優先度を持つテンプレートもまた含まない限り(含んでいる場合を除き)、 それは、静的エラーです。
xsl:call-template
命令における目標テンプレートは、
xsl:call-template
命令の name
属性とマッチする name
属性のあるテンプレートと
この名前を伴ういくつかの他のテンプレートよりも、より高い取り込み優先度を持ちます。
xsl:call-template
命令の評価結果は、
その目標テンプレートの中で含んだシーケンスコンストラクタ (参照先: 5.7 シーケンスコンストラクタ) を評価する事によって生成したシーケンスです。
<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-template
、
xsl:apply-templates
、
xsl:apply-imports
、
そして xsl:next-match
の中で許容されます。
[ERR XTSE0670]
もし、単独の xsl:call-template
、
xsl:apply-templates
、
xsl:apply-imports
、
または、 xsl:next-match
が、
name
属性とのマッチを伴う2つ以上の xsl:with-param
要素を含む場合には、
それは、静的エラーです。
パラメータの値は、 xsl:variable
と
xsl:param
(参照:9.3 変数とパラメータの値)における同じ方法で記述され、
select
と as
属性の値のアカウントと、
もしあれば、 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-templates
、
xsl:apply-imports
、
xsl:next-match
、または、
xsl:call-template
要素において利用したのと同じです。
[ERR XTSE0680]
xsl:call-template
のケースでは、
x と名付けたテンプレートパラメータを持たないテンプレートに x と名付けたパラメータをトンネルせずに通過させる事は、
xsl:call-template
命令において後方互換性挙動が利用可能とならない限り、
それは、静的エラーです。
xsl:apply-templates
、
xsl:apply-imports
、
と xsl: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 スタイルシート関数参照。
[定義: パラメータは、トンネルパラメータとして定義される場合があり、それはテンプレートを通過させます。 トンネルパラメータは、それが呼び、その為に再帰的にあるいくつかの違うテンプレートの為にテンプレートを呼ぶことによって自動的に通過させるプロパティを持ちます。 ] トンネルパラメータは、このように、パラメータを認知している段階中に利用したそれぞれのテンプレートの為に必要とする事なく、処理するスタイルシート全体の段階中にアクセスされる設定をされる値を許容します。
注釈:
トンネルパラメータは、いくつかの機能上のプログラム言語にある動的にスコープした変数にとてもよく似た概念です。
トンネルパラメータは、 tunnel="yes"
を記述する xsl:with-param
要素を利用して生成されます。
トンネルパラメータの値へのアクセスを要求したテンプレートは、 tunnel="yes"
をも記述する xsl:param
要素を利用して宣言しなければいけません。
xsl:apply-templates
を利用して呼ぶいくつかのテンプレートにおいては、
xsl:call-template
、 xsl:apply-imports
または、 xsl:next-match
命令、トンネルパラメータのセットは、
呼んだテンプレートを呼んでいるテンプレートから通過させます。
このセットは、 <xsl:with-param tunnel="yes">
を利用して明示的に生成したいくつかのパラメータで構成し、トンネルパラメータの基準セット上に置きます。
もし、
xsl:apply-templates
、
xsl:call-template
、
xsl: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-param
と xsl: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"
を伴う規則に到達する場合を除き、テンプレート規則の全ての中間レイヤーを通して透過を通過させます。
その効果は、パラメータが、変換の異なる段階中に異なる値を取得する事ができる場合を除き、グローバル変数を利用する事にとてもよく似ています。
<!-- カテゴリ:宣言 -->
<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-set
宣言が、 use-attribute-sets
属性を持つ場合、
属性は、このアルゴリズムを再帰的に適用する事によって拡張される。
もし、 xsl:attribute-set
宣言が、1つ以上の xsl:attribute
命令を含む場合には、
これらの命令は、属性ノードのシーケンスを生成する為に評価される。
これらの属性ノードは、結果シーケンスに付加される。
(次に続く規則シーケンスコンストラクタ評価については、5.7 シーケンスコンストラクタ参照)
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:copy
、 xsl: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:copy
と xsl:element
命令は、 use-attribute-sets
属性を持ちます。
この属性を評価する事によって生成した属性ノードのシーケンスは、命令の中に含んだシーケンスコンストラクタをシーケンスの先頭に追加されます。
リテラル結果要素は、 xsl:element
と xsl:copy
の use-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
を創出し、 属性の複数の仕様を伴うテンプレート規則の中でそれを利用します:
単に属性セットの中に記述されます
属性セットの中に記述され、リテラル結果要素上に、また xsl:attribute
命令の中に記述されます
属性セットの中とリテラル結果要素上に記述されます
属性セットの中に、また 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>
[定義:
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 >>