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

【Variables and Parameters / 変数とパラメータ】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0

ホーム前へ次へ
XSLT変数とパラメータとは?

【Variables and Parameters / 変数とパラメータ】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0

XSLT 2.0変数とパラメータとは

 W3C勧告XSLTバージョンXSLT 2.0の「Variables and Parameters / 変数とパラメータ」

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

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

<< 8. 条件付き処理・条件分岐処理 / Conditional Processing

XSLT 2.0変数とパラメータ目次


9 変数とパラメータ / Variables and Parameters
 9.1 変数
 9.2 パラメータ
 9.3 変数の値とパラメータ
 9.4 暗黙の内に文書ノードを作成する Creating implicit document nodes
 9.5 グローバル変数とパラメータ
 9.6 ローカル変数とパラメータ
 9.7 変数のスコープ
 9.8 循環性定義 Circular Definitions

9 変数とパラメータ

[定義:  2つの要素 xsl:variablexsl:param は、可変結合要素として参照されます ]

[定義:  xsl:variable 要素は、変数を宣言し、それは、グローバル変数、または、ローカル変数である場合があります。 ]

[定義:  xsl:param 要素は、パラメータを定義し、それは、 スタイルシートパラメータテンプレートパラメータ、または、関数パラメータである場合があります。 パラメータは、そのスタイルシート、そのテンプレート、または、関数が実行される際に呼ぶことによって設定される事ができるその値である付加的なプロパティを伴う変数です。 ]

[定義:  変数は、名前と値をバインディングしています(結び付けています)。 変数のは、[データモデル]で定義したように(ノードと原子化された値、ノードまたは原子化された値の)いくつかのシーケンスです。 ]

9.1 変数

<!-- カテゴリ:宣言 -->
<!-- カテゴリ:命令 -->
<xsl:variable
  name = qname
  select? = expression
  as? = sequence-type>
  <!-- Content: sequence-constructor -->
</xsl:variable>

xsl:variable 要素は、変数の名前を記述する name 属性を要求されています。 name 属性の値は、5.1 適格な名前で定義したようにQNameです。

xsl:variable 要素は、変数の要求タイプを記述する付加的な as 属性を持ちます。 as 属性の値は、[XPath 2.0]で定義したようにシーケンスタイプXPです。

[定義:  変数の値は、9.3 変数とパラメータの値で記述したように select 属性、または、含んだシーケンスコンストラクタの中で与えられるを利用して算出されます。 この値は、変数の供給した値として参照されます。 ] もし、xsl:variable 要素が、 select 属性を持つ場合には、 シーケンスコンストラクタは、カラにしなければいけません

もし、 as 属性が記述される場合には、変数の供給した値は、関数変換規則を利用して要求タイプに変換されます。

[ERR XTTE0570] もし、要求タイプに変換される事が出来ない変数の供給した値である場合には、それは、タイプエラーです。

もし、 as 属性が省略される場合には、 変数の供給した値は、直接利用され、変換は行われません。

9.2 パラメータ

<!-- カテゴリ:宣言 -->
<xsl:param
  name = qname
  select? = expression
  as? = sequence-type
  required? = "yes" | "no"
  tunnel? = "yes" | "no">
  <!-- Content: sequence-constructor -->
</xsl:param>

xsl:param 要素は、変換する為のパラメータを定義する為の xsl:stylesheetの子として、または、テンプレートにパラメータを定義する為に提供される xsl:template の子として利用される場合があり、 それは、テンプレートが、 xsl:call-templatexsl:apply-templatesxsl:apply-importsまたは、 xsl:next-match を利用して実行される際に提供される場合があります; または、スタイルシート関数にパラメータを定義する為の xsl:function の子として、関数がXPath から呼ばれる際に提供される場合があります。

xsl:param 要素は、パラメータの名前を記述する name 属性を要求されています。 name 属性の値は、5.1 適格な名前で記述したように拡張されるQNameです。

[ERR XTSE0580] もし、テンプレートの2つのパラメータ、または、スタイルシート関数の2つのパラメータが、同じ名前を持つ場合には、それは、静的エラーです。

注釈:

