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

【Creating Nodes and Sequences / ノード生成と順番】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0

ホーム前へ次へ
XSLTノード生成と順番とは?

【Creating Nodes and Sequences / ノード生成と順番】XSLT 2.0/XSL Transformations Version2.0/Extensible Stylesheet Language Transformations Version2.0

XSLT 2.0ノード生成と順番とは

 W3C勧告XSLTバージョンXSLT 2.0の「Creating Nodes and Sequences / ノード生成と順番」

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

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

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

XSLT 2.0ノード生成順目次


11 ノード生成と順番 / Creating Nodes and Sequences
 11.1 リテラル結果要素 Literal Result Elements
  11.1.1 リテラル結果要素における注釈タイプ設定 Setting the Type Annotation for Literal Result Elements
  11.1.2 リテラル結果要素における属性ノード Attribute Nodes for Literal Result Elements
  11.1.3 リテラル結果要素における名前空間ノード Namespace Nodes for Literal Result Elements
  11.1.4 名前空間エイリアス化(別名化) Namespace Aliasing
 11.2 要素ノード作成 [ xsl:element ]の利用
  11.2.1 要素ノード構築における注釈タイプ設定 Setting the Type Annotation for a Constructed Element Node
 11.3 属性ノード作成[ xsl:attribute ]の利用 Creating Attribute Nodes Using xsl:attribute
  11.3.1 属性ノード構築における注釈タイプ設定 Setting the Type Annotation for a Constructed Attribute Node
 11.4 テキストノード作成 Creating Text Nodes
  11.4.1 リテラルテキストノード
  11.4.2 テキストノード作成[ xsl:text ]の利用 Creating Text Nodes Using xsl:text
  11.4.3 テキスト生成[ xsl:value-of ]の利用 Generating Text with xsl:value-of
 11.5 文書ノード作成
 11.6 処理命令を作成する Creating Processing Instructions
 11.7 名前空間ノード作成
 11.8 コメント作成
 11.9 ノードのコピー・複製
  11.9.1 浅いコピー Shallow Copy
  11.9.2 深いコピー Deep Copy
 11.10 シーケンス構築 Constructing Sequences

11 ノードとシーケンスを生成する

このセクションは、新しいノード、または、ノードと原子化された値のシーケンスを直接生成する命令を記述します。

11.1 リテラル結果要素

[定義:  シーケンスコンストラクタでは、 スタイルシートにある要素は、XSLT名前空間に沿っておらず、 更にそれは、リテラル結果要素として分類される拡張命令(参照:18.2 拡張命令)ではありません。 ] リテラル結果要素は、(同じ名前空間URI、ローカル名、名前空間前置詞である)同じ拡張QNameを伴う新しい要素ノードを構築する為に評価されます。 リテラル結果要素を評価した結果は、要素、新たに構築した要素ノードを1つ含んでいるノードシーケンスです。

要素の内容は、シーケンスコンストラクタ(参照:5.7 シーケンスコンストラクタ)です。 このシーケンスコンストラクタを評価する事によって含んだシーケンスは、その後、11.1.2 リテラル結果要素における属性ノードと名前空間ノードで生成したいくつかの属性ノードを先頭に追加し、 11.1.3 リテラル結果要素における名前空間ノードで記述したように生成し、 5.7.1 複雑なコンテンツを構築するにある規則に続く要素の内容を構築する為に利用されます。

新しい要素の基準URIは、スタイルシートにあるリテラル結果要素の基準URIに対して(もし、それが相対URIである際に)解決したその属性の値である新しい要素の基準URIにおいて、新しい要素の内容が、 xml:base 属性を含まない限り(含む場合を除き)、スタイルシートにあるリテラル結果要素の基準URIからコピーされます。 (注記、しかしながら、これは、親のない要素を生成する際にのみ関係します。リテラル結果要素が、要素の子、または、文書ノードからコピーされる際には、新しいコピーの基準URIは、その新しい親のそれから取得されます。)

11.1.1 リテラル結果要素においてタイプ注釈を設定する

属性 xsl:typexsl:validation は、 タイプ定義、または、スキーマにある要素宣言に対して要素の内容の妥当性検証を実行する為に、更に、新しい要素ノードが搬送するであろうタイプ注釈を決める為にリテラル結果要素上で利用される場合があり、 これらの属性はまた、先祖としての新しい要素ノードを持ついくつかの要素と属性によって搬送したタイプ注釈の作用もあります。 これらの2つの属性は、双方ともオプションであり、もし、一方が記述される場合には、他方は、省略されなければいけません

xsl:validation 属性の値は、もし、存在する場合には、値は、 strictlaxpreserve 、または、 strip の1つにしなければいけません。 xsl:type 属性の値は、もし、存在する場合には、スタイルシートにおけるスコープ内スキーマコンポーネント内に存在するタイプ定義を識別するQNameにしなければいけません。 いずれでもない属性は、属性値テンプレートのように記述される場合があります。 これらの属性の効果は、19.2 妥当性で記述されます。

11.1.2 リテラル結果要素における属性ノード

リテラル結果要素における属性ノードは、シーケンスコンストラクタ内に xsl:attribute 命令を含む事によって生成される場合があります。 付加的な属性ノードは、もし、存在する場合には、リテラル結果要素の xsl:use-attribute-sets 属性を拡張した結果としてスタイルシートにあるリテラル結果要素の属性と一致するように生成されます。

リテラル結果要素のコンテンツを構築する為に利用したシーケンスは、 (5.7.1 複雑なコンテンツを構築するで記述したように)次に続く4つの種類のシーケンスの結合です:

  1. 11.1.3 リテラル結果要素における名前空間ノードで記述したように生成した名前空間ノードのシーケンス

  2. xsl:use-attribute-sets 属性を拡張する事によって生成した属性ノードのシーケンス (もし、存在する場合には) 次に続く規則が、10.2 名前付き属性セットの中で与えられます

  3. XSLT名前空間にある属性ではなく、リテラル結果要素それ自身の属性を処理する事によって生成した属性。これらが生成される方法は、以下に記述されます。

  4. もし、要素がカラでない場合には、含んだシーケンスコンストラクタを評価する事によって生成したシーケンス

注釈:

xsl:attribute によって生成した属性であるこの命令の重要性は、 リテラル結果要素のコンテンツにある xsl:copy、または、 xsl:copy-of 命令は、 xsl:use-attribute-sets 属性を拡張する事によって生成した属性を超えた優先権の取得を戻す中で、リテラル結果要素それ自身の属性を拡張する事によって生成した属性を超えて優先権を取得する事です。 これは、廃棄される重複の最後を除く、シーケンスにある2つ以上の属性が同じ名前を持つ場合を記述する5.7.1 複雑なコンテンツを構築するにある規則の為にあります。

たとえ、上記の規則が、属性の前に名前空間ノードを置くとしてもこれは、厳密には、 ノードの他の種類の前に来る双方と同じ非常に長いいくつかの命令の中に現れている名前空間と属性を許容する5.7.1 複雑なコンテンツを構築するの為に必要なわけではありません。 シーケンス中の名前空間ノードと属性ノードの命令は、それらがすぐにツリーに追加される文書命令の中にあるノードの関連する位置上では、存在しない効果を持ちます。

XSLT名前空間にある属性ではなく、リテラル結果要素の各属性は、 結果ツリーにある要素における属性を生成する為に処理されます。

このような属性の値は、属性値テンプレートとして解釈されます: それは、その結果、波カッコ( {} )の中に含んだを含む事が可能です。 新しい属性ノードは、スタイルシートツリーにある属性として(同じ名前空間URI、ローカル名、名前空間前置詞である)同じ拡張QNameを持つでしょう、 そして、そのstring 値は、スタイルシートツリーにある属性の有効な値として同じになるでしょう。 属性におけるタイプ注釈は、 xs:untypedAtomic を初期化し、 そして、属性ノードの区分した値は、そのstring値として同じになるでしょう。

注釈:

結果ツリーにある属性の結果として生じるタイプ注釈は、 親のリテラル結果要素の xsl:validationxsl:type 属性とその先祖要素を生成する為に利用した命令に依存します。 もし、 xsl:validation 属性が、preserve 、または、 strip に設定される場合には、 そのタイプ注釈は、そのstring値として同じになるであろう xs:untypedAtomic 、属性ノードの区分した値になるでしょう。 もし、 xsl:validation 属性が、 strict 、または、 lax に設定される、 または、 もし、 xsl:type 属性が、利用される場合には、属性におけるタイプ注釈は、その親要素に適用するスキーマ妥当性プロセスの結果として設定されるでしょう。 もし、いずれでもない属性が、存在する場合には、その属性におけるタイプ注釈は、 xs:untypedAtomic になるでしょう。

もし、構築した属性の名前が、 xml:id の場合には、プロセッサは、 属性の値にnormalize-spaceFO 関数を効果的に適用する事によって属性値標準化を行わなければならず、 また、結果属性ノードは、 is-id プロパティを与えなければいけません。

[ERR XTRE0795] もし、 構築した属性の名前が、 xml:space であり、また、その値が、 default 、または、 preserve いずれでもない場合には、 それは、回復可能な動的エラーです。 付加的な回復動作は、要求したものとしての値を伴う属性を構築する為にあります。 これは、その属性が、リテラル結果要素を利用して、または、 xsl:attributexsl:copyxsl:copy-of 命令を利用して 構築される属性かどうかを適用します。

注釈:

