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

【Extensibility and Fallback / 拡張とFallback】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0

ホーム前へ次へ
XSLT拡張とFallbackとは?

【Extensibility and Fallback / 拡張とFallback】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0

XSLT 2.0拡張とFallbackとは

 W3C勧告XSLTバージョンXSLT 2.0の「Extensibility and Fallback / 拡張とFallback」

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

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

<< 17. メッセージ / Messages

XSLT 2.0拡張とFallback目次


18 拡張と縮退 / Extensibility and Fallback
 18.1 拡張機能
  18.1.1 機能の有用性テスト
  18.1.2 拡張機能呼び出し
  18.1.3 拡張オブジェクト
  18.1.4 タイプの有用性テスト
 18.2 拡張命令 Extension Instructions
  18.2.1 拡張名前空間指定 Designating an Extension Namespace
  18.2.2 命令の有用性テスト Testing Availability of Instructions
  18.2.3 縮退

18 拡張と縮退

XSLTは、拡張命令と拡張関数という2つの拡張を許容します。

[定義:  拡張命令は、拡張名前空間として設計した(XSLT名前空間ではない)名前空間にあるシーケンスコンストラクタ内の要素です。 ]

[定義:  拡張関数は、[関数と演算子]で定義した主要な関数ではなく、 XPath 内で利用可能とする関数であり、 このXSLT 仕様で定義し、追加した関数であり、 タイプを原子化後、名前付きコンストラクタ関数、または、 xsl:function 宣言を利用して定義したスタイルシート関数です ]

この仕様は、生成におけるいくつかのメカニズムの定義でも、または、拡張命令、または、 拡張関数の手法のバインディング(結びつけ)でもなく、そしてまた、それは、 いくつかのこのようなメカニズムをサポートする手法を要求されません。 このようなメカニズムは、もし、それらが存在する場合には、implementation-definedです。 それゆえに、XSLT スタイルシートは、利用可能となっている固有の拡張に依存する事が出来ないXSLT手法間での移動(多種多様なパーサーでの対応)を可能にさせなければいけません。 XSLTは、手法が固有の拡張を利用可能かどうか、そしてまた、もし、それらの拡張が利用可能でない場合には何が起こるのかを明記する(手段)を提供します。 もし、XSLT スタイルシートが、これらのメカニズムを利用させる為に注意を払う場合には、拡張の優位性と静かにポータビリティを持ち続ける事を可能とします。

18.1 拡張関数

XPath にある FunctionCallXP から呼ばれる事が可能な関数のセットは、 1つ以上の拡張関数を含む場合があります。 拡張関数の拡張QNameは、常にNullでない名前空間URIを持ちます。

18.1.1 関数の有用性をテストする

function-available 関数は、もし、固有の拡張関数が利用可能ではない場合には、 スタイルシートがどのようにふるまうかを明示的に操作する [xsl:]use-when 属性を伴って利用される事が可能 (参照先: 3.12 条件付き要素含有)です。

function-available($function-name as xs:string) as xs:boolean
function-available( $function-name  as xs:string,
$arity  as xs:integer) as xs:boolean

関数は、もし、式 (参照先: 5.4.1 静的文脈を初期化する)における in-scope関数XP に存在する場合には、XPath 式内で利用可能となるという事です。 静的文脈にある関数は、その arity との組み合わせの中にある関数(QName)の名前によって一意に識別されます。

$function-name 引数の値は、語彙的なQNameを含んでいる文字列にしなければいけません。 その語彙的なQNameは、においてスコープ内にある名前空間宣言を利用して拡張QNameに拡張されます。 もし、その語彙的なQNameが前置詞のないものである場合には、標準関数 名前空間は、拡張したQNameの中で利用されます。

function-available 関数の2つの引数(形式の)バージョンは、 もし、そして仮に、 $function-name 引数の値とマッチする名前であり、 $arity 引数の値とマッチする arity である利用可能な関数がある場合に限っては、「 true 」を返します。

function-available 関数の単独引数(引数が1つの)バージョンは、 もし、そして仮に $function-name 引数の値とマッチする(いくつかの arity を伴う)利用可能な関数が少なくとも1つある場合に限っては、「 true 」を返します。