スタイルシートパラメータに関わる規則については、9.5 グローバル変数とパラメータ参照。 ローカル変数は、テンプレートパラメータと関数パラメータを陰に隠す(shadow)場合があります。:9.7 変数のスコープ参照。

パラメータの供給した値は、呼んだものによって提供した値です。 もし、存在しない値が呼んだものによって提供された場合には、且つ、もし、パラメータが命令ではない場合には、 その提供した値は、9.3 変数とパラメータの値で記述したように select 属性、または、含んだシーケンスコンストラクタ内で与えられるを利用して算出されます。 もし、その xsl:param 要素が、 select 属性を持つ場合には、 シーケンスコンストラクタは、カラにしなければいけません

注釈:

この仕様は、パラメータの既定値かどうか、そしてまたパラメータの既定値の際に評価される事を示すものではありません。 例えば、もし、その既定が、
<xsl:param name="p"><foo/></xsl:param>
のように記述される場合には、 それは、テンプレートを適用するごとに生成されるであろう要素ノード foo かどうか、または、同じ foo 要素ノードが、それぞれの適用ごとに利用されるかどうかを記述したものではありません。 しかしながら、それは、他のパラメータの値に、または、文脈評価中に、それぞれの適用において有効な評価をされなければいけない規定、に依存する既定値です。

xsl:param 要素は、パラメータの要求タイプを記述する付加的な as 属性を持ちます。 as 属性の値は、[XPath 2.0]で定義したようにシーケンスタイプXPです。

もし、その as 属性が記述される場合には、 パラメータの供給した値は、関数変換規則を利用して要求タイプに変換されます。

[ERR XTTE0590] もし、その要求タイプへのパラメータの供給した値の変換が、失敗する場合には、それは、タイプエラーです。

もし、その as 属性が省略される場合には、パラメータの供給した値は、直接利用され、存在しない変換が行われます。

付加的な required 属性は、命令であるパラメータを示すために利用される場合があります。 この属性は、スタイルシートパラメータテンプレートパラメータにおいて記述される場合があります。; 関数パラメータは常に命令の為に記述されてはいけませんもし、それが、関数パラメータである、または、 もし、 required 属性が存在し、且つ、値 yes を持つ場合には、パラメータは命令です。 その他の場合には、パラメータはオプションです。 もし、パラメータが、命令である場合には、その時は xsl:param 要素は、カラにしなければいけませんが、 select 属性を持ってはいけません

[ERR XTTE0600] もし、既定値が明示的に与える場合には、つまり、もし、 select 属性、または、カラではないシーケンスコンストラクタのいずれかである場合には、 もし、その既定値が、関数変換規則を利用して要求タイプに変換される事が出来ない場合には、それは、タイプエラーです。

もし、付加的なパラメータが、存在しない select 属性を持ち、更にカラのシーケンスコンストラクタを持つ場合、更には、 もし、存在しない as 属性がある場合には、パラメータの既定値は、ゼロの長さの文字列です。

[ERR XTDE0610] もし、付加的なパラメータが存在しない select 属性を持ち、且つ、カラのシーケンスコンストラクタを持ち、更に もし、 as 属性がある場合には、パラメータの既定値は、カラのシーケンスです。 もし、 カラのシーケンスが、 as 属性で定義した要求タイプの妥当なインスタンスではない場合に、 パラメータが要求したパラメータとして扱われる場合には、それがもし、パラメータにおいて存在しない値を提供する呼び出し元であれば、回復されない動的エラーです。

注釈:

これらの規則の効果は、
<xsl:param name="p" as="xs:date" select="2"/>
は、エラーですが、 しかし、もし、パラメータの既定値が永遠に利用されない場合には、プロセッサは、エラーを報告するかどうかという説明を持ち、記述してあるという事です。
<xsl:param name="p" as="xs:date"/>
と対比すれば、 required="yes" が記述してあったかのように扱われます: カラのシーケンスは、 xs:date の妥当なインスタンスではなく、その為、ここでの効果は、存在しない既定値とパラメータが、それゆえに命令されているものとして扱われます。

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

9.3 変数とパラメータの値