xml:basexml:lang 、 xml:spacexml:id 属性は、XSLTの中で2つの効果を持ちます。 それらは、例えば、もし、それらが、リテラル結果要素上に現れる場合には、それらは、他のいくつかの属性と同じ方法で結果ツリーにコピーされるだろうという意味において標準XSLT属性としてふるまいます。 付記すると、それらは、核となるXML仕様で定義したような意味となる標準を持ちます。 このように、スタイルシートにある xml:base 属性は、その要素にあるホワイトスペーステキストノードを解釈する作用のある xml:space 属性の出現において要素の基準URIに作用します。 この結果の1つは、属性値テンプレートとしてこれらの属性を書く為には不適当であるという事です。: たとえ、XSLTプロセッサが、この注釈を理解するとしても、XMLパーサーが、理解するわけではありません。 これらの属性を伴う xsl:namespace-alias を利用する方法の説明である11.1.4 名前空間 エイリアス(別名)化も参照。

まさにこれは、スキーマ定義属性 xsi:typexsi:nilxsi:noNamespaceSchemaLocationxsi:schemaLocation の現実です。 もし、スタイルシートが、スキーマプロセッサによって処理される場合には、これらの属性は、スキーマプロセッサによって認知と解釈されるでしょうが、しかし、追記すると、XSLTプロセッサは、リテラル結果要素における他のいくつかの属性のようにそれらを扱います: それは、それらの有効な値 (その後拡張する属性値テンプレート)は、いくつかの他の属性と同じ方法で結果ツリーにコピーされます。 もし、結果ツリーが、妥当であれば、そのコピーした属性は、スキーマプロセッサによって再び、認知され、解釈されるでしょう。

これらの属性の注記は、 スタイルシートが、いくつかの他の属性と同じ方法で明示的に結果ツリーにそれらを書かない限り(書く場合を除き)、結果ツリーの中で生成されるでしょうという事です。

[ERR XTSE0805] この仕様で明示的に定義した属性の1つでない限り(である場合を除き)、もし、リテラル結果要素における属性が、XSLT名前空間の中にある場合には、それは、静的エラーです。

注釈:

もし、XSLT名前空間の中で属性を生成する為にそれらが必要である場合には、これは、 xsl:attribute を利用して、または、 xsl:namespace-alias 宣言という意味において獲得する事が可能です。

11.1.3 リテラル結果要素における名前空間ノード

生成した要素ノードは、排除した名前空間として設計されるstring値のあるいくつかの名前空間ノードの例外を伴うスタイルシートツリーにある要素ノードに存在した名前空間ノードのコピーを持つでしょう。 特別な考慮は、 別名とした名前空間を適用します。:11.1.4 名前空間 エイリアス化(別名化)参照。