[ERR XTDE1400] もし、引数が、妥当なQNameである文字列を評価しない場合、 または、もし、QNameの前置詞におけるスコープ内に存在しない名前空間宣言がある場合には、 それは、回復されない動的エラーです。 もし、プロセッサが、静的なエラーを回避する事が可能である場合(例えば、引数が文字列リテラルとして提供される際)には、 プロセッサは、静的エラーとしてこれを付加的にシグナル出力する場合があります

後方互換性挙動が利用可能な際には、(いつでも呼ばれる動的エラーを生じるフォールバック(縮退)エラー関数ではなく) function-available 関数は、手法が利用可能でない場合において関数名と arity の関係の中で「 false 」を返します。 これが意味するところは、それは、それを呼ぶ前に関数が利用可能かどうかをテストする次に続くようなロジックを利用する事を(XSLT 1.0 にあるように)可能とするという事です:

例:利用可能とした後方互換性を伴う拡張関数を呼んでみる
<summary xsl:version="1.0">
	<xsl:choose>
		<xsl:when test="function-available('my:summary')">
			<xsl:value-of select="my:summary()"/>
		</xsl:when>
		<xsl:otherwise>
			<xsl:text>Summary not available</xsl:text>
		</xsl:otherwise>
	</xsl:choose>
</summary>

注釈:

いくつかの固有の成功するであろう関数を呼ぶという存在しない保証を与えられる事が可能である与えられた名前を伴う関数という事実。 例えば、期待した引数のそのタイプを決める事が可能ではないという事です。

注釈:

(利用可能となる後方互換性がない場合)XSLT 2.0では、XPath式が利用可能でない関数を参照する際には、静的エラーが出現します。 これは、前方互換性挙動を利用するスタイルシートの一部にある事実公正です(is true even)。 それゆえに、条件付きロジックは、 use-when 属性で普通に書かれるべきそれを呼ぶ前に関数が利用可能かどうかをテストする事です(参照先: 3.12 条件付き要素含有)。

例:XSLT 1.0 と XSLT 2.0 間で利用できるスタイルシート

スタイルシートは、それらが利用可能となる場合にXSLT 2.0利便性を利用する為に設計されますが、 そのコードを利用する事が書かれない場合にXSLT 1.0 性能にフォールバック(縮退)する為でもあります:

<out xsl:version="2.0">
	<xsl:choose>
		<xsl:when test="function-available('matches')">
			<xsl:value-of select="matches(
					$input, '[a-z]*')"/>
		</xsl:when>
		<xsl:otherwise>
			<xsl:value-of select="string-length(
				translate($in,
				'abcdefghijklmnopqrstuvwxyz', ''))
							= 0"/>
		</xsl:otherwise>
	</xsl:choose>
</out>

現在、XSLT 2.0 プロセッサは、XSLT 1.0 プロセッサが、 xsl:otherwise 分岐に続くであろう場合に、常に xsl:when 分岐を取得するでしょう。 function-available 関数の単独引数バージョンは、XSLT 1.0では単に利用可能なバージョンというだけなのでここで利用されます。 XSLT 1.0の規則下では、決して評価されないので matches 関数を呼ぶ事は、エラーではありません。

 

例:XSLT 2.0とXSLTの次期バージョン間で利用できるスタイルシート

スタイルシートは、それらが利用可能である際にいくつかの次期XSLTバージョンの中で利便性を利用する為に設計されますが、 次に続くようなコードを利用して書かれない場合にXSLT 2.0性能にフォールバック(縮退)する為でもあります。 これは、スペースを伴う固定長に文字列を詰め込む関数 pad のいくつかの次期バージョンにある可能性を仮定します:

 <xsl:value-of select="pad($input, 10)" 
		 use-when="function-available('pad', 2)"/>
 <xsl:value-of select="concat($input,、 文字列-join(
		for $i in 1 to 10 - string-length($input) 
					return ' ', ''))"
		 use-when="not(function-available('pad', 2))"/>

このケースでは、XSLT 1.0 の下で実行する為のこのコードにおいて存在しない要求なので、 function-available の2つの引数を取るバージョンが利用されます。