可変結合要素は、4つの異なる方法の中で変数供給した値、または、 パラメータを記述する場合があります。

  • もし、可変結合要素が、 select 属性を持つ場合には、 属性の値は、と式を評価した結果である変数の供給した値にしなければいけません。 このケースでは、可変結合要素のコンテンツは、カラにしなければいけません

  • もし、可変結合要素が、カラのコンテンツを持ち、 select 属性、または、 as 属性のいずれでもないコンテンツを持つ場合、 変数の供給した値は、ゼロの長さの文字列です。 このように(以下の例の通りとなります)

    <xsl:variable name="x"/>
    

    (上記は以下と)同等

    <xsl:variable name="x" select="''"/>
    
  • もし、可変結合要素が、存在しない select 属性を持ち、且つ、 カラの(1つ以上の子ノードを持つ)コンテンツを持つ場合には、そして更に存在しない as 属性を持つ場合には、 可変結合要素のコンテンツは、供給した値を記述します。 可変結合要素のコンテンツは、シーケンスコンストラクタです; 新しい文書は、シーケンスコンストラクタを評価した結果であるノードのシーケンスをその子として持っている文書ノードを伴って構築され、 そしてその時、5.7.1 複雑なコンテンツを構築するで与えた規則を適用します。 変数の値は、その時、1つのシーケンスが、この文書ノードを含んでいます。 より多くの情報は、9.4 暗黙の内に文書ノードを作成する参照。

  • もし、可変結合要素as 属性を持つものの、 select 属性が存在しない場合には、 供給した値は、可変結合要素の中に含んだ(カラが可能な) シーケンスコンストラクタ(参照先: 5.7 シーケンスコンストラクタ)を評価した結果であるシーケンスです。

これらの組み合わせは、以下のテーブルに要約されています。

select 属性 as 属性 コンテンツ 効果
存在する 存在しない カラ 値は、 select 属性を評価する事によって含まれる
存在する 存在する カラ select 属性を評価する事によって含まれる値は、 as 属性によって要求したタイプに調整される
存在する 存在しない 存在する 静的エラー
存在する 存在する 存在する 静的エラー
存在しない 存在しない カラ 値は、ゼロの長さの文字列
存在しない 存在する カラ 値は、カラのシーケンス、提供される as 属性は、カラのシーケンスを許容
存在しない 存在しない 存在する 値は、シーケンスコンストラクタを評価する事によって含まれるコンテンツのある文書ノード
存在しない 存在する 存在する 値は、シーケンスコンストラクタを評価する事によって含まれ、 as 属性によって要求したタイプに調整される

[ERR XTSE0620] もし、可変結合要素が、 select 属性を持ち、更にカラではないコンテンツを持つ場合には、それは、静的エラーです。

例:変数の値

次に続く変数の値は、integers (1、 2、 3)のシーケンスです:

<xsl:variable name="i" as="xs:integer*" select="1 to 3"/>

次に続く変数の値は、属性 @size が存在すると仮定した場合、 更に整数か、または、xs:untypedAtomicとしてのいずれかが注解されている場合は、整数です:

<xsl:variable name="i" as="xs:integer" select="@size"/>

次に続く変数の値は、ゼロの長さの文字列です:

<xsl:variable name="z"/>

次に続く変数の値は、子としてカラの要素を含んでいる文書ノードです:

<xsl:variable name="doc"><c/></xsl:variable>

次に続く変数の値は、整数 (2、 4、 6) のシーケンスです:

<xsl:variable name="seq" as="xs:integer*">
	<xsl:for-each select="1 to 3">
		<xsl:sequence select=".*2"/>
	</xsl:for-each>
</xsl:variable>

次に続く変数の値は、親のない属性ノードのシーケンスです:

<xsl:variable name="attset" as="attribute()+">
	<xsl:attribute name="x">2</xsl:attribute>
	<xsl:attribute name="y">3</xsl:attribute>
	<xsl:attribute name="z">4</xsl:attribute>		
</xsl:variable>

次に続く変数の値は、カラのシーケンスです:

<xsl:variable name="empty" as="empty-sequence()"/>