次に続く名前空間は、排除した名前空間のように設計されます:

  • XSLT名前空間URI (http://www.w3.org/1999/XSL/Transform)

  • 拡張名前空間として定義した名前空間URI (参照先: 18.2 拡張命令)

  • リテラル結果要素それ自身における、または、先祖要素における [xsl:]exclude-result-prefixes 属性のいずれかを利用する事によって設計される名前空間URI。 その属性は、XSLT名前空間の中に存在し ない その親要素である場合に限り、XSLT名前空間の中に存在しなければいけません

    属性の値は、 #all 、または、トークンのホワイトスペースで区切られたリスト、名前空間前置詞、または、 #default のいずれかであるそれぞれ、のいずれかです。 名前空間は、排除した名前空間として設計される前置詞のそれぞれに基礎を置きます。

    [ERR XTSE0808] もし、名前空間前置詞が、 [xsl:]exclude-result-prefixes 属性内で利用され、その前置詞におけるスコープ内で結び付けられているのが存在しない名前空間である場合には、 それは、静的エラーです。

    [xsl:]exclude-result-prefixes 属性の親要素の既定名前空間 (参照先: セクション 6.2 要素 ノードDM) は、名前空間前置詞のリストの中にある #default を含む事によって排除した名前空間のように設計される場合があります。

    [ERR XTSE0809] もし、値 #default が、 [xsl:]exclude-result-prefixes 属性の中で利用され、存在しない既定名前空間を持つ [xsl:]exclude-result-prefixes 属性の親要素である場合には、 それは、静的エラーです。

    #all は、排除した名前空間のように設計される [xsl:]exclude-result-prefixes 属性の親であるスタイルシート要素においてスコープにある全ての名前空間を示します。

    排除した名前空間のような名前空間の設計は、 [xsl:]exclude-result-prefixes 属性と関係する要素においてルートとしたスタイルシートモジュールのサブツリーの中で有効になります。; xsl:stylesheet 要素でルートとしたサブツリーは、 取り込んだいくつかのスタイルシートモジュール、または、xsl:stylesheet 要素の子によって含んだスタイルシートモジュールを含みません。

上で記述したように排除した名前空間は、リテラル結果要素を処理する際に、スタイルシートからコピーした名前空間ノードに だけ 作用します。 排除した名前空間が、結果ツリー上に現れないという保証は、いくつかの他の理由においてありません。 名前空間ノードはまた、名前空間の取り決め(参照先: 5.7.3 名前空間の取り決め)のプロセスの一部として、または、 xsl:copyxsl:element のような命令の結果として結果ツリーにも書かれます。

注釈:

スタイルシートが、 [xsl:]exclude-result-prefixes 属性にある前置詞を記述したソースツリーのアドレスを指定する目的においてのみ利用される際には、 シリアライズした結果ツリーにある不適切な名前空間宣言を回避するでしょう。 その属性はまた、シリアライズした結果ツリー内の出現から得るスタイルシート関数、または、拡張関数の名前付けにおいて単独で利用した名前空間を防ぐための利便性でもあります。

例:結果ツリーから名前空間を排除する

例えば、次に続くスタイルシートを考えてみましょう:

<xsl:stylesheet xsl:version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:a="a.uri"
	xmlns:b="b.uri">
	exclude-result-prefixes="#all">
	
<xsl:template match="/">
	<foo xmlns:c="c.uri" xmlns:d="d.uri" xmlns:a2="a.uri" 
			 xsl:exclude-result-prefixes="c"/>
</xsl:template>
</xsl:stylesheet>

このスタイルシートの結果は、(以下のようになるでしょう):

<foo xmlns:d="d.uri"/>

名前空間 a.urib.uri は、xsl:stylesheet 要素にある exclude-result-prefixes 属性の効力によって排除され、 更に名前空間 c.uri は、 foo 要素にある xsl:exclude-result-prefixes 属性の効力によって排除されます。 その設定 #all は、 xsl:stylesheet 要素におけるスコープ内名前空間ではないので、名前空間 d.uri には作用しません。 結果ツリーにあるその要素は、 exclude-result-prefixes の効果が、排除した名前空間として名前空間 URI a.uri を設計する為にあるので 多くの前置詞が、どのようにこの名前空間URIに基礎を置いているのかに関わらず、 xmlns:a2="a.uri" と一致する名前空間ノードを持ちません。

もし、そのスタイルシートが、 属性 b:bar="3" を持つリテラル結果要素のように変更される場合には、 結果ツリーにあるその要素は、概して名前空間宣言 xmlns:b="b.uri" を持つでしょう(もし、これが、衝突を回避する為に必要であれば、プロセッサは、異なる名前空間前置詞を選ぶ場合があります)exclude-result-prefixes 属性は、排除した名前空間 b.uri を作り、その為、名前空間ノードは、スタイルシートから自動的にコピーされませんが、 しかし、名前のある属性の存在は、この名前空間について名前空間ノードを紹介する為の名前空間の取り決めプロセス (参照先: 5.7.3 名前空間の取り決め)を強要する名前空間 b.uri の中にあります。

リテラル結果要素は、値 yes 、または、 no を伴う付加的な xsl:inherit-namespaces 属性を持つ場合があります。 既定値は、 yes です。 もし、その値が、 yes に設定されるか、または、省略される場合には、 新たに構築した要素において生成した名前空間ノードは、5.7.1 複雑なコンテンツを構築するで記述したように 新たに構築した要素の子と子孫にコピーされます。 もし、その値が、 no に設定される場合には、 これらの名前空間ノードは、子に自動的にコピーされません。 これは、最終結果ツリーがシリアライズされる際に子要素上に現れる( xmlns="" のような、または、XML 1.1のケースでは、 xmlns:p="" のような)宣言されない名前空間の結果になる場合があります。

11.1.4 名前空間エイリアス化(別名化)

スタイルシートが、出力が、スタイルシートモジュールそれ自身である変換を定義する為に利用される、または、スタイルシートの中で利用するには不便であろう名前空間を利用する結果文書である事が明らかなケースでは、 名前空間エイリアス化(別名化)は、スタイルシートの中で利用した名前空間URIと結果文書の中で利用される為の名前空間URIとの間で一致するものとのマップを宣言する為に利用される事が可能です。

[定義:  スタイルシートツリーにある名前空間URIは、リテラル名前空間URIと呼ばれる結果ツリーにある名前空間URIを記述する為に利用されています。 ]

[定義:  名前空間URIは、目標名前空間URIと呼ばれるリテラル名前空間URIにおける部分文字列として 結果ツリーの中で利用される為にあります。 ]

リテラル名前空間URI、または、 目標名前空間URIのいずれかは、 null にする事ができます。: これは、存在しない名前空間である名前のセットを参照するものとして扱われます。

<!-- カテゴリ: 宣言 -->
<xsl:namespace-alias
  stylesheet-prefix = prefix | "#default"
  result-prefix = prefix | "#default" />

[定義:  スタイルシートは、目標名前空間URIにおいて alias(エイリアス:別名)として利用されているリテラル名前空間URIを宣言する為に xsl:namespace-alias 要素を利用する事が可能です。 ]

その効果は、リテラル名前空間URIによって識別した名前空間にある名前が、 結果ツリーにコピーされる際には、結果ツリーにある名前空間URIは、リテラル名前空間URIの代わりに目標名前空間URIにするでしょう。 これは、(以下に)適用します:

  • スタイルシートにあるリテラル結果要素の拡張QNameにある名前空間URI

  • スタイルシートにあるリテラル結果要素上に記述した属性の拡張QNameにある名前空間URI

名前空間エイリアス化(別名化)が、要素、または、属性ノードの名前を含んでいる拡張QNameの一部に名前空間URIを変更する場合には、 拡張QNameにあるその名前空間前置詞は、 xsl:namespace-alias 宣言の result-prefix 属性によって示される前置詞によって置き換えられます。

xsl:namespace-alias 要素は、リテラル名前空間URIである stylesheet-prefix によって記述した前置詞に基づく名前空間URIを宣言します、 result-prefix 属性によって記述した前置詞に基づくその名前空間URIは、目標名前空間URIです。 このように、 stylesheet-prefix 属性は、スタイルシートに現れるであろう名前空間URIを記述し、 そして更に、 result-prefix 属性は、結果ツリーに現れるであろう名前空間URIと一致するものを記述します。

( xmlns によって宣言したものとしての)既定名前空間は、前置詞の代わりに #default を利用する事によって記述される場合があります。 もし、存在しない既定名前空間が #default を記述している効力がある場合には、 Null名前空間URIを意味します。 これは、結果文書にある名前空間を取得する為にスタイルシートで存在しない名前空間にある要素を許容します、または、逆の場合も同じ(vice versa)です。

もし、リテラル名前空間URIが、複数の異なる目標名前空間URIにおいてエイリアスにする為に宣言される場合には、 より高い取り込み優先度を伴う宣言が利用されます。

[ERR XTSE0810] もし、同じ リテラル名前空間URIと 同じ取り込み優先度目標名前空間URIにおける異なる値を伴うような宣言が、1つ以上ある場合には、 同じリテラル名前空間URIと、より高い取り込み優先度を伴う xsl:namespace-alias 宣言もない限りは(ある場合を除き)、 それは、静的エラーです。

[ERR XTSE0812] もし、名前空間前置詞において結び付いているものがスコープ内に存在しない際に、 stylesheet-prefix 、または、 xsl:namespace-alias 要素の result-prefix 属性のいずれかにおいて #default ではなく、ある値が記述される場合には、 それは、静的エラーです。

リテラル結果要素が処理される際には、その名前空間ノードは、次のように操作されます:

リテラル名前空間URI目標名前空間URIとして利用される同じURIという場合には、これらの規則の2つめが優先権を取得します。

注釈:

これらの規則は、目標名前空間URIresult-prefix を結びつけるスコープ内名前空間ノードを持つであろうリテラル結果要素から生成した要素という効果を獲得し、 このURIを伴うこの前置詞を結びつけている提供したその名前空間宣言は、 xsl:namespace-alias 命令とリテラル結果要素における双方においてスコープ内にあります。 逆に言えば、 stylesheet-prefixリテラル名前空間URIは、 結果ツリーには普通は現れないでしょう。

例:スタイルシートを生成する為の xsl:namespace-alias を利用する

リテラル結果要素が、XSLT名前空間URIを利用する要素、属性、または、名前空間ノードを生成する為に利用されている際には、スタイルシートは、エイリアスを利用する場合があります。

例えば、スタイルシートが

<xsl:stylesheet
	version="2.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:fo="http://www.w3.org/1999/XSL/Format"
	xmlns:axsl="file://namespace.alias">
<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>
<xsl:template match="/">
	<axsl:stylesheet version="2.0">
		<xsl:apply-templates/>
	</axsl:stylesheet>
</xsl:template>
<xsl:template match="elements">
	<axsl:template match="/">
		 <axsl:comment select="system-property('xsl:version')"/>
		 <axsl:apply-templates/>
	</axsl:template>
</xsl:template>
<xsl:template match="block">
	<axsl:template match="{.}">
		 <fo:block><axsl:apply-templates/></fo:block>
	</axsl:template>
</xsl:template>
</xsl:stylesheet>

は、フォームの文書からXSLTスタイルシートを生成するでしょう:

<elements>
<block>p</block>
<block>h1</block>
<block>h2</block>
<block>h3</block>
<block>h4</block>
</elements>

変換の出力は、次のようなスタイルシートになるでしょう。 ホワイトスペースは、明確に追加されています。 注記としては、手法は、この例に現れるそれらから異なる名前空間前置詞を出力する場合があります。; しかしながら、規則は、生成したスタイルシートのコンテンツにあるQName xsl:version を利用する為に、安全にそれを行うURI http://www.w3.org/1999/XSL/Transform に前置詞 xsl を結びつける名前空間ノードにするという事を保証します。

<xsl:stylesheet
	version="2.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
	xmlns:fo="http://www.w3.org/1999/XSL/Format">
<xsl:template match="/">
	<xsl:comment select="system-property('xsl:version')"/>
	<xsl:apply-templates/>
</xsl:template>
	
<xsl:template match="p">
	<fo:block><xsl:apply-templates/></fo:block>
</xsl:template>
<xsl:template match="h1">
	<fo:block><xsl:apply-templates/></fo:block>
</xsl:template>
<xsl:template match="h2">
	<fo:block><xsl:apply-templates/></fo:block>
</xsl:template>
<xsl:template match="h3">
	<fo:block><xsl:apply-templates/></fo:block>
</xsl:template>
<xsl:template match="h4">
	<fo:block><xsl:apply-templates/></fo:block>
</xsl:template>
</xsl:stylesheet>

注釈:

それは、XSLT名前空間URIではない名前空間におけるエイリアスを利用する為にもまた必要となる場合があります。 例えば、それは、名前空間 http://www.w3.org/2001/XMLSchema-instance におけるエイリアスを定義する為に有益になる事が可能で、 その為、スタイルシートは、リテラル結果要素上の属性 xsi:typexsi:nilxsi:schemaLocation を利用する事が可能です。 稼働リスクがない場合には、スキーマプロセッサは、スタイルシートそれ自身に適用するものとしてこれらを解釈するでしょう。 同様に、デジタル署名を伴って扱われている名前空間に沿っているリテラル結果要素は、一般目的のセキュリティソフトウェアによる誤動作がXSLTスタイルシートに起因する場合もあります; 名前空間においてエイリアスを利用する事は、このような誤動作の可能性を回避するでしょう。

例:XML名前空間のエイリアス化

XML名前空間においてエイリアスを定義する事が可能です。

<xsl:stylesheet xmlns:axml="http://www.example.com/alias-xml"
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		version="2.0">
<xsl:namespace-alias stylesheet-prefix="axml" result-prefix="xml"/>
<xsl:template match="/">
	<name axml:space="preserve">
		<first>James</first>
		<xsl:text> </xsl:text>
		<last>Clark</last>
	</name>
</xsl:template>
</xsl:stylesheet>

出力生成:

<name xml:space="preserve"><first>James</first> <last>Clark</last></name>

これは、スタイルシートが解析される方法に影響なく出力の中で生成される xml:space 属性を許容します。 同じテクニックは、 xml:langxml:basexml:id のような他の属性において利用される事が可能です。

注釈:

名前空間エイリアス化は、リテラル結果要素が利用される際にのみ必要とされます。 予約済み名前空間の問題は、結果ツリーを構築する為の xsl:elementxsl:attribute を利用する際には、現れません。 それゆえに、 xsl:namespace-alias を利用する為の代替策として、 xsl:elementxsl:attribute 命令を伴うリテラル結果要素を置換する事によって要求された効果を獲得する事を常に可能にします。

11.2 xsl:element を利用して要素ノードを作成する

<!-- カテゴリ: 命令 -->
<xsl:element
  name = { qname }
  namespace? = { uri-reference }
  inherit-namespaces? = "yes" | "no"
  use-attribute-sets? = qnames
  type? = qname
  validation? = "strict" | "lax" | "preserve" | "strip">
  <!-- Content: sequence-constructor -->
</xsl:element>

xsl:element 命令は、算出した名前を伴って作成される為に要素を許容します。 作成される為の要素の拡張QNameは、 name 属性と付加的な namespace 属性を要求した事によって記述されます。

xsl:element 命令のコンテンツは、作成した要素の子、属性、名前空間におけるシーケンスコンストラクタです。 このシーケンスコンストラクタ (参照先: 5.7 シーケンスコンストラクタ)を評価する事によって含んだシーケンスは、 5.7.1 複雑なコンテンツを構築するで記述したように要素のコンテンツを構築する為に利用されます。

xsl:element 要素は、 値が xsl:attribute-set 宣言を識別するQNamesのホワイトスペースで区切られたリストである use-attribute-sets 属性を持つ場合があります。 もし、この属性が存在する場合には、属性ノードのシーケンスを生成する為に10.2 名前付き属性セットで記述したように拡張されます。 このシーケンスは、5.7.1 複雑なコンテンツを構築するで記述したように シーケンスコンストラクタを評価結果として生成したシーケンスを先頭に追加されます。

xsl:element 命令の評価結果は、エラーの中にあるケースをを除き、新たに構築した要素ノードです。

name 属性は、語彙的なQNameにしなければならない有効な値である属性値テンプレートとして解釈されます。

[ERR XTDE0820] もし、 name 属性の有効な値が、語彙的なQNameでない場合には、 それは、回復されない動的エラーです。

[ERR XTDE0830] 存在しない namespace 属性を伴う xsl:element 命令のケースでは、 もし、 name 属性の有効な値が、 xsl:element 命令における スコープ内名前空間宣言に宣言していない前置詞であるQNameの場合には、 回復されない動的エラーです。

もし、 namespace 属性が存在しない場合には、 QNameは、いくつかの既定名前空間宣言を含んでいる xsl:element 要素における作用の中にある名前空間宣言を利用して 拡張QNameに拡張されます。

もし、 namespace 属性が存在する場合には、 属性値テンプレートとしても解釈されます。 有効な値は、 xs:anyURI タイプの語彙的なスペースの中に存在しなければいけません もし、文字列がゼロの長さである場合には、要素の拡張QNameは、Null名前空間URIを持ちます。 他方で、文字列は、 生成される為の要素の拡張QNameの名前空間URIとして利用されます。 name 属性によって記述した語彙的なQNameのローカル部分は、 生成される為の要素の拡張QNameのローカル部分として利用されます。

[ERR XTDE0835] もし、 namespace 属性の有効な値が、 xs:anyURI データタイプの語彙的なスペースの中にない場合には、 それは、回復されない動的エラーです。

注釈:

XDMデータモデルは、 xs:QName のインスタンスとなるようにノードの名前を要求し、 そして、XMLスキーマは、 xs:anyURI のインスタンスになるように xs:QName の名前空間部分を定義します。 しかしながら、スキーマ仕様、とそれを参照する仕様は、それらが、どのように厳密にこれらの制約適用するのかという中でいくつかの柔軟性が手法に与えられます。

name 属性の中で (または、前置詞の欠如の中で)記述した語彙的なQNameの前置詞は、 新しい要素ノードの名前を表現する拡張QNameの前置詞部分がコピーされます。 衝突の場合では、名前空間の取り決めプロセス(参照:5.7.3 名前空間の取り決め)中に、前置詞は、すぐあとに続いて追加・変更、または削除される場合があります

xsl:element 命令は、値 yes 、または、 no を伴う付加的な inherit-namespaces 属性を持ちます。 既定値は、 yes です。 もし、値が、 yes に設定される、または、省略される場合には、 新たに構築した要素において生成した名前空間ノード (ソースノードのそれらからコピーされたのか、または、名前空間の取り決めの結果として生成したのかどうか)は、5.7.1 複雑なコンテンツを構築するで説明したように新たに構築した要素の子と子孫にコピーされます。 もし、値が、 no に設定される場合には、これらの名前空間ノードは、子に自動的にはコピーされません。 これは、最終結果ツリーがシリアライズされる際に子要素上に現れる( xmlns="" 、または、XML名前空間1.1のケースでは、 xmlns:p="" のような)宣言していない名前空間の中に生じる場合があります。

その属性の値である新しい要素の基準URIというケースにおいて、スタイルシートにある xsl:element 命令の基準URIに対して(もし、それがURIに関連する場合には)解決した場合を除いて、新しい要素の基準URIは、スタイルシートにある xsl:element 命令の基準URIからコピーされます。 (注記、しかしながら、これは、親のない要素を生成する際にのみ関連します。 新しい要素が、要素の子、または、文書ノードからコピーされる際には、新しいコピーの基準URIは、その新しい親のそれから取得されます。)

11.2.1 構築した要素ノードにおけるタイプ注釈を設定する

付加的な属性 typevalidation は、 タイプ定義に対して要素のコンテンツの妥当性検証を実行する為の xsl:element 命令、または、スキーマ内での要素宣言、 また、新しい要素ノードが搬送されるであろうタイプ注釈を決定する為に利用される場合があります。 これらの属性はまた、先祖としての新しい要素ノードを持ついくつかの要素と属性によって搬送したタイプ注釈にも作用します。 これらの2つの属性は、双方ともにオプションであり、もし、一方が記述される場合には、他方は省略されなければいけません。 許容したこれらの属性の値とそれらのセマンティクスは、19.2 妥当性検証で記述されます。

注釈:

結果ツリーにある要素の最終タイプ注釈はまた、要素の先祖を生成する為に利用した命令の typevalidation 属性に依存します。

11.3 xsl:attribute を利用して属性ノードを生成する

<!-- カテゴリ: 命令 -->
<xsl:attribute
  name = { qname }
  namespace? = { uri-reference }
  select? = expression
  separator? = { string }
  type? = qname
  validation? = "strict" | "lax" | "preserve" | "strip">
  <!-- Content: sequence-constructor -->
</xsl:attribute>

xsl:attribute 要素は、スタイルシートにあるリテラル結果要素によって生成されたのか、または、 xsl:element 、または、 xsl:copy のような命令によって生成されたのかどうかについて結果要素に属性を追加する為に利用される事が可能です。 生成される属性の拡張QNameは、要求した name 属性と付加的な namespace 属性によって記述されます。 エラーである場合を除き、xsl:attribute 命令を評価した結果は、新たに構築した属性ノードです。

新しい属性ノードの文字列値は、 select 属性を利用する事によって、または、 xsl:attribute 要素のコンテンツを形作る為のシーケンスコンストラクタによって のいずれかで定義される場合があります。 もし、存在する、または、新しい属性ノードの値が、いずれもゼロの長さの文字列でない場合には、これらは、相互に排他となります。 構築される値における方法は、5.7.2 単純なコンテンツを構築するで記述されます。

[ERR XTSE0840] もし、 xsl:attribute 要素の select 属性が存在する場合には、カラのコンテンツを持つ要素である場合を除き、それは、静的エラーです。

もし、 separator 属性が存在する場合には、 この属性の有効な値は、5.7.2 単純なコンテンツを構築するで記述したように結果シーケンスにある隣り合うアイテムを分割する為に利用されます。 この属性の欠如のケースでは、 既定セパレータは、コンテンツが、 select 属性を利用して記述される、または、コンテンツが、シーケンスコンストラクタを利用して記述される際にゼロの長さの文字列である際には、1つのスペース(#x20)です。

name 属性は、 語彙的なQNameにしなければならない有効な値である属性値テンプレートとして解釈されます。

[ERR XTDE0850] もし、 name 属性の有効な値が、語彙的なQNameでない場合には、 それは、回復されない動的エラーです。

[ERR XTDE0855] 存在しない namespace 属性を伴う xsl:attribute 命令のケースでは、 もし、 name 属性の有効な値が、文字列 xmlns である場合には、 それは、回復されない動的エラーです。

[ERR XTDE0860] 存在しない namespace 属性を伴う xsl:attribute 命令のケースでは、 もし、 name 属性の有効な値が、 前置詞が、 xsl:attribute 命令においてスコープ内名前空間宣言の中で宣言されていない語彙的なQNameである場合には、 それは、回復されない動的エラーです。

もし、 namespace 属性が、存在しない場合には、 語彙的なQNameは、 いくつかの既定名前空間宣言を含んでいない xsl:attribute 要素における作用の中にある名前空間宣言を利用して拡張QNameに拡張されます。

もし、 namespace 属性が存在する場合には、 属性値テンプレートとしても解釈されます。 有効な値は、 xs:anyURI タイプの語彙的なスペースの中に存在しなければいけません もし、文字列がゼロの長さである場合には、属性の拡張QNameは、Null名前空間URIを持ちます。 他方で、文字列は、生成された属性の拡張QNameの名前空間URIとして利用されます。 name 属性によって記述した語彙的なQNameのローカル部分は、生成される為の属性の拡張QNameのローカル部分として利用されます。

[ERR XTDE0865] もし、 namespace 属性の有効な値が、 xs:anyURI データタイプの語彙的なスペースでない場合には、 それは、回復されない動的エラーです。

注釈:

要素にあったような同じ適用の考慮: [参照:11.2 [ xsl:element ]を利用して要素ノードを作成するにあるERR XTDE0835]

name 属性で記述した語彙的なQNameの前置詞 (または、前置詞の欠如)は、 新しい属性ノードの名前を表現する拡張QNameの前置詞部分がコピーされます。 衝突の場合には、この前置詞 (または、前置詞の欠如)は、名前空間の取り決めプロセス中に変換される部分文字列である場合があります。 (参照先: 5.7.3 名前空間の取り決め). もし、属性が、Nullでない名前空間にあり、存在しない前置詞が記述される場合には、名前空間の取り決めプロセスは、前置詞を生みだすでしょう。

もし、構築した属性の名前が、 xml:id である場合には、プロセッサは、属性の値を normalize-spaceFO 関数に効果的に適用する事によって属性値標準化を行わなければならず、 そして結果属性ノードは、 is-id プロパティを与えなければいけません。 これは、属性が、 xsl:attribute 命令を利用して構築されるかどうか、または、リテラル結果要素の属性を利用して構築されるかどうかを適用します。 これは、属性の値上、または、その一意の値上にあるいくつかの制約を含まず、 そして、有効にされる文書を含んでいる場合を除き、属性のタイプ注釈に作用しません。

注釈:

is-id プロパティを設定する事の効果は、親要素が、 idFO 関数の利用によって含んでいる文書内で配置される事ができる事です。 効果としては、XSLTは、[xml:id]で定義したように、文書を構築している際に xml:id プロセッサの関数のいくつかを実行します; xml:id 処理の他の局面は、妥当性検証中に実行されます。

例:List-Valued 属性を作成する

次に続く命令は、属性 colors="red green blue" を創出します:

<xsl:attribute name="colors" select="'red', 'green', 'blue'"/>

 

例:名前空間は、属性ではない

(以下のように)書く事は、エラーではありません。:

<xsl:attribute name="xmlns:xsl" namespace="file://some.namespace">
			http://www.w3.org/1999/XSL/Transform</xsl:attribute>

しかしながら、これは、出力されている名前空間宣言 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" にある結果にはならないでしょう。 代わりに、名前空間URI file://some.namespace をマップした system-allocated 名前空間前置詞を伴うローカル名 xsl を持つ属性ノードを生成します。 これは、名前空間の取り決めプロセスではありませんので、名前空間ノードの名前として xmlns を利用する事が許容されます。

5.7.1 複雑なコンテンツを構築するで記述したように、要素のコンテンツを構築する為に利用されるシーケンス内では、 いくつかの属性ノードは、いくつかの要素、テキスト、コメント、または、処理命令ノードの前のシーケンスの中に現れなければいけません。 シーケンスが2つ以上含まれる場合には、同じ拡張QNameを伴う属性ノードの内の最後にくる1つが、1つだけ効果を取得します。

注釈:

もし、属性のコレクションが、繰り返し生成される場合には、 これは、名前付き属性セットを利用する事によって簡便に行われる事が可能です。:参照 10.2 名前付き属性セット

11.3.1 構築した属性ノードにおいてタイプ注釈を設定する

付加的な属性 typevalidation は、タイプ定義に対して属性のコンテンツの妥当性検証を実行する為の xsl:attribute 命令上で、または、 スキーマにある属性宣言上で利用される場合があり、 そして、新しい属性ノードが搬送されるであろうタイプ注釈を決定します。 これらの2つの属性は、双方ともにオプションであり、もし、一方が記述される場合には、他は省略されなければいけません。 許容したこれらの属性の値とそれらのセマンティクスは、19.2 妥当性の中で記述されます。

注釈:

結果ツリーにある属性の最終タイプ注釈はまた、 属性の先祖を生成する為に利用した命令である typevalidation 属性に依存します。

11.4 テキストノードを作成する

このセクションは、スタイルシートにあるリテラルテキストノード、または、 xsl:textxsl:value-of 命令を利用する事によってという意味でテキストノードを作成する異なる3つの方法について記述します。 それは、 12 番号付け・連番で記述した xsl:number 命令を利用してテキストノードを作成する事を可能にします。

仮に(または実際に)シーケンスが、ノードのコンテンツを形作るの為に利用されるシーケンスコンストラクタ評価から結果を得る際に、 5.7.2 単純なコンテンツを構築する5.7.1 複雑なコンテンツを構築するで記述したようにシーケンス中の隣り合うテキストノードは、マージされます。 シーケンスそれ自身の中では、しかしながら、ノードを識別するものとして存在します。

例:テキストノードのシーケンス

次に続く関数は、3つのテキストノードのシーケンスを返します:

<xsl:function name="f:wrap">
	<xsl:param name="s"/>
	<xsl:text>(</xsl:text>
	<xsl:value-of select="$s"/>
	<xsl:text>)</xsl:text>
</xsl:function>

この関数が次に続くように呼ばれる際には、:

<xsl:value-of select="f:wrap('---')"/>

その結果は:

(---)

存在しない付加的なスペースが、xsl:value-of 命令を呼ぶという事は、シーケンスを原子化する前に隣り合うテキストノードをマージするので挿入されます。 しかしながら、命令のその結果は:

<xsl:value-of select="data(f:wrap('---'))"/>

です:

( --- )

このケースにおける理由は、3つのテキストノードが、3つの文字列を形成する為に原子化され、隣り合う文字列間にスペースが挿入されるからです。

それは、文字列値がゼロの長さであるテキストノードを構築する事を可能とします。 ゼロの長さのテキストノードは、原子化した際に、ゼロの長さの文字列を作成します。 しかしながら、ゼロの長さのテキストノードは、5.7.1 複雑なコンテンツを構築する5.7.2 単純なコンテンツを構築するで記述したようにノードのコンテンツを形作る為に利用されるシーケンス中に現れる際に無視されます。

11.4.1 リテラルテキストノード

シーケンスコンストラクタは、テキストノードを含む事が可能です。 4.2 スタイルシートからホワイトスペースを除去するで記述したようにホワイトスペーステキストノードが取り除かれた後に残っているシーケンスコンストラクタにある各テキストノードは、 同じstring値を伴う新しいテキストノードを構築するでしょう。 その結果テキストノードは、含んでいるシーケンスコンストラクタの結果に追加されます。

テキストは、ツリーレベルで処理されます。 このように、テンプレートにある &lt; の作成は、文字 < を含むテキストノードによってスタイルシートツリーの中で表現されるでしょう。 これは、 文字列マップ (参照先: 20.1 文字マップ)、または、 disable-output-escaping (参照先: 20.2 出力エスケープを使用不可能にする)を利用する事が記述されない限り(記述される場合を除き)、 結果ツリーがXML文書のようにシリアライズされる際に、 &lt; (または、等価文字列参照)を作成する事によって表現されるであろう < 文字を含む結果ツリーにあるテキストノードを作成するでしょう。

11.4.2 xsl:text を利用してテキストノードを作成する

<!-- カテゴリ: 命令 -->
<xsl:text
  [disable-output-escaping]? = "yes" | "no">
  <!-- Content: #PCDATA -->
</xsl:text>

xsl:text 要素は、新しいテキストノードを構築する為に評価されます。 xsl:text 要素のコンテンツは、 新しいテキストノードのstring 値を形成する値である単独のテキストノードです。 xsl:text 要素は、 文字列値が、ゼロの長さの文字列であるテキストノードである命令を評価した結果においては、カラとなる場合があります。

xsl:text 命令を評価した結果は、新たに構築したテキストノードです。

xsl:text 命令の前後の子であるテキストノードは、 それが、ホワイトスペースだけが存在する場合でさえ、スタイルシートツリーから取り除かれないでしょう。 (参照先: 4.4 ソースツリーからホワイトスペースを取り除く)。

非推奨 disable-output-escaping 属性の効果については、20.2 出力エスケープを使用不可にする参照。

注釈:

結果ツリーにテキストノードを書く為の xsl:text 命令を常に利用してはいけません。 算出したテキストが、 xsl:value-of 命令を利用して出力される事が可能である間、 リテラルテキストは、シーケンスコンストラクタ内のどこででもそれを含む事によって結果ツリーに書かれる事が可能です。 xsl:text 利用における主な理由は、ホワイトスペース操作を超える向上した操作を提供する事です。

11.4.3 xsl:value-of を伴うテキストを生成する

シーケンスコンストラクタがない場合には、 xsl:value-of 命令は、算出したテキストノードを生成する為に利用される事が可能です。 xsl:value-of 命令は、 select 属性の値として、または、含んだ命令という意味で記述したを利用してテキストを算出します。 これは、例えば、ソースツリーからテキストを取り出す、または、変数の値を挿入するかもしれません。

<!-- カテゴリ: 命令 -->
<xsl:value-of
  select? = expression
  separator? = { string }
  [disable-output-escaping]? = "yes" | "no">
  <!-- Content: sequence-constructor -->
</xsl:value-of>

xsl:value-of 命令は、新しいテキストノードを構築する為に評価されます。; 命令の結果は、新たに構築したテキストノードです。

新しいテキストノードの文字列値は、 select 属性を利用する事によって、または、xsl:value-of 要素のコンテンツを形成するシーケンスコンストラクタ (参照:5.7 シーケンスコンストラクタ)によっての、いずれかで定義される場合があります。 これらは、相互に排他となり、それらの1つは存在しなければいけません。 構築した値における方法は、5.7.2 単純なコンテンツを構築するで記述されます。

[ERR XTSE0870] もし、 xsl:value-of 要素の select 属性が、要素のコンテンツがカラでない際に存在する、 または、もし、 select 属性が、コンテンツがカラである際に欠如する場合には、 それは、静的エラーです。

もし、 separator 属性が、存在する場合には、 この属性の有効な値は、5.7.2 単純なコンテンツを構築するで記述したように結果シーケンスにある隣り合うアイテムを分割する為に利用されます。 この属性の欠如では、既定セパレータは、コンテンツが select 属性を利用して記述した際、または、コンテンツが、シーケンスコンストラクタを利用して記述した際に、ゼロの長さの文字列である場合には、単独のスペース(空白) (#x20)です。

特別規則は、後方互換性挙動が、命令において利用可能となっている際に適用します。 もし、存在しない separator 属性が存在する場合、そして、もし、 select 属性が存在する場合には、最初ではなく、原子化した結果シーケンスにある全てのアイテムが無視されます。

例:セパレータを伴うリストを生成する

その命令は:

<x><xsl:value-of select="1 to 4" separator="|"/></x>

出力を生成します:

<x>1|2|3|4</x>

注釈:

xsl:copy-of 要素は、 atomization(原子化する)(こと)なしで結果ツリーにノードのシーケンスをコピーする為に利用される事が可能です。 参照 11.9.2 深いコピー

非推奨 disable-output-escaping 属性の効果については、20.2 出力エスケープを使用不可能にする参照。

11.5 文書ノードを作成する

<!-- カテゴリ: 命令 -->
<xsl:document
  validation? = "strict" | "lax" | "preserve" | "strip"
  type? = qname>
  <!-- Content: sequence-constructor -->
</xsl:document>

xsl:document 命令は、新しい文書ノードを作成する為に利用されます。 xsl:document 要素のコンテンツは、 新しい文書ノードの子におけるシーケンスコンストラクタです。 文書ノードは、生成され、シーケンスは、5.7.1 複雑なコンテンツを構築するで記述したように文書のコンテンツを構築する為に利用されるシーケンスコンストラクタを評価する事によって含まれます。 この文書ノードをルートとした一時的なツリーは、結果ツリーを形成します。

エラーであるシチュエーションを除き、xsl:document 命令を評価した結果は、単独のノード、新たに構築した文書ノードです。

注釈:

新しい文書は、シリアライズされません。 文書を構築する事は、前後の結果ではなく、最終結果を形成する為にあり、19.1 最終結果ツリーを作成するで記述した xsl:result-document 命令を利用します。

付加的な属性 typevalidation は、 新しい文書のコンテンツを有効にする為に、そして、搬送するであろう結果ツリーにある要素と属性のタイプ注釈を決める為に xsl:document 命令上で利用される場合があります。 許容した値とそれらのセマンティクスは、19.2.2 文書ノードを妥当(有効)にするの中で記述されます。

新しい文書ノードの基準URIは、 xsl:document 命令の基準URIから取得されます。

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

例:一時的なツリーにある一意制約をチェックする

次に続く例は、変数の中に保持した一時的なツリーを創出します。 xsl:document 命令を含んだ利用では、チェックされる関連する要素におけるスキーマの中で定義した一意制約を保証します。

<xsl:variable name="tree" as="document-node()">
	<xsl:document validation="strict">
		<xsl:apply-templates/>
	</xsl:document>
</xsl:variable>

11.6 処理命令を作成する

<!-- カテゴリ: 命令 -->
<xsl:processing-instruction
  name = { ncname }
  select? = expression>
  <!-- Content: sequence-constructor -->
</xsl:processing-instruction>

xsl:processing-instruction 要素は、処理命令ノードを作成する為に評価されます。

xsl:processing-instruction 要素は、要求した 処理命令ノードの名前を記述する name 属性を持ちます。 name 属性の値は、属性値テンプレートとして解釈されます。

新しい処理命令ノードの文字列値は、 select 属性を利用する事によって、または、 xsl:processing-instruction 要素のコンテンツを形成する シーケンスコンストラクタによって、のいずれかで定義される場合があります。 これらは、 相互に排他です。 もし、存在がいずれでもない場合には、新しい処理命令ノードの文字列値は、ゼロの長さの文字列になるでしょう。 構築される値における方法については、5.7.2 単純なコンテンツを構築するで記述されます。

[ERR XTSE0880] もし、 xsl:processing-instruction 要素の select 属性が存在する場合には、要素がカラの内容を持つ場合を除き、それは、静的エラーです。

エラーのシチュエーションを除き、 xsl:processing-instruction 命令を評価した結果は、 単独のノード、新たに構築した処理命令ノードです。

例:処理命令を作成する

この命令は:

<xsl:processing-instruction name="xml-stylesheet"
	select="('href=&quot;book.css&quot;', 'type=&quot;text/css&quot;)"/>

処理命令を作成します

<?xml-stylesheet href="book.css" type="text/css"?>

注記としては、 xml-stylesheet 処理命令は、形式 name="value" にある 疑似属性[pseudo-attributes] を含みます。 たとえ、これらが、要素開始タグにある属性として同じ原文に従った形式を持つとしても、 それらは、XDM 属性ノードとして表現されず、更に、それゆえに xsl:attribute 命令を利用して構築されません。

[ERR XTDE0890] もし、 name 属性の有効な値が、 NCNameNamesPITargetXML の双方でない場合には、それは、回復されない動的エラーです。

注釈:

これらの規則は、名前 xml を許容しないので、 xsl:processing-instructionは、 XML宣言を出力する為に利用する事はできません。 xsl:output 宣言が、この代わりに操作する為に利用されるべきです(参照先: 20 シリアライゼーション)。

もし、 xsl:processing-instruction のコンテンツを評価した結果が、文字列 ?> を含む場合には、 この文字列は、 ?> との文字列間にスペースを挿入する事によって部分修正されます。

新しい処理命令の基準URIは、スタイルシートにある xsl:processing-instruction 要素の基準URIからコピーされます。 (注記、しかしながら、これは、親のない処理命令を作成する際にのみ関連します。 新しい処理命令が、要素の子から、または、文書ノードからコピーされる際には、新しいコピーの基準URIは、その新しい親のそれから取得されます。)

11.7 名前空間ノードを作成する

<!-- カテゴリ: 命令 -->
<xsl:namespace
  name = { ncname }
  select? = expression>
  <!-- Content: sequence-constructor -->
</xsl:namespace>

xsl:namespace 要素は、名前空間ノードを作成する為に評価されます。 エラーであるシチュエーションを除き、 xsl:namespace 命令を評価した結果は、 単独のノード、新たに構築した名前空間ノードです。

xsl:namespace 要素は、(名前空間前置詞である)名前空間ノードの名前を記述する name 属性を要求しています。 name 属性の値は、属性値テンプレートとして解釈されます。 もし、 name 属性の有効な値が、ゼロの長さの文字列である場合には、名前空間ノードは、既定名前空間において追加されます。

新しい名前空間ノードの(名前空間URIである)文字列値は、 select 属性利用中、または、 xsl:namespace 要素のコンテンツを形成するシーケンスコンストラクタ利用中のいずれかで定義される場合があります。 これらは、相互に排他です。 名前空間ノードの文字列値は、ゼロの長さの文字列にする事ができないので、それらの内、1つは存在しなければいけません。 構築される値についての方法は、5.7.2 単純なコンテンツを構築するで記述されます。

[ERR XTDE0905] もし、新しい名前空間ノードの文字列値が、データ タイプ xs:anyURI の語彙的なスペース内で有効でない場合には、それは、回復されない動的エラーです。 [参照:ERR XTDE0835]

[ERR XTSE0910] もし、 xsl:namespace 要素の select 属性が、要素が、1つ以上 xsl:fallback 命令を持つ際に存在する場合、 または、 もし、 select 属性が、要素がカラの内容を持つ際に存在しない場合には、それは、静的エラーです。

注記としては、名前空間ノードの位置について5.7.1 複雑なコンテンツを構築するで記述した制限は、 シーケンスコンストラクタによって返したノードシーケンスにある他のノードと関連します。

例:QName-Valued 属性を構築する

このリテラル結果要素:

<data xsi:type="xs:integer" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
	<xsl:namespace name="xs" slect="'http://www.w3.org/2001/XMLSchema'"/>
	<xsl:text>42</xsl:text>
</data>

は、要素を含む為に文書を出力する典型的な要因でしょう:

<data xsi:type="xs:integer"
		 xmlns:xs="http://www.w3.org/2001/XMLSchema"
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">42</data>

このケースでは、要素は、リテラル結果要素を利用して構築され、そして、名前空間 xmlns:xs="http://www.w3.org/2001/XMLSchema" は、 それゆえにスタイルシートにあるスコープ内名前空間の1つとしてそれを宣言する事によって単純に結果ツリーに追加される事が可能となっています。 慣習では、 xsl:namespace 命令は、xsl:element 命令を利用して構築される要素である場合に、 要素は、シチュエーションの中でおそらくもっと有益になり、 それは、スタイルシートから全てのスコープ内名前空間をコピーしません。

[ERR XTDE0920] もし、 name 属性の 有効な値が、ゼロの長さの文字列、 または、NCNameNamesのいずれでもない場合、または、 もし、それが、 xmlns である場合には、 それは、回復されない動的エラーです。

[ERR XTDE0925] もし、 xsl:namespace 命令が、名前が、 xml である名前空間を生成し、その文字列値が、 http://www.w3.org/XML/1998/namespace ではない、 または、文字列値が、 http://www.w3.org/XML/1998/namespace である名前空間ノードの名前が、 xml ではない場合には、 それは、回復されない動的エラーです。

[ERR XTDE0930] もし、 select 属性を評価する、または、ゼロの長さの文字列に含んだ xsl:namespace 命令のシーケンスコンストラクタが生じる場合には、 それは、回復されない動的エラーです。

条件が生じる場合がある他のエラーの詳細については、5.7 シーケンスコンストラクタ参照。

注釈:

それは、稀に結果ツリーにある名前空間ノードを作成する為に xsl:namespace を利用する必要があります; たいていの環境では、その要求した名前空間ノードは、名前空間を利用する要素または、属性を書いている副作用として自動的に作成されるでしょう。 要素または属性名にない、結果文書にある属性値の中に限定して利用されるというシチュエーションである事が必要とされる xsl:namespace である場合の例; 特に要求した名前空間前置詞、または、 名前空間URIが、実行時に算出され、ソース文書またはスタイルシートのいずれかの中に存在しない場合など。

結果ツリーへ名前空間ノードを追加する事は、 結果ツリーにあるいくつかの要素または、属性ノードの拡張QNameを決して変更する事はないでしょう: それは、要素または属性の名前空間URIを決して変更する事はないという事です。 それは、しかしながら、名前空間の取り決めが、実行される際に、前置詞の選択を制約する場合があります

要素と属性名における名前空間前置詞は、5.7.3 名前空間の取り決めで記述した名前空間の取り決めプロセスによって効果的に確立されます。 その取り決めプロセスは、要素が、その要素名と属性名にある利用した名前空間URIにおけるスコープ内名前空間ノードを持つ事を保証し、 シリアライザーは、シリアライズされた出力の中で利用する為の前置詞を決定する為のこれらの名前空間ノードを典型的に利用するでしょう。 その取り決めプロセスは、ツリーに既に存在するそれらを伴う矛盾する名前空間ノードを生成する事ができません。 これが意味するところは、それは、要素において利用する為に前置詞を決める事をプロセッサに利用可能とする、または、 その属性のいくつかにおいて、要素における全ての名前空間ノードが、追加されるまでプロセッサに利用可能とするという事です。

もし、名前空間前置詞が、 xsl:namespace命令を利用して固有の名前空間URIにマップされる、 または、名前空間ノードをコピーする為の xsl:copy 、または、 xsl:copy-of を利用する事によって、 これは、同じ要素上の異なる名前空間URIにおける同じ前置詞を利用する事から名前空間の取り決めプロセス(そして、ゆえにシリアライザー)を妨げます。

例:名前空間前置詞の衝突

与えられる命令は:

<xsl:element name="p:item" xmlns:p="http://www.example.com/p">
	<xsl:namespace name="p">http://www.example.com/q</xsl:namespace>
</xsl:element>

結果ツリーのシリアライゼーションを可能とするには:

<ns0:item xmlns:ns0="http://www.example.com/p" 
			xmlns:p="http://www.example.com/q"/>

プロセッサは、URI p.uri における名前空間前置詞を生み出さなければいけません; それは、異なるURIを明示的に結び付けられている前置詞なので前置詞 p を利用する事ができません。

注釈:

xsl:namespace 命令は、 形式 xmlns="" の([XML 1.1における名前空間]で許容した新しい宣言しない名前空間の形式もまた)名前空間 未宣言を生成する為に利用される事ができません。 名前空間 未宣言は、もし、 undeclare-prefixes="yes" が、 xsl:output 上に記述される場合には、親要素が、その前置詞における存在しない名前空間ノードを持つ既定名前空間前置詞と子要素において名前空間ノードを持つ場合には、いつでもシリアライザーによって自動的に生成されます。

11.8 コメントを作成する

<!-- カテゴリ: 命令 -->
<xsl:comment
  select? = expression>
  <!-- Content: sequence-constructor -->
</xsl:comment>

xsl:comment 要素は、新しいコメントノードを作成する為に評価されます。 エラーケースを除き、 xsl:comment 命令の評価した結果は、単独のノード、 新たに構築したコメントノードです。

新しいコメントノードの文字列値は、 select 属性を利用する事によって、または、 xsl:comment 要素のコンテンツを形成するシーケンスコンストラクタによって、のいずれかで定義される場合があります。 これらは、相互に排他です。 もし、 いずれも存在しない場合には、新しいコメントノードの値は、ゼロの長さの文字列になるでしょう。 構築される値についての方法は、5.7.2 単純なコンテンツを構築するで記述されます。

[ERR XTSE0940] もし、 xsl:comment 要素の select 属性が、要素がカラの内容を持つ場合を除き、存在する場合には、 それは、静的エラーです。

例:コメントノードを生成する

例えば、これは

<xsl:comment>This file is automatically generated. 
Do not edit!</xsl:comment>

コメントを作成するでしょう

<!--This file is automatically generated. 
Do not edit!-->

生成したコメントノードでは、プロセッサは、その他の - によって続けられる - のいくつかの出現の後に、または、コメントの最後にスペースを挿入しなければいけません

11.9 ノードをコピーする

11.9.1 浅いコピー

<!-- カテゴリ: 命令 -->
<xsl:copy
  copy-namespaces? = "yes" | "no"
  inherit-namespaces? = "yes" | "no"
  use-attribute-sets? = qnames
  type? = qname
  validation? = "strict" | "lax" | "preserve" | "strip">
  <!-- Content: sequence-constructor -->
</xsl:copy>

xsl:copy 命令は、文脈アイテムをコピーする方法を提供します。 もし、 文脈アイテムが、文脈ノードのコピーを構築する xsl:copy 命令を評価したノードである場合には、 xsl:copy 命令の結果は、この新たに構築したノードです。 既定では、文脈ノードの名前空間ノードは、自動的に同様にコピーされますが、属性とノードの子は、自動的にコピーされません。

文脈アイテムが、原子化された値である際には、 xsl:copy 命令は、この値を返します。 シーケンスコンストラクタが、もし存在する場合には、評価されません。

文脈アイテムが、属性ノードである際には、 テキストノード、コメントノード、処理命令ノード、または、名前空間ノード、 xsl:copy 命令は、文脈ノードのコピーである新しいノードを返します。 その新しいノードは、同じノード種別、名前、文脈ノードとしての文字列値を持つでしょう。 属性ノードのケースでは、それはまた、 is-idis-idrefs プロパティにおける同じ値を持つでしょう。 シーケンスコンストラクタが、もし存在する場合には、評価されません。

文脈アイテムが、文書ノード、または、要素ノードである際には、 xsl:copy 命令は、 同じノード種別と文脈ノードとしての名前を持つ新しいノードを返します。 その新しいノードのコンテンツは、 xsl:copy 命令に含んだシーケンスコンストラクタを評価する事によって形成されます。 このシーケンスコンストラクタを評価する事によって含んだそのシーケンスは、 (次に続く段落の中で記述したようにいくつかの属性ノード、または、名前空間ノードを先頭に追加した後) 5.7.1 複雑なコンテンツを構築するで記述したように文書、または、要素ノードのコンテンツを構築する為に利用されます。

例:同一性変換

同一性変換 は、次に続くように xsl:copy を利用する事を記述する事ができます:

<xsl:template match="@*|node()">
	<xsl:copy>
		<xsl:apply-templates select="@*|node()"/>
	</xsl:copy>
</xsl:template>

このテンプレート規則は、その属性と子にテンプレート規則を適用する事によってツリーにあるいくつかのノードをコピーする為に利用される事ができます。 それは、選択したノードを部分修正する付加的なテンプレート規則を組み合わせる事が可能で、 例えば、 もし、全てのノードが、コピーされる為にある場合には、 note 要素とそれらのコンテンツを除き、 このテンプレート規則を共に伴って同一性テンプレート規則を利用する事によって獲得する事が可能です:

<xsl:template match="note"/>

注釈:

xsl:copy 命令は、要素ノードをコピーする際にたいてい役に立ちます。 他のケースでは、 xsl:copy-of 命令が、より柔軟です、 なぜなら、それは、コピーされる為のノードまたは、値のセレクションを許容する select 属性を持っているからです。

xsl:copy 命令は、付加的にxsl:attribute-set 宣言を識別するQNameのホワイトスペース区切りリストである use-attribute-sets 属性を持ちます。 この属性は、要素ノードをコピーする際にのみ利用されます。 このリストは、属性ノードのシーケンスを生成する為に10.2 名前付き属性セットで記述したように拡張されます。 このシーケンスは、シーケンスコンストラクタを評価した結果として生成したシーケンスを先頭に追加されます。

xsl:copy 命令は、付加的な値 yes 、または、 noを伴う copy-namespaces 属性を持ちます。 既定値は、 yes です。 この属性は、要素ノードをコピーする際にのみ利用されます。 もし、値が、 yes に設定される、または、省略される場合には、ソース要素の全ての名前空間ノードは、結果要素における名前空間ノードとしてコピーされます。 これらのコピーした名前空間ノードは、シーケンスコンストラクタを評価した結果として生成したシーケンスを先頭に追加されます ( use-attribute-sets 属性を拡張する事によって生成したいくつかの属性ノードの前後に来るかどうかは、重要ではありません)。 もし、その値が、 no に設定される場合には、 名前空間ノードは、コピーされません。 しかしながら、名前空間ノードは、まだ名前空間の取り決めプロセスによって要求したものとして結果要素に追加されるでしょう: 5.7.3 名前空間の取り決め参照。

xsl:copy 命令は、値 yes 、または、 no を伴う付加的な inherit-namespaces 属性を持ちます。 既定値は、 yes です。 この属性は、要素ノードをコピーする際にのみ利用されます。 もし、値が、 yes に設定される、または、省略される場合には、新たに構築した要素において生成した名前空間ノード (これらが、ソースノードのそれらからコピーされたか、または、名前空間の取り決めの結果として生成したかどうか)は、 5.7.1 複雑なコンテンツを構築するで記述したように新たに構築した要素の子と子孫にコピーされます。 もし、その値が、 no に設定される場合には、 名前空間ノードは、子に自動的にはコピーされません。 これは、 最終結果ツリーが、シリアライズされる際に子要素上に現れる( xmlns="" のような、または、XML名前空間1.1のケースでは、 xmlns:p="" のような)名前空間未宣言に生じる場合があります。

[ERR XTTE0950] もし、 copy-namespaces 属性が、値 no を持ち、暗黙に、または、明示的に、 validation 属性が、値 preserve を持つ場合には、 namespace-sensitive コンテンツを持つノードをコピーする為の xsl:copy、または、 xsl:copy-of 命令を利用する事は、 タイプエラーです。 もし、( validation="preserve" を伴う)これらの命令のいずれかが、親要素もコピーされる場合を除き、 namespace-sensitive コンテンツを持っている属性をコピーする為に利用される場合もまたタイプエラーです。 もし、その区分した値が、タイプ xs:QName 、または、 xs:NOTATION のアイテムを含む、または、タイプが、そこから 派生する場合には、ノードは、 namespace-sensitive コンテンツを持ちます。 これがエラーになる理由は、コンテンツの妥当性が、保存されている名前空間文脈に依存する為です。

注釈:

属性ノードが、コピーされる際には、 xsl:copy を伴う、または、 xsl:copy-of を伴うかどうか、プロセッサは、いくつかの結び付けた名前空間情報を自動的にコピーしません。 属性名それ自身の中で利用した名前空間は、 属性が、結果ツリーにある要素に追加される際には、 名前空間の取り決めプロセス (参照先: 5.7.3 名前空間の取り決め)の効力によって宣言されるでしょうが、しかし、 もし、名前空間前置詞が、属性のコンテンツの中で利用される場合(例えば、もし、属性の値が、XPath式である場合)には、 ふさわしい名前空間ノードが、結果ツリーに追加される事を保証する事は、スタイルシート作者の責任です。 これは、 xsl:copy を利用して名前空間ノードをコピーする事によって、または、 xsl:namespace を利用してそれらを生成する事によって達成される事が可能です。

付加的な属性 typevalidation は、スキーマにあるタイプ定義、要素宣言、または、属性宣言に対して要素、属性、または、文書ノードのコンテンツを有効にする為に、 またこのような新しい要素、属性、属性ノードのコピーが搬送されるであろうタイプ注釈を決める為に xsl:copy 命令上で利用される場合があります。 これらの属性は、要素、属性、文書ノードではないアイテムをコピーする際に無視されます。 コピーされているノードは、要素、または、文書ノード、これらの属性もまた、先祖としてコピーした要素、または、文書ノードを持ついくつかの要素と属性によって搬送されたタイプ注釈に作用します。 これらの2つの属性は、双方共にオプションであり、もし、一方が記述される場合には、他は、省略されなければいけません。 許容したこれらの属性の値とそれらのセマンティクスは、19.2 妥当性で記述されます。

注釈:

結果ツリーにあるノードの最終タイプ注釈もまた、 ノードの先祖を作成する為に利用した命令の typevalidation 属性に依存します。

コピーされるノードの基準URIは、要素ノードが、 xml:base 属性を持っているケースを除き、 新しいノードの基準URIというケースにおいては、 xml:base 属性の値として取得され、もし、 xsl:copy 命令 の基準URIに対して関連する場合には解決されます。 もし、コピーしたノードが、新しい要素、または、文書ノードを子として次に結びつけられる場合には、 xml:base 属性を利用する事が優先される場合を除き、ノードの最終コピーは、親要素からのその基準URIを継承します。

xml:id 属性が、 xsl:copy、または、 xsl:copy-of 命令のいずれかを利用してコピーされる際には、 ( normalize-spaceFO 関数を効果的に適用する)属性値標準化を委ねられるかどうかは、 implementation-definedです。

注釈:

たいていのケースでは、値は、ソースツリー上で属性値標準化を既にゆだねられているでしょうが、しかし、 もし、この処理が、ソースツリー上で実行されていない場合には、それは、結果ツリー上で実行される為にそれにおいてはエラーではありません。

11.9.2 深いコピー

<!-- カテゴリ: 命令 -->
<xsl:copy-of
  select = expression
  copy-namespaces? = "yes" | "no"
  type? = qname
  validation? = "strict" | "lax" | "preserve" | "strip" />

xsl:copy-of 命令は、子と属性、再帰的なオリジナルノードの(既定も含む)名前空間全てのコピーを含んでいる新しいノードそれぞれを伴うノードと原子化された値、または、ノードまたは、原子化された値のシーケンスのコピーを構築する為に利用される事が可能です。 命令を評価した結果は、 提供したシーケンスとまだ残っているその命令を伴う、1対1で一致するアイテムのシーケンスです。

要求した select 属性は、値がノードと原子化された値のいくつかのシーケンスになる場合があるを含みます。 このシーケンスにあるアイテムは、次に続くように処理されます:

  • もし、そのアイテムが、要素ノードである場合には、新しい要素が、結果シーケンスの為に構築され、追加されます。 新しい要素は、オリジナルとして同じ拡張QNameを持ち、 更に、それは、属性ノードの深いコピーと要素ノードの子を持つでしょう。

    新しい要素はまた、それらが、 copy-namespaces="no" を記述する事によって実行される場合を除き、オリジナル要素ノードからコピーした名前空間を持つでしょう。 もし、この属性が、省略される場合、または、値 yes を取得する場合には、オリジナル要素の全ての名前空間ノードは、新しい要素にコピーされます。 もし、値 no を取得する場合には、名前空間ノードのないものがコピーされます:しかしながら、名前空間ノードは、まだ、 名前空間の取り決めプロセスによって要求したものとして結果ツリーの中で作成されるでしょう: 5.7.3 名前空間の取り決め参照。 この属性は、この命令によって全ての要素( select によって直接選択した両方の要素とselect 式によって選択したノードの子孫である要素)がコピーされる作用を持ちます。

    その新しい要素は、オリジナル要素として is-idis-idrefsnilled プロパティ(nil:「無」「零点」「プログラム言語Lispの空リストや偽を表す記号」)の同じ値を持つでしょう。

  • もし、そのアイテムが、文書ノードにある場合には、その命令は、結果シーケンスに新しい文書ノードを追加します; この文書ノードの子は、オリジナル文書ノードの子として(ノード種別それ自身における規則と一致するコピーしたそれぞれを)1対1でコピーするでしょう。

  • もし、そのアイテムが属性、または、名前空間ノード、または、テキストノード、コメント、または、処理命令である場合には、 同じ規則が、 xsl:copy を伴うものとして適用します(参照:11.9.1 浅いコピー)。

  • もし、そのアイテムが原子化された値である場合には、値は、 xsl:sequence を伴うものとして結果シーケンスに追加されます。

付加的な属性 typevalidation は、スキーマにあるタイプ定義、要素宣言、または、属性宣言に対して要素、属性、または、文書ノードのコンテンツを有効にする為に、更には、このように要素、または、属性ノードの新しいコピーが搬送されるであろうタイプ注釈を決める為に xsl:copy-of 命令上で利用される場合があり、 これらの属性は、 select 属性にある式によって選択された要素、属性、文書ノードごとに個々に適用されます。 これらの属性は、要素、属性、または、文書ノードではないアイテムをコピーする際には、無視されます。

記述した typevalidation は、 select 式によって実際に選択したノードのコピーとして生成した要素、属性、文書ノードにのみ直接適用し、 それらは、先祖として選択したノードを持つので暗黙のうちにコピーされるノードには適用されません。 しかしながら、これらの属性は、妥当性検証プロセスの結論としてこのような暗黙のうちにコピーしたノードによって搬送したタイプ注釈に間接的に作用します。

これら2つの属性は、共にオプションであり、もし、一方が記述される場合には、他は、省略されなければいけません。 許容したこれらの属性の値とそれらのセマンティクスは、19.2 妥当性の中で記述されます。

namespace-sensitive 要素、または、 validation="preserve" を利用する属性をコピーする際に、エラーが、出現する場合があります。 [参照:ERR XTTE0950]

ノードの基準URIは、 xml:base 属性の値として取得される新しいノードの基準URIであるケースを除き、 xml:base 属性を持っている要素ノードのケースでは、 xsl:copy-of 命令の基準URIに対して関連する場合には、解決され、コピーされます。 もし、そのコピーしたノードが、新しい要素、または、文書ノードに子としてすぐ次に結び付けられる場合には、 xml:base 属性を利用する事が優先される場合を除き、ノードの最終コピーは、その親ノードからその基準URIを継承します。

11.10 シーケンスを構築する

<!-- カテゴリ: 命令 -->
<xsl:sequence
  select = expression>
  <!-- Content: xsl:fallback* -->
</xsl:sequence>
xsl:sequence 命令は、ノードと微少の値、ノードまたは微少の値のシーケンスを構築する為にシーケンスコンストラクタを利用される中で利用される場合があります。 このシーケンスは、命令の結果として返されます。 他の命令の多くはこれと異なり、xsl:sequenceは、新しいノードを構築するのではなく、存在しているノードに含まれているシーケンスを返す事ができます。 xsl:sequenceが、シーケンスに微少の値を追加する事を利用した際のその効果は、 xsl:copy-of 命令ととてもよく似ています。

結果シーケンスを含むアイテムは、 select 属性を利用して選択されます。

いくつかの xsl:fallback を含んだ命令は、XSLT 2.0プロセッサによって無視されますが、前方互換性モードで動作しているXSLT 1.0プロセッサの為に代替システムのふるまいを定義する為に利用できます。

例:整数のシーケンス構築

例えば、次に続くコードは、:

<xsl:variable name="values" as="xs:integer*">
		<xsl:sequence select="(1,2,3,4)"/>
		<xsl:sequence select="(8,9,10)"/>
</xsl:variable>
<xsl:value-of select="sum($values)"/>

37という出力を創出します。

 

例:シーケンスを構築する為のxsl:for-each利用

次に続くコードは、選択した要素における(私たちが、xs:decimalとして区分されると仮定する) @price 属性の値、または、存在しない @price 属性を持つそれらの要素における算出した価格を含んでいるシーケンスを構築します。それは、その時、平均価格を返します。

<xsl:variable name="prices" as="xs:decimal*">
	<xsl:for-each select="//product">
		<xsl:choose>
			<xsl:when test="@price">
	<xsl:sequence select="@price"/>
			</xsl:when>
			<xsl:otherwise>
	<xsl:sequence select="@cost * 1.5"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:for-each>
</xsl:variable>
<xsl:value-of select="avg($prices)"/>

注記としては、存在する @price 属性は、 xsl:copy-of または、 xsl:value-of を利用する $prices シーケンスに追加されているものと等価です。 しかしながら、 xsl:copy-of は、 xsl:value-of が、それがその時 xs:decimal に変換されるように持つ新しいテキストノードを創出する間、このシチュエーションでは必要とされない属性ノードのコピーを創出します。 存在している属性ノードを原子化し、結果シーケンスに原子化された値 xs:decimal を追加するこのケースにおいて xsl:sequence を利用する事は、 直接同じ結果を取得するより多い方法です(直接同じ結果を取得する場合に、よく用いられる方法です)。

この例は、XPathレベルで解決される選択を可能としています:

<xsl:value-of select="avg(//product/(+@price、 @cost*1.5)[1])"/>

(外見上、冗長な + 演算子は、属性値を原子化する為にそこにあります: / 演算子の右手側にある式は、ノードと原子化された値の混合を返さなければいけません。)

12. 連番・番号付け / Numbering >>


ホーム前へ次へ