18.1.2 拡張関数を呼ぶ

もし、その関数名が、拡張関数を識別するXPath にある FunctionCallXP 内で利用される場合には、 FunctionCallXP を評価し、 プロセッサは、まず、 FunctionCallXP にある引数ごとに評価するでしょう。 もし、プロセッサが拡張関数によって期待したデータタイプについての情報を持つ場合には、 それは、XPathデータタイプと手法言語によって定義したそれらの間でのいくつかの必要なタイプ変換を実行する場合があります。 もし、多様な拡張関数が、同じ名前を伴って利用可能である場合には、プロセッサは、 引数の数、引数のタイプ、または、いくつかの他の基準を基準として実行するか否かを決定する場合があります。 手法によって返した結果は、手法言語とXPathのそれらのデータタイプ間でのいくつかの必要な変換の後、再び関数呼び出しの結果として返されます。 このようなタイプの変換の詳細は、この仕様のスコープ外です。

[ERR XTDE1420] もし、固有の拡張関数において定義した規則を満たさない拡張関数を呼ぶ為に提供した引数である場合、または、もし、拡張関数がエラーを報告する場合、 または、もし、拡張関数の結果がXPath 値に変換される事が出来ない場合には、それは、回復されない動的エラーです。

注釈:

手法はまた、回復可能な動的エラーを報告する為の拡張関数を許容しているメカニズム、または、いくつかの処理環境において実行する為の拡張関数を許容しているメカニズム、または、 修復として上記で列挙したエラーの全てを許容しているメカニズムを提供する場合があります。

[ERR XTDE1425] 後方互換性挙動が利用可能である場合に、 もし、存在しない拡張関数の手法が利用可能である場合に、呼ぶ拡張関数を評価する事は、回復されない動的エラーです。

注釈:

後方互換性挙動が利用可能でない場合には、これは、静的エラー[XPST0017]です。

注釈:

side-effects を持つ拡張関数を呼ぶことにおける存在しない禁止令があります(例えば、ファイルにデータを書き込む拡張関数)。 しかしながら、そのXSLT 命令の実行の指定は、この仕様で定義されておらず、その為、このような関数の効果は、予測できないことです。

手法は、拡張関数によって返した値の完全な妥当性検証を実行する事を要求されません。 それは、XMLで許容していない文字列を含んでいる文字列を返すための拡張関数においてはエラーですが、このエラーの結果は、implementation-definedです。 手法は、エラーを生じる場合、 妥当な文字列だけを含んでいる文字列に文字列を変換する場合、 または、それらが許容された文字列であったかのように妥当でない文字列を扱う場合があります

注釈:

拡張関数実行における性能は、信頼性の低いスタイルシートは、プロセッサが実行する場合に マシン上のリソースへのアクセス特権を持つコードを実行する場合があるので、セキュリティの脆弱性を示します。 手法は、それゆえに、信頼性の低いスタイルシートによって拡張関数の利用を制限するメカニズムを提供する場合があります。

このセクションにある全ての所見は、拡張命令を実行する場合に等しく適用する拡張関数を実行している際に現れる事が可能なエラーに関してです。

18.1.3 外部オブジェクト

手法は、原子化された値として、または、ノードとして、いずれかのXDM データモデルにあるいくつかの自然表現を持たないオブジェクトを返すための拡張関数を許容する場合があります。 例えば、拡張関数 sql:connect は、リレーショナルデータベース(RDB)への接続を示すオブジェクトを返すでしょう; 結果となる接続オブジェクトは、 sql:insertsql:select のような他の拡張関数を呼ぶ為の引数として通過させるでしょう。

タイプシステムの中で示されるこのようなオブジェクトにおける方法は、implementation-definedです。 それらは、完全に新しいデータタイプによって示されるか、または、 integerstring 、または、 anyURI のような存在するデータタイプにマップされるでしょう。

18.1.4 タイプの有用性をテストする

type-available 関数は、例えば、もし、固有のスキーマタイプが、静的文脈の中で利用可能ではない場合に スタイルシートがどのようにふるまうかを明示的に操作する為に、明示的な操作を伴う [xsl:]use-when 属性 (参照先: 3.12 条件付き要素含有)を伴って利用される事が可能です。