変数の実際の値は、上に記述したように as 属性の値によって決定される供給した値と要求タイプに依存します。

例:数で示される述語を伴う危険(Pitfalls with Numeric Predicates)

変数が、位置によってノードを選択する為に利用される際には、実行しないように注意します:

<xsl:variable name="n">2</xsl:variable>
...
<xsl:value-of select="td[$n]"/>

これは、変数 n が数字ではないノードに拘束されるので、スペース区切り(または、後方互換性モードでは、最初の td 要素の値)の td 要素全ての値を出力するでしょう。 代わりに次に続く構成で行います:

<xsl:variable name="n" select="2"/>
...
<xsl:value-of select="td[$n]"/>

または、

<xsl:variable name="n">2</xsl:variable>
...
<xsl:value-of select="td[position()=$n]"/>

または、

<xsl:variable name="n" as="xs:integer">2</xsl:variable>
...
<xsl:value-of select="td[$n]"/>

9.4 暗黙の内に文書ノードを作成する

文書ノードは、カラでないコンテンツを持ち、存在しない as 属性を持つ xsl:variablexsl:param 、または、 xsl:with-param 要素を評価する際に暗黙のうちに生成されます。 この要素は、可変結合要素として参照されます。 変数の値は、一時的なツリーの単独のノード、文書ノードです。. 文書ノードの内容は、5.7.1 複雑なコンテンツを構築するで記述したように可変結合要素の中に含んだシーケンスコンストラクタを評価した結果から形成されます。

注釈:

その構築は、:

<xsl:variable name="tree">
	<a/>
</xsl:variable>

(以下において)略記としてみなされる事が可能で:

<xsl:variable name="tree" as="document-node()">
	<xsl:document validation="preserve">
		<a/>
	</xsl:document>	
</xsl:variable>

文書ノードの基準URIは、スタイルシートにある要素を結びつけている変数の基準URIから取得されます。(参照:[データモデル]にあるセクション 5.2 base-uri AccessorDM)

文書レベル妥当性検証は行われません(それが意味するところは、例えば、一意であるID値である事のチェックが存在しないという事です)。 しかしながら、新しいツリーにあるノード上のタイプ注釈は、変更されずにコピーされます。

注釈:

ツリーにある他のノードの基準URIは、5.7.1 複雑なコンテンツを構築するにおける規則によって決定されます。 これらの規則の効果は、一時的なツリーにあるノードの基準URIは、可変結合要素の基準URIであったURIのある単独の実体から派生する一時的なツリーに全てのノードがあるかのように決められます。 このように、文書ノードの基準URIは、可変結合要素の基準URIと等しくなります; 一時的なツリーにある xml:base 属性は、まるで解析によって構築した文書にあるかのように要素の子孫の親要素における基準URIを変更するでしょう。

文書ノードの document-uriunparsed-entities プロパティは、カラに設定されます。

一時的なツリーは、いくつかのソース文書と同じ方法で確実な処理を可能にします。 例えば、そのノードは、 path 式を利用してアクセスされ、そして、それらは、 xsl:apply-templatesxsl:for-eachのような命令を利用して処理される事が可能です。 また、 keyidFO 関数は、 文書ノードでルートとした一時的なツリーにあるノードを見つける為に利用される事ができ、 提供したまさにその時に関数が呼ばれる場合には、文脈アイテムは、一時的なツリーにあるノードです。

例:変換の2つの段階・局面

例えば、次に続くスタイルシートは、2つの局面における異なるモードを利用して2つの変換局面の中間結果として一時的なツリーを利用します (参照先: 6.5 モード)。 概して、モジュール phase1.xsl にあるテンプレート規則は、モジュール phase2.xsl にあるそれらが、 mode="phase2" を伴って宣言されるであろう間、 mode="phase1" を伴って宣言されます。:

<xsl:stylesheet
	version="2.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="phase1.xsl"/>
<xsl:import href="phase2.xsl"/>
<xsl:variable name="intermediate">
	<xsl:apply-templates select="/" mode="phase1"/>
</xsl:variable>
<xsl:template match="/">
	<xsl:apply-templates select="$intermediate" mode="phase2"/>
</xsl:template>
</xsl:stylesheet>

注釈:

テンプレート規則に対して一致しているノードにおけるアルゴリズムは、派生するノードであるツリーを無視するのとまさに同じです。 もし、異なるテンプレート規則が、異なるツリーを処理する際に利用される為にある場合には、 異なるツリーから得られるノードは、 パターンという意味によって識別される事ができる場合を除き、 妥当なテンプレート規則のセットを利用して処理されるツリーごとに確保する為のモードを利用するのはいい考えです。

9.5 グローバル変数とグローバルパラメータ

xsl:variablexsl:param の双方は、 宣言要素として許容されます:それは、 それらが、 xsl:stylesheet 要素の子として出現する場合があるという事です。

[定義:  トップレベル可変結合要素は、(その他のバインディング(結びつき)によって陰に隠されない限り(される場合を除き)、 )どこででも可視可能なグローバル変数を宣言します。 ]

[定義:  トップレベル xsl:param 要素は、スタイルシートパラメータを定義します。 スタイルシートパラメータは、変換が開始される際に呼んだものによって提供される事が可能な値である付加的なプロパティを伴うグローバル変数です。 ] 9.2 パラメータで記述したように、スタイルシートパラメータは、命令されているかのように宣言される場合があり、 または、 存在しない値が、呼ぶものによって提供される際に利用する為に記述した既定値を持つ場合があります。 スタイルシートパラメータにおいて値を提供する呼ぶものによるメカニズムは、implementation-definedです。 XSLTプロセッサは、このようなメカニズムを提供しなければいけません

もし、存在しない値が命令スタイルシートパラメータにおいて提供される場合には、 それは、エラーです。[参照:ERR XTDE0050]

もし、スタイルシートが、固有の名前のグローバル変数を含め1つ以上結び付けている場合には、 最も高い取り込み優先度を伴い結び付けられるものが利用されます。

[ERR XTSE0630] もし、スタイルシートが、同じ名前と同じ取り込み優先度を持つグローバル変数を1つ以上含む場合には、 同じ名前とより高い取り込み優先度を持つその他の結びつきもまた含まない限り(含む場合を除いて)、それは、静的エラーです。

グローバル変数、または、 スタイルシートパラメータの既定値においては、 その変数値を記述している、または、シーケンスコンストラクタは、 初期文脈ノードを含んでいるツリールートノードを基準とした個々のフォーカスを伴って評価されます。 XPathエラーは、存在しない初期の文脈ノードが提供される際には、グローバル変数、または、文脈アイテムを参照するパラメータ、文脈位置、文脈サイズかどうかの評価を報告されるでしょう。 動的文脈のコンポーネントの値は、5.4.3 動的文脈初期化5.4.4 XSLTで利用した付加的な動的文脈コンポーネントで定義したように初期値です。

例:スタイルシートパラメータ

次に続く例は、属性値テンプレートの中で参照されるグローバルパラメータ para-font-size を定義します。

<xsl:param name="para-font-size" as="xs:string">12pt</xsl:param>
<xsl:template match="para">
 <fo:block font-size="{$para-font-size}">
	 <xsl:apply-templates/>
 </fo:block>
</xsl:template>

手法は、スタイルシートを実行する際に、パラメータ para-font-size における値を提供する事をユーザーに許容するメカニズムを提供しなければいけません。; 値 12pt は、既定として動作します。

9.6 ローカル変数とパラメータ

[定義:  宣言要素として許容されているのと同様に、 xsl:variable 要素は、シーケンスコンストラクタの中でも許容されます。 このような変数は、ローカル変数として知られています。 ]

[定義:  xsl:param 要素は、その要素のいくつかの xsl:param でない子の前に xsl:template 要素の子として現れる場合があります。 このようなパラメータ は、テンプレートパラメータとして知られています。 テンプレートパラメータは、テンプレートが呼ばれる際に、 xsl:call-templatexsl:apply-templatesxsl:apply-importsまたは、 xsl:next-matchといった命令のいくつかを利用して設定される事が可能なその値である付加的なプロパティを伴うローカル変数です。 ]