type-available($type-name as xs:string) as xs:boolean

スキーマタイプ(単純なタイプ、または、複雑なタイプ)は、 もし、 それが、式における スコープ内スキーマタイプXP の中に存在するタイプ定義である場合には、 XPath式の中で利用可能になるという事です。 (参照先: 5.4.1 静的文脈を初期化する)。 これは、 xsl:import-schema を利用して取り込んだタイプであるビルトイン(組み込み)タイプと手法によって定義した拡張タイプを含みます。

$type-name 引数の値は、語彙的なQNameを含んでいる文字列にしなければいけません。 語彙的なQNameは、においてスコープ内にある名前空間宣言を利用して拡張QNameに拡張されます。 もし、その語彙的なQNameが前置詞なしの場合には、既定名前空間は、拡張したQNameで利用されます。

関数は、もし、仮に $type-name 引数の値とマッチする名前である利用可能なタイプが存在する場合に限り「 true 」を返します。

[ERR XTDE1428] もし、その引数が妥当なQNameである文字列を評価しない場合、または、もし、 QNameの前置詞におけるスコープの中に存在しない名前空間宣言がある場合には、 それは、回復されない動的エラーです。 もし、プロセッサが静的なエラーを回避する事が可能である場合(例えば、引数が文字列リテラルとして提供した際)には、 プロセッサは、静的エラーとしてこれを付加的にシグナル出力する場合があります

18.2 拡張命令

[定義:  拡張命令メカニズムは、拡張名前空間として設計される為に名前空間を許容します。 名前空間が、拡張名前空間とシーケンスコンストラクタに出現する名前空間から得られる名前を持つ要素として設計される場合には、 要素は、リテラル結果要素としてではなく指示命令として扱われます。 ] その名前空間は、命令のセマンティクスを決めます。

注釈:

要素は、xsl:stylesheet 要素の子である為、 シーケンスコンストラクタの中には 現れる事はなく、 ユーザー定義データ要素(参照:3.6.2 ユーザー定義データ要素)は、 ここで定義したような拡張要素ではなく、このセクションにはそれらに適用するものは何もありません。

18.2.1 拡張名前空間を指定する

名前空間は、スタイルシートにある要素における [xsl:]extension-element-prefixes 属性を利用する事によって拡張名前空間として設計されます (参照先: 3.5 標準属性)。 属性は、もし、その親要素が、XSLT名前空間の中に存在 しない 場合に限り、XSLT名前空間の中に存在しなければいけません。 属性の値は、名前空間前置詞のホワイトスペースで区切られたリストです。 名前空間は、拡張名前空間として設計される前置詞ごとに拘束されます。

( xmlns によって宣言されたものとしての)既定名前空間は、名前空間前置詞のリストの中にある #default を含む事によって拡張名前空間として設計される場合があります。

[ERR XTSE1430] もし、存在しない名前空間が、 [xsl:]extension-element-prefixes 属性を有する要素における前置詞に拘束される場合、 または、 #default が記述される際に、もし、存在しない既定名前空間がある場合には、それは、静的エラーです。

拡張名前空間としての名前空間の指定は、 [xsl:]extension-element-prefixes 属性に拘束される要素において、また、同じスタイルシートモジュールにある要素の子孫全てにおいて効果があります。

18.2.2 命令の有用性をテストする

element-available 関数は、 xsl:choosexsl:if 命令 を伴って利用される事、 または、固有のXSLT命令、または、拡張命令が利用可能(、または、可能ではない)場合にスタイルシートがどのようにふるまうかを明示的に操作する為の [xsl:]use-when 属性 (参照先: 3.12 条件付き要素含有)を伴って利用される事が可能です。

element-available($element-name as xs:string) as xs:boolean

$element-name 引数の値は、QNameを含んでいる文字列にしなければいけませんQNameは、におけるスコープ内にある名前空間宣言を利用して拡張QNameに拡張されます。 もし、スコープ内に既定名前空間がある場合には、それは、前置詞なしQNameに拡張する為に利用されます。 element-available 関数は、もし仮に、拡張QNameが、指示命令の名前である場合に限って、「 true 」を返します。 もし、拡張QNameが、XSLT名前空間 URIと等しい名前空間URIを持つ場合には、 それは、XSLTによって定義した要素を参照します。 その他のものは、拡張命令を参照します。 もし、拡張QNameが、Nullの名前空間 URIを持つ場合には、 element-available 関数は、「 false 」を返すでしょう。