[定義:  xsl:param 要素は、その要素のいくつかの xsl:param でない子の前に xsl:function 要素の子として現れる場合があります。 このようなパラメータは、関数パラメータとして知られています。 関数パラメータは、XPath の中で呼ぶ関数を利用して、関数が呼ばれる際にセットされる事が可能なその値である付加的なプロパティを伴うローカル変数です。 ]

ローカル xsl:variable、または、 xsl:param 要素の評価結果は、 (カラのシーケンスの一部であるシーケンスコンストラクタの結果を作成する事に寄与する)カラのシーケンスです。

9.7 変数のスコープ

いくつかの可変結合要素においては、可視である結びつきのある中においてスタイルシートの範囲(もっと具体的に言うと、要素ノードのセット)があります。 XPath においてスコープ内の変数バインディングのセットは、式が現れる場合、スタイルシート内の位置で可視であるそれらのバインディングの構成です。

グローバル可変結合要素は、 xsl:variable 内、または、 xsl:param 要素それ自身と その他の変数バインディングによって陰に隠されるいくつかの範囲を除き、 スタイルシート(他のスタイルシートモジュールを含む)内でどこででも可視です。

ローカル可変結合要素は、2つの例外を伴う次に続く氏族とそれらの子孫全てにおいて可視です: その他の可変結合によって陰に隠されるいくつかの範囲の中では可視ではありません、そして、また、可変結合要素の氏族である xsl:fallback 命令でルートとしたサブツリーの中では可視ではありません。 結合は、 xsl:variable、または、xsl:param 要素それ自身においては、可視ではありません。

[定義:  結合は、もし、結合が、他の結合が可視である位置に現れ、その結合が、同じ名前を持つ場合には、その他の結合を陰に隠します] もし、ローカル xsl:variable、または、 xsl:param によって確立した結合が、 グローバル結合を陰に隠す場合には、それは、エラーではありません。 このケースでは、そのグローバル結合は、その他の結合によって陰に隠されるスタイルシートの範囲の中で可視にしないでしょう。

例:ローカル変数がグローバル変数を隠す

次に続く(以下は)許容されます。:

<xsl:param name="x" select="1"/>
<xsl:template name="foo">
	<xsl:variable name="x" select="2"/>
</xsl:template>

もし、 ローカル xsl:variable 要素によって確立した結合が、 その他のローカル xsl:variable、または、 xsl:param によって確立した結合を隠す場合には、それもまたエラーではありません。

例:変数隠ぺいの誤用

次に続いているのは、エラーではありませんが、その効果は、おそらく何も実行されるものがないでしょう。 $x という名前の付いた内側の変数の宣言が、 $x という名前の付いた外側の変数の値において存在しない効果を持つのでテンプレートは、 <x value="1"/> を出力します。

<xsl:variable name="x" select="1"/>
<xsl:template name="foo">
	<xsl:for-each select="1 to 5">
		<xsl:variable name="x" select="$x+1"/>
	</xsl:for-each>
	<x value="{$x}"/>
</xsl:template>

注釈:

一度、変数が与えられた値を持つと、値は、その後に変更される事ができません。 XSLTは、多くの手続き型プログラミング言語において利用可能な指示演算子と等価なものを提供しません。

これは、指示演算子が、終わりまでを通して始まりと継続の開始をバッチのような方法ではなく、文書を処理する手法を作成する為のより強固なものを必要とするだろうからです。

グローバル変数とローカル変数同様、XPath は、ローカルな式の中で利用する為に範囲変数を宣言する場合もあります。 詳細については、[XPath 2.0]参照。

XPath 式に現れる変数を参照する場合には、最初にスコープ内にある範囲変数の参照によって、次にローカル変数とローカルパラメータの参照によって、そして最後にグローバル変数とパラメータによって解決されます。 範囲変数は、ローカル変数、または、グローバル変数に隠される場合があります。 XPathはまた、その他の範囲変数を隠すための範囲変数を許容します。

9.8 循環性定義

[定義:  循環性とは、もし、それ自身の用語の中で定義されるグローバル変数属性セット、または、キーのように構築される場合に存在するという事です。 例えば、もし、グローバル変数 Y を参照するグローバル変数 X の値を記述している、または、シーケンスコンストラクタである場合には、 Y における値は、 X という値の前に算出されなければいけません。 循環性は、全てのグローバル変数定義においてこれをする事を可能にするかどうかという(状態において)現れます。 ]

例:循環性変数定義

次に続く2つの宣言は、循環性をつくります。:

<xsl:variable name="x" select="$y+1"/>
<xsl:variable name="y" select="$x+1"/>

 

例:変数と関数を実行する循環性

グローバル変数の定義は、仮に存在しない他の変数が実行される場合でさえ、循環性となる事ができます。 例えば、次に続く2つの宣言 (参照先:10.3 スタイルシート関数 xsl:function 要素の説明について) もまた、循環性をつくります:

<xsl:variable name="x" select="my:f()"/>
<xsl:function name="my:f">
	<xsl:sequence select="$x"/>
</xsl:function>

 

例:変数とテンプレートを実行する循環性

変数の定義もまた、もし、変数の評価が、 スタイルシートにあるいくつかのテンプレート規則の match 属性の中で利用したパターン内で参照される xsl:apply-templates 命令とその変数を実行する場合には、循環性です。 例えば、次に続く定義は循環性です:

<xsl:variable name="x">
	<xsl:apply-templates select="//param[1]"/>
</xsl:variable>
<xsl:template match="param[$x]">1</xsl:template>

 

例:変数とキーを実行する循環性

とてもよく似た、変数定義は、もし、それが、 key 関数上で呼ぶこと、その matchにある変数を参照するキーの定義 または、 use 属性に起因する場合には、循環性です。 その為、次に続く定義は循環性です:

<xsl:variable name="x" select="my:f(10)"/>
<xsl:function name="my:f">
	<xsl:param name="arg1"/>
	<xsl:sequence select="key('k', $arg1)"/>
</xsl:function>
<xsl:key name="k" match="item[@code=$x]" use="@desc"/>

[ERR XTDE0640] 一般には、スタイルシート内での循環性は、 回復されない動的エラーです。 しかしながら、他の全ての動的エラーを伴う時、もし、循環性に関与する命令と式を実際に実行する場合、手法は、エラーをシグナル出力するでしょう。 なぜなら、異なる手法は、異なる方法でスタイルシートの実行を最適化する場合があり、それは、実際に固有の循環性がシグナル出力されるかどうかは、implementation-dependentだからです。

例えば、次に続く宣言の中では、関数は、ローカル変数 $b を宣言しますが、評価される為の変数を要求しない結果を返します。 値が実際に評価されるかどうかは、implementation-dependentであり、 更にそれゆえに循環性がエラーとしてシグナル出力されるかどうかはimplementation-dependentです:

<xsl:variable name="x" select="my:f(1)/>
<xsl:function name="my:f">
	<xsl:param name="a"/>
	<xsl:variable name="b" select="$x"/>	
	<xsl:sequence select="$a + 2"/>
</xsl:function>

循環性は、たいていグローバル変数、または、パラメータを実行しますが、それらはまた、 キー定義間 (参照先: 16.3 キー)、 名前付き属性セット間 (参照先: 10.2 名前付き属性セット)、または、 いくつかのこれらの構築の組み合わせ間に存在します。 例えば、循環性は、もし、キー定義が、引数としてオリジナルキー定義の名前を提供する key 関数を呼ぶ属性セットを参照する関数を実行する場合に存在します。

循環性は、再帰と同じではありません。 スタイルシート関数 (参照先: 10.3 スタイルシート関数) と名前付きテンプレート(参照:10.1 名前付きテンプレート)は、 制限なしで他の関数と名前付きテンプレートを呼ぶ場合があります。 コーディング上の注意事項としては、再帰は、終わらない場合があります。 手法は、動的エラーとして循環性をシグナル出力する事が、要求されます。 しかし、それらは終わらない再帰を回避する為に要求されるわけではありません。

10. 呼び出し可能なコンポーネント / Callable Components >>


ホーム前へ次へ