[ERR XTDE1440] もし、引数が、妥当な QNameである文字列を評価しない場合、または、もし、 QNameの前置詞におけるスコープ内に存在しない名前空間宣言がある場合には、 それは、回復されない動的エラーです。 もし、プロセッサが静的なエラーを回避する事が可能な場合(例えば、引数が文字列リテラルとして提供した際)には、 プロセッサは、静的エラーとしてこれを付加的にシグナル出力する場合があります

もし、拡張QNameが、XSLT名前空間の中に存在する場合には、 関数は、もし、仮に拡張QNameがXSLT命令の名前である場合に限り 「 true 」を返します、 それは、指示命令としてそれを分類するこの仕様の中にあるシンタックス要約であるXSLT 要素という事です。

注釈:

たとえ一致するXSLT 2.0プロセッサを利用している際にXSLT名前空間にある名前にこの関数を適用している結果が、完全に予測がつくとしても、 関数は、スタイルシートが異なる規則を伴うXSLTのいくつかの他のバージョンを提供するプロセッサの下で実行されているケースでは有益です。

もし、拡張QNameが、XSLT名前空間に存在しない場合、 関数は、もし仮に、プロセッサが、与えられる拡張したQNameを伴う拡張命令の利用可能な手法を持つ場合に限り「 true 」を返します。 これは、拡張名前空間として指定されている名前空間であるか否かを適用します。

もし、プロセッサが、利用可能な固有の拡張命令の手法を持たない場合には、そしてまた、このような拡張命令が評価される場合には、 プロセッサは、18.2.3 フォールバック(縮退)で記述したように要素におけるフォールバック(縮退)を実行しなければいけません。 手法は、スタイルシートが利用可能となる存在しない手法における拡張命令を単に含む事があるのでエラーをシグナル出力してはいけません

18.2.3 縮退(フォールバック)

<!-- カテゴリ: 命令 -->
<xsl:fallback>
  <!-- Content: sequence-constructor -->
</xsl:fallback>

xsl:fallback 要素の内容は、シーケンスコンストラクタであり、 フォールバック(縮退)を実行する際に xsl:fallback 要素によって返された値は、このシーケンスコンストラクタを評価した結果です。

xsl:fallback 要素を評価するフォールバック(縮退)を実行しない場合には、カラのシーケンスを返し、 xsl:fallback 要素の内容は、無視されます。

プロセッサがフォールバック(縮退)を実行する場合には2つのシチュエーションがあります: 利用可能ではない拡張命令が評価される場合、また、XSLT 2.0で定義していないXSLT名前空間にある命令である場合には、 利用可能な前方互換性挙動におけるスタイルシートの範囲内で評価されます。

注釈:

フォールバック(縮退)処理は、他のシチュエーションでは実行されません、例えば、XPath 式が認識できないシンタックスを利用する場合、または、未知の関数を呼ぶ事を含む場合には、実行されません。 このような動的なシチュエーションを操作する為に、スタイルシートは、どの性能が利用可能かを決める system-propertyfunction-available のような関数を呼ぶべきです。

[ERR XTDE1450] プロセッサが、 認識されない拡張命令においてフォールバック(縮退)を実行する場合、 もし、その命令要素が、1つ以上の xsl:fallback 子を持つ場合には、 xsl:fallback 子ごとの内容は、評価されなければいけません; もし、それが存在しない xsl:fallback 子である場合には、回復されない動的エラーです。

注釈:

これは認識しないXSLT 要素を伴うシチュエーションとは異なります。 3.9 前方互換性処理で説明したように、シーケンスコンストラクタに現れている認識しないXSLT要素は、 (a) 前方互換性挙動が利用可能であり、また、(b) その命令が xsl:fallback 子を持つ場合を除き、静的エラーです。

19. 最終結果ツリー / Final Result Trees >>


ホーム前へ次へ