>サイトトップへ >このカテゴリの一覧へ

X 4169

:2007

(1)

目  次

ページ

序文

1

0

  適用範囲

1

1

  導入

1

2

  スタイルシート構造

3

2.1

  XSLT 名前空間

3

2.2

  スタイルシート要素

3

2.3

  スタイルシートとしてのリテラル結果要素

5

2.4

  修飾された名前

6

2.5

  前方互換処理

7

2.6

  スタイルシートの結合

8

2.7

  スタイルシートの埋込み

10

3

  データモデル

11

3.1

  ルートの子

11

3.2

  基底 URI

11

3.3

  解析対象外実体

12

3.4

  空白の削除

12

4

  式

13

5

  テンプレート規則

13

5.1

  処理モデル

13

5.2

  パターン

14

5.3

  テンプレート規則の定義方法

16

5.4

  テンプレート規則の適用

16

5.5

  テンプレート規則の競合解決

18

5.6

  テンプレート規則の上書き

19

5.7

  モード

20

5.8

  組込みテンプレート規則

20

6

  名前付きテンプレート

20

7

  結果木の生成

21

7.1

  要素及び属性の生成

21

7.2

  テキストの生成

26

7.3

  処理命令の生成

27

7.4

  コメントの生成

28

7.5

  コピー

28

7.6

  生成テキストの計算

29

7.7

  番号付け

31


X 4169

:2007  目次

(2)

ページ

8

  繰返し

36

9

  条件付き処理

37

9.1

  xsl:if による条件付き処理

37

9.2

  xsl:choose による条件付き処理

38

10

  ソート

39

11

  変数及びパラメタ

41

11.1

  結果木素片

41

11.2

  変数値及びパラメタ値

42

11.3

  xsl:copy-of による変数値及びパラメタ値の使用

43

11.4

  最上位の変数及びパラメタ

43

11.5

  テンプレート内の変数及びパラメタ

43

11.6

  テンプレートへのパラメタの引渡し

44

12

  追加関数

45

12.1

  複数のソース文書

45

12.2

  キー

46

12.3

  数字のフォーマット化

49

12.4

  他の追加関数

51

13

  メッセージ

52

14

  拡張

53

14.1

  拡張要素

53

14.2

  拡張関数

53

15

  フォールバック

54

16

  出力

55

16.1

  XML 出力メソッド

56

16.2

  HTML 出力メソッド

58

16.3

  テキスト出力メソッド

60

16.4

  出力エスケープの無効化

60

17

  適合性

61

18

  この規格における記法

61

附属書 A(規定)文献

63

附属書 B(規定)要素構文のまとめ

65

附属書 C(参考)XSLT スタイルシートの DTD 素片

71

附属書 D(参考)例

80

附属書 E(参考)貢献者

89

附属書 F(参考)W3C 勧告案からの変更点

90

附属書 G(参考)XSLT の将来版検討における機能

91


X 4169

:2007

(3)

まえがき

この規格は,工業標準化法第 12 条第 1 項の規定に基づき,財団法人日本規格協会(JSA)から,工業標準

原案を具して日本工業規格を制定すべきとの申出があり,日本工業標準調査会の審議を経て,経済産業大

臣が制定した日本工業規格である。

この規格は,著作権法で保護対象となっている著作物である。

この規格の一部が,特許権,出願公開後の特許出願,実用新案権又は出願公開後の実用新案登録出願に

抵触する可能性があることに注意を喚起する。経済産業大臣及び日本工業標準調査会は,このような特許

権,出願公開後の特許出願,実用新案権又は出願公開後の実用新案登録出願に係る確認について,責任は

もたない。

原勧告の標題及びまえがきの翻訳

XSL

変換(XSLT1.0

W3C

勧告 1999 年 11 月 16 

この版の掲載場所

http://www.w3.org/TR/1999/REC-xslt-19991116

(XML 又は HTML で入手可能。

最新版の掲載場所

http://www.w3.org/TR/xslt

以前の版の掲載場所

http://www.w3.org/TR/1999/PR-xslt-19991008

http://www.w3.org/1999/08/WD-xslt-19990813

http://www.w3.org/1999/07/WD-xslt-19990709

http://www.w3.org/TR/1999/WD-xslt-19990421

http://www.w3.org/TR/1998/WD-xsl-19981216

http://www.w3.org/TR/1998/WD-xsl-19980818

編者

James Clark <jjc@jclark.com>

著作権  © 1999 W3C

®

(MIT,INRIA,慶應義塾)が,すべての権利を保有する。免責,商標,文書の使

用及びソフトウエアの使用許諾に関する W3C の規則を適用する。

要約

この勧告は,

XML

文書を他の XML 文書に変換するための言語である XSLT の構文及び意味を定義する。

XSLT

は,XML 用のスタイルシート言語 XSL の一部分として使用するために設計されている。XSLT に

加えて,XSL は,フォーマット付け指定のための XML 語い(彙)を含む。XSL は,フォーマット付け語


X 4169

:2007  目次

(4)

い(彙)を使用する別の XML 文書に文書を変換する方法を記述するために XSLT を使用することによっ

て,XML 文書のスタイルを指定する。

XSLT

は,XSL とは独立に使用する設計もなされている。しかし,XSLT は,完全に一般の目的で XML

変換を行う言語として意図されたものではなく,その設計の主目的は,XSLT を XSL の一部分として使用

する場合に必要となる変換にある。

この文書の状態

この文書は,W3C の勧告である。この勧告は,W3C 会員企業及び関連する団体によって閲読されてお

り,技術統括責任者によって W3C 勧告として承認されている。これは安定した文書であり,参考資料と

して用いてよく,他の文書から引用規定として引用してもよい。W3C はこの勧告を制定することによって,

この規定への注目を喚起し,広い普及を促進するという役割を果たす。この結果,Web の機能及び相互運

用性が高まる。

この勧告についての正誤表は,http://www.w3.org/1999/11/REC-xslt-19991116-errata から入手できる。

この勧告についてのコメントは,xsl-editors@w3.org  に報告されたい。コメントの一覧が,入手できる。

この勧告の英語版だけを規定としての版とする。しかし,翻訳については,

http://www.w3.org/Style/XSL/translations.html

を参照されたい。

現在の W3C 勧告及び他の技術文書の一覧は,http://www.w3.org/TR で見ることができる。

この勧告は,W3C のスタイル作業の一部として作成された。


日本工業規格

JIS

 X

4169

:2007

XSL

変換(XSLT)1.0

XSL Transformations (XSLT) Version 1.0

序文

この規格は,1999 年 11 月に World Wide Web Consortium (W3C)から公表された XSL Transformations

(XSLT) Version 1.0

勧告を翻訳し,その後に発行された正誤表を取り込んで,技術的内容を変更することな

く作成した日本工業規格である。

なお,この規格で点線の下線を施してある箇所は,原勧告に編集上の変更をしている事項又は原勧告に

ない参考である。

0

適用範囲

この規格は,

XML

文書を他の XML 文書に変換するための言語である XSLT の構文及び意味を定義する。

XSLT

は,XML 用のスタイルシート言語 XSL の一部分として使用するために設計されている。XSLT に

加えて,XSL は,フォーマット付け指定のための XML 語い(彙)を含む。XSL は,フォーマット付け語

い(彙)を使用する別の XML 文書に文書を変換する方法を記述するために XSLT を使用することによっ

て,XML 文書のスタイルを指定する。

XSLT

は,XSL とは独立に使用する設計もなされている。しかし,XSLT は,完全に一般の目的で XML

変換を行う言語として意図されたものではなく,その設計の主目的は,XSLT を XSL の一部分として使用

する場合に必要となる変換にある。

1

導入

この規格は,XSLT 言語の構文及び意味を定義する。XSLT 言語を用いた変換は,XML 勧告の名前空間

(JIS X 4158)

に適合する整形式の XML (JIS X 4159)文書として表される。その文書は,XSLT が定義する要

素も XSLT が定義しない要素も含んでよい。XSLT 定義の要素は,固有の XML 名前空間に属することによ

って識別され(2.1 参照)

,この規格では,これを XSLT 名前空間と呼ぶ。したがって,この規格は,XSLT

名前空間の構文及び意味を定義する。

XSLT

で表される変換は,ソース木を結果木に変換するための規則を記述する。パターンをテンプレー

トに関連付けることによって,変換がなされる。パターンは,ソース木の要素とマッチされる。テンプレ

ートはインスタンス化されて,結果木の部分を生成する。結果木は,ソース木から分離している。結果木

の構造は,ソース木の構造とは全く異なり得る。結果木を構築するときには,ソース木からの要素をフィ

ルタリングしたり,再順序化したりでき,任意の構造を追加することもできる。

XSLT

で表される変換をスタイルシートと呼ぶ。これは,XSLT を XSL フォーマット付け語い(彙)に

変換するときに,その変換がスタイルシートとして機能することによる。

この規格は,XSLT スタイルシートが XML 文書にどのように関連付けられるかは指定しない。XSL プ


2

X 4169

:2007

ロセサが[XML  スタイルシート]で記述される機構を利用可能にすることを推奨する。この機構又はそ

の他の機構が複数の XSLT スタイルシートのシーケンスを提供し,一つの XML 文書に同時に適用される

場合,その効果は,そのシーケンスの各メンバを順にインポートする単一のスタイルシートを適用する場

合と同じであることが望ましい(2.6.2 参照)

注記  原勧告では,外部文書への参照は,[XML スタイルシート]などといった記述から参照箇所に

リンクされている。ただし,この規格では参照箇所へのリンクは記載しない。代わりに,この

記法によって,

附属書 の対応する項目を参照する。

スタイルシートは,テンプレート規則の集合を含む。テンプレート規則は,次の二つの部分から成る。

一つはソース木のノードとマッチされるパターンであり,もう一つはインスタンス化できて,結果木の部

分を形成するテンプレートである。これによって,一つのスタイルシートを類似のソース木構造をもつ文

書の広いクラスに適用可能にする。

テンプレートは,特定のソース要素に関してインスタンス化され,結果木の部分を生成する。テンプレ

ートは,リテラル結果要素の構造を指定する要素を含むことができる。テンプレートは,結果木素片を生

成するための命令である,XSLT 名前空間からの要素も含むことができる。テンプレートがインスタンス

化されると,各命令が実行され,それが生成する結果木素片によって置換される。命令は子孫ソース要素

を選択し,処理することができる。子孫要素の処理は,適用可能なテンプレート規則を見つけて,そのテ

ンプレートをインスタンス化することによって結果木素片を生成する。要素は,命令の実行によって選択

されたときにだけ処理されることに注意する。結果木は,ルートに関するテンプレート規則を見つけて,

そのテンプレートをインスタンス化することによって作成される。

適用可能なテンプレート規則を見つける処理において,複数のテンプレート規則が,与えられた要素に

マッチするパターンをもっていてもよい。しかし,一つだけのテンプレート規則が適用される。適用する

テンプレート規則を決定する方法は,5.5 に示す。

テンプレートは一つだけでかなりの能力をもつ。それは,任意の複雑さをもつ構造を生成でき,ソース

木の任意の位置から文字列の値を引き出すことができ,ソース木における要素の出現に応じて繰り返され

る構造を生成できる。結果木の構造がソース木の構造とは独立である単純な変換については,スタイルシ

ートは,単一のテンプレートだけから構成されることも可能であり,それは,完全な結果木のためのテン

プレートとして機能する。データを表現する XML 文書の変換は,この種のものであることが多い(D.2

参照)

。XSLT は,これらのスタイルシートに対し単純化した構文を適用することを可能にする(2.3 参照)

テンプレートは,インスタンス化されると,常に現ノード及び現ノードリストに関してインスタンス化

される。現ノードは,常に現ノードリストのメンバである。XSLT の多くの操作は,現ノードに対応する。

わずかな命令だけが,現ノードリスト又は現ノードを変更する(箇条 及び箇条 参照)

。これらの命令の

一つをインスタンス化する間に,現ノードリストはノードの新リストに変わり,この新リストの各メンバ

が順に現ノードになる。命令のインスタンス化の完了後は,現ノード及び現ノードリストは,命令がイン

スタンス化される前の状態に戻る。

XSLT

は,XPath (JIS X 4160)で定義された式言語を利用して,処理,条件付き処理及びテキスト生成の

ための要素の選択を行う。

XSLT

は,その言語を拡張するために二つの“フック”を提供する。つまり,テンプレートで使用する

命令要素の集合を拡張するためのフック,及び XPath の式で使用する関数の集合を拡張するためのフック

を提供する。これらのフックは,どちらも XML 名前空間に基づく。XSLT のこの版は,フックを実装する

機構を定義していない(箇条 14 参照)


3

X 4169

:2007

注記 XSL 作業グループは,この規定の今後の版又は別の規定で,この機構を定義する予定である。

XSLT

で定義した要素の構文を記述するために用いる要素構文の記法の概要を,箇条 18 に示す。

XSLT

スタイルシートには,MIME メディア型 text/xml 及び application/xml[RFC2376]を使用することが

望ましい。メディア型は,特に XSLT スタイルシートに関して登録することができる。登録すれば,その

メディア型を用いてよい。

2

スタイルシート構造

2.1

XSLT

名前空間

XSLT

名前空間には,http://www.w3.org/1999/XSL/Transform という URI がある。

注記 URI の中の 1999 は,W3C が URI を割り当てた年を示し,使用する XSLT の版を示してはいな

い。使用する XSLT の版は,属性によって指定する(2.2 及び 2.3 参照)

XSLT

プロセサは,この名前空間由来の要素及び属性を認識するために,XML 名前空間の機構(JIS X 

4158)

を使用しなければならない。XSLT 名前空間由来の要素は,ソース文書の中ではなく,スタイルシー

トの中だけで認識される。XSLT で定義される要素の完全リストは,

附属書 に規定されている。ベンダ

は,要素又は属性を追加して XSLT 名前空間を拡張してはならない。そうではなくて,どんな拡張も,別

の名前空間の中になければならない。追加の命令要素に使用されるどの名前空間も,14.1 の中で指定され

る拡張要素の機構によって識別されなければならない。

この規格は,XSLT 名前空間の要素を参照するために,接頭辞 xsl:を使用する。しかし,XSLT スタイル

シートは,接頭辞を XSLT 名前空間の URI に結合する名前空間宣言があれば,どんな接頭辞も自由に使え

る。

XSLT

名前空間の要素は,属性の展開名(JIS X 4160 の箇条 参照)が null でない名前空間 URI をもっ

ていれば,XSLT 名前空間由来でないどんな属性をもってもよい。これらの属性の存在は,この規格の中

で定義する XSLT の要素及び関数の振る舞いを変更してはならない。したがって,XSLT プロセサは,こ

れらの属性をいつでも自由に無視でき,それが名前空間 URI を認識しなければ,誤りを与えることなく,

それらの属性を無視しなければならない。それらの属性は,例えば,一意の識別子,最適化ヒント又は文

書情報を提供できる。

XSLT

名前空間由来の要素が,この規格の中で要素に関して定義される属性以外の,null 名前空間 URI

をもつ展開名のついた属性(つまり,接頭辞なしの名前をもつ属性)をもつことは,誤りとする。

注記 XSLT の要素,属性及び関数の名前に使用する規約は,次のとおりとする。つまり,名前は,

すべて小文字であり,ハイフンを用いて語を分離し,XML 又は HTML などの関連する言語の

構文の中に既に現れている場合だけ,短縮形を使用する。

2.2

スタイルシート要素

<xsl:stylesheet

    id = id

  extension-element-prefixes = tokens

  exclude-result-prefixes = tokens

    version = number>

  <!-- Content: (xsl:import*, top-level-elements) -->

</xsl:stylesheet>


4

X 4169

:2007

<xsl:transform

    id = id

  extension-element-prefixes = tokens

  exclude-result-prefixes = tokens

    version = number>

  <!-- Content: (xsl:import*, top-level-elements) -->

</xsl:transform>

注記  これらの記法については,箇条 18 に示す。

スタイルシートは,XML 文書における xsl:stylesheet 要素によって表現される。xsl:transform は,

xsl:stylesheet

の同義語として使用できる。

xsl:stylesheet

要素は,スタイルシートが要求する XSLT の版を示すために,version 属性をもたなければ

ならない。XSLT のこの版に関しては,その値は,1.0 とする。値が 1.0 に等しくないときは,前方互換処

理モードが可能になる(2.5 参照)

xsl:stylesheet

要素は,次の型の要素を含んでよい。

a) xsl:import

b) xsl:include

c) xsl:strip-space

d) xsl:preserve-space

e) xsl:output

f) xsl:key

g) xsl:decimal-format

h) xsl:namespace-alias

i) xsl:attribute-set

j) xsl:variable

k) xsl:param

l) xsl:template

xsl:stylesheet

要素の子として出現する要素を,最上位要素と呼ぶ。

この例は,スタイルシートの構造を示す。省略記号(...)は,属性値又は内容が省略されている箇所を

示す。この例は,使用できる要素の各型の一つを示すが,スタイルシートは,これらの要素のそれぞれを

全く含まなくてもよく,幾つ含んでいてもよい。

<xsl:stylesheet version="1.0"

                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:import href="..."/>

  <xsl:include href="..."/>

  <xsl:strip-space elements="..."/>

  <xsl:preserve-space elements="..."/>

  <xsl:output method="..."/>

    <xsl:key name="..." match="..." use="..."/>

  <xsl:decimal-format name="..."/>


5

X 4169

:2007

  <xsl:namespace-alias stylesheet-prefix="..." result-prefix="..."/>

  <xsl:attribute-set name="...">

    ...

  </xsl:attribute-set>

  <xsl:variable name="...">...</xsl:variable>

  <xsl:param name="...">...</xsl:param>

  <xsl:template match="...">

    ...

  </xsl:template>

  <xsl:template name="...">

    ...

  </xsl:template>

</xsl:stylesheet>

xsl:stylesheet

要素の子が出現する順序は,xsl:import 要素及び誤り回復を除き,重要でない。利用者は,

思いどおりに要素を順序付けることができ,スタイルシート生成ツールは,要素が出現する順序を制御す

る必要はない。

さらに,要素の展開名が,null でない名前空間 URI をもつ場合,xsl:stylesheet 要素は,XSLT 名前空間由

来ではないどんな要素を含んでもよい。これらの最上位要素の存在は,この規格で定義する XSLT の要素

及び関数の振る舞いを変更してはならない。例えば,これらの最上位要素が,xsl:apply-templates が競合を

解決するために異なる規則を使用することを指定することは許可されない。したがって,XSLT プロセサ

は,常にこれらの最上位要素を自由に無視でき,名前空間 URI を認識しない場合には,誤りを通知するこ

となしに最上位要素を無視しなければならない。これらの要素は,次に例示する情報を与えることができ

る。

a)

拡張要素又は拡張関数が使用する情報(箇条 14 参照)

b)

結果木の処理に関する情報,

c)

ソース木の獲得方法に関する情報,

d)

スタイルシートに関するメタデータ,

e)

スタイルシートのための構造化ドキュメンテーション

2.3

スタイルシートとしてのリテラル結果要素

ルートに関して単一のテンプレートだけで構成されるスタイルシートには,簡素化した構文を使用でき

る。そのスタイルシートは,リテラル結果要素だけで構成してもよい(7.1.1 参照)

。このスタイルシート

は,リテラル結果要素を含むテンプレート規則を含む xsl:stylesheet 要素をもつスタイルシートに等価にな

る。そのテンプレート規則は,/のマッチパターンをもつ。次にそれを例示する。

<html xsl:version="1.0"

      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

      xmlns="http://www.w3.org/TR/xhtml1/strict">

  <head>

    <title>Expense Report Summary</title>

  </head>

  <body>


6

X 4169

:2007

    <p>Total Amount: <xsl:value-of select="expense-report/total"/></p>

  </body>

</html>

これは,次の記述と同じ意味をもつ。

<xsl:stylesheet version="1.0"

                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

                                xmlns="http://www.w3.org/TR/xhtml1/strict">

<xsl:template match="/">

<html>

  <head>

    <title>Expense Report Summary</title>

  </head>

  <body>

    <p>Total Amount: <xsl:value-of select="expense-report/total"/></p>

  </body>

</html>

</xsl:template>

</xsl:stylesheet>

スタイルシートの文書要素であるリテラル結果要素は,xsl:version 属性をもたなければならない。この

属性は,スタイルシートが要求する XSLT の版を示す。 XSLT のこの版については,その値は 1.0 とする。

値は,数値でなければならない。他のリテラル結果要素も,xsl:version 属性をもってよい。xsl:version 属性

が 1.0 に等しくないとき,前方互換処理モードが可能になる(2.5 参照)

スタイルシートとして使用されるときに可能なリテラル結果要素の内容は,スタイルシートの中でそれ

が現れるときからの違いはない。したがって,スタイルシートとして使用されるリテラル結果要素は,最

上位要素を含むことができない。

XML

文書が XSLT スタイルシートとして XSLT プロセサによって処理されなければならないということ

を,

システムが認識できるただ一つの方法は,状況によっては,XML 文書そのものを検査することになる。

簡素化した構文を使用することは,この処理をもっと困難にする。

注記  例えば,別の XML 言語(AXL)は,XML 文書が AXL プロセサによって処理されなければならな

い AXL 文書であったことを示すために,文書要素に axl:version をも用いるかもしれない。文書

が axl:version 属性及び xsl:version 属性の両方をもてば,文書を XSLT プロセサによって処理す

るのがよいか,AXL プロセサによって処理するのがよいかは明確でない。

そのため,この状況で使用できる XSLT スタイルシートには,簡素化した構文を使用することは望まし

くない。例えば,MIME メディア型を用いてメッセージの処理方法を決定する受信者に,text/xml 又は

application/xml

の MIME メディア型をもつメッセージとして XSLT スタイルシートを送るとき,この状況

が生じ得る。

2.4

修飾された名前

内部 XSLT オブジェクトの名前,特に名前付きテンプレート(箇条 参照)

,モード  (5.7 参照)

,属性

集合(7.1.4 参照)

,キー(12.2 参照)

,10 進フォーマット(12.3 参照)

,変数又はパラメタ(箇条 11 参照)

は,QName として指定される。接頭辞があると,名前が現れる属性に実際に名前空間宣言を用いて,接頭


7

X 4169

:2007

辞が URI 参照に展開される。展開名(JIS X 4160 の箇条 参照)は,名前の局所部分,及び null かもしれ

ない URI 参照から構成され,オブジェクトの名前として使用される。デフォルト名前空間は,接頭辞なし

の名前には使用されない。

2.5

前方互換処理

要素が,version 属性が 1.0 に等しくない xsl:stylesheet 要素であるか,値が 1.0 に等しくない xsl:version

属性をもつリテラル結果要素であるかのいずれかである場合,要素は,要素自体,要素の属性,要素の子

孫及びそれらの属性に関して前方互換モードを有効にする。値が 1.0 に等しい xsl:version 属性をもつリテ

ラル結果要素は,それ自体,その属性,その子孫及びそれらの属性に関して前方互換モードを無効にする。

要素が前方互換モードで処理される場合,次に示すとおりとする。

a)

要素が最上位要素であって,XSLT 1.0 がその要素を最上位要素として許容できないとき,その要素は

その内容とともに無視されなければならない。

b)

要素がテンプレートの中の要素であって,XSLT 1.0 がその要素をテンプレートの中に現れることを許

容しないとき,要素がインスタンス化されなければ,誤りを通知してはならない。要素がインスタン

ス化されれば,XSLT は箇条 15 に指定されるとおりに,その要素についてフォールバックを実行しな

ければならない。

c)

要素が,XSLT 1.0 が要素にもつことを許容しない属性をもつとき,又は XSLT 1.0 が属性にもつこと

を許容しない値をもつ任意選択の属性をもつとき,その属性を無視しなければならない。

したがって,この規格で定義されない XSLT 名前空間由来の要素をスタイルシートが含んでいても,す

べての XSLT 1.0 プロセサは,次のスタイルシートを誤りなしに処理できなければならない。

<xsl:stylesheet version="1.1"

                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">

        <xsl:choose>

      <xsl:when test="system-property('xsl:version') >= 1.1">

                <xsl:exciting-new-1.1-feature/>

            </xsl:when>

            <xsl:otherwise>

                <html>

                <head>

          <title>XSLT 1.1 required</title>

                </head>

                <body>

                    <p>Sorry

,  this stylesheet requires XSLT 1.1.</p>

                </body>

                </html>

            </xsl:otherwise>

        </xsl:choose>

  </xsl:template>

</xsl:stylesheet>

注記  スタイルシートが,1.0 版の後の XSLT が導入する最上位要素に強く依存する場合,そのスタイ


8

X 4169

:2007

ルシートは,それより前の版の XSLT を実装している XSLT プロセサが黙って最上位要素を無

視しないことを確実にするために,terminate="yes"をもつ xsl:message 要素(箇条 13 参照)を用

いることができる。次に,それを例示する。

<xsl:stylesheet version="1.5"

                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:important-new-1.1-declaration/>

  <xsl:template match="/">

        <xsl:choose>

      <xsl:when test="system-property('xsl:version') &lt; 1.1">

                <xsl:message terminate="yes">

          <xsl:text>Sorry

,  this stylesheet requires XSLT 1.1.</xsl:text>

                </xsl:message>

            </xsl:when>

            <xsl:otherwise>

                ...

            </xsl:otherwise>

        </xsl:choose>

  </xsl:template>

  ...

</xsl:stylesheet>

前方互換モードで処理される属性に式(箇条 参照)が現れる場合,XSLT プロセサは,式での誤りか

ら次のとおり回復しなければならない。

a)

式が,XPath 文法が許容する構文にマッチしないとき,式が実際に評価されない限り,誤りを通知し

てはならない。

b)

式が,XSLT ライブラリの一部ではない接頭辞なしの名前をもつ関数を呼び出すとき,関数が実際に

呼び出されない限り,誤りを通知してはならない。

c) XSLT

が許容しない数の引数をもつか,XSLT が許容しない型の引数をもつ関数を式が呼び出すとき,

関数が実際に呼び出されない限り,誤りを通知してはならない。

2.6

スタイルシートの結合

XSLT

には,スタイルシートを結合する機構が二つ存在する。

a)

結合するスタイルシートの意味を変更せずに,スタイルシートの結合が可能な取込み機構。

b)

スタイルシートを互いに上書き可能にするインポート機構。

2.6.1

  スタイルシートの取込み

<!-- Category: top-level-element -->

<xsl:include

    href = uri-reference />

XSLT

スタイルシートは,xsl:include 要素を用いて,他の XSLT スタイルシートを取り込んでもよい。

xsl:include

要素には,href 属性が存在する。この属性の値は,取り込まれるスタイルシートを識別する URI

参照とする。相対 URI は,xsl:include 要素の基底 URI に対して相対的に解決される(3.2 参照)


9

X 4169

:2007

xsl:include

要素は,最上位要素としてだけ使用できる。

取込み処理は,XML 木レベルで行われる。href 属性値が位置決めする資源は,XML 文書として構文解

析され,この XML 文書における xsl:stylesheet 要素の子は,取り込む側の文書における xsl:include 要素を

置換する。テンプレート規則又は定義が取り込まれても,処理方法に影響はしない。

取り込まれる側のスタイルシートは,2.3 で示した簡素化された構文を用いてもよい。取り込まれる側の

スタイルシートの取扱いは,等価な xsl:stylesheet 要素と同じとする。

スタイルシートが直接的又は間接的にそれ自体を取り込む場合は,誤りとする。

注記  複数回にわたってスタイルシートを取り込むと,重複定義のために誤りが発生することがある。

この複数回の取込みは,間接的な場合には,直接的な場合に比べて分かりにくい。例えば,ス

タイルシート B がスタイルシート A を取り込み,スタイルシート C がスタイルシート A を取

り込み,さらに,スタイルシート D がスタイルシート B 及びスタイルシート C の両方を取り

込む場合,A は,間接的に D に 2 度取り込まれる。B,C 及び D のすべてを独立したスタイル

シートとして使用する場合,A の取込み以外の B のすべてを別のスタイルシート B'に分離し,

B

を変更して B'及び A の取込みだけを含むものとし,

C

についても同様の処理を行って,

D

を,

A

,B'及び C'を取り込むものとして変更すれば,誤りを回避することができる。

2.6.2

スタイルシートのインポート  

<xsl:import

    href = uri-reference />

XSLT

スタイルシートは,xsl:import 要素を用いて,他の XSLT スタイルシートをインポートしてもよい。

スタイルシートのインポートは,スタイルシートの取込み(2.6.1 参照)と同様とするが,インポートする

側のスタイルシートの定義及びテンプレート規則が,インポートされる側のスタイルシートの定義及びテ

ンプレート規則よりも優先される点が異なる。これについては,次に詳細に示す。xsl:import 要素は,href

属性をもつ。この属性の値は,インポートされるスタイルシートを識別する URI 参照とする。相対 URI

は,xsl:import 要素の基底 URI に対して相対的に解決される(3.2 参照)

xsl:import

要素は,最上位要素としてだけ使用できる。xsl:import 子要素は,xsl:include 子要素を含めた,

他の xsl:stylesheet 要素の子すべてに先行しなければならない。xsl:include をスタイルシートを取り込むた

めに使用する場合,取り込まれる側の文書における xsl:import 要素はいずれも,取り込む側の文書におい

て,既存のあらゆる xsl:import 要素の後に移動される。

例えば,

<xsl:stylesheet version="1.0"

                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:import href="article.xsl"/>

  <xsl:import href="bigfont.xsl"/>

  <xsl:attribute-set name="note-style">

    <xsl:attribute name="font-style">italic</xsl:attribute>

  </xsl:attribute-set>

</xsl:stylesheet>

xsl:import

要素を含むスタイルシートの処理中に出現した xsl:stylesheet 要素は,インポート木を形成する

ものとして取り扱われる。インポート木では,各 xsl:stylesheet 要素は,それが含む各 xsl:import 要素に対


10

X 4169

:2007

して,一つのインポートの子をもつ。xsl:include 要素は,いずれも,インポート木を構成する前に解決さ

れる。インポート木の後順たどり(すなわち,ある xsl:stylesheet 要素をその要素のインポートの子よりも

後に訪れるというインポート木のたどり)において,ある xsl:stylesheet 要素がそのインポート木における

他の xsl:stylesheet 要素の前に出現した場合,その xsl:stylesheet 要素は,他の xsl:stylesheet 要素よりも低い

インポート優先順位をもつと定義される。各々の定義及びテンプレート規則は,その定義及びテンプレー

ト規則を含む xsl:stylesheet 要素が決定するインポート優先順位をもつ。

例えば,次の例を考える。

a)

スタイルシート A は,スタイルシート B 及び C をこの順序でインポートする。

b)

スタイルシート B は,スタイルシート D をインポートする。

c)

スタイルシート C は,スタイルシート E をインポートする。

このときインポートの優先順位は,低い方から,D,B,E,C 及び A となる。

注記 xsl:import 要素はいかなる定義又はテンプレート規則より前に出現することを要求されるので,

xsl:import

要素に出合った時点でインポートされたスタイルシートを処理する実装は,インポー

ト優先順位が高くなる順に定義及びテンプレート規則に出合うことになる。

一般に,インポート優先順位のより高い定義又はテンプレート規則は,優先順位のより低い定義又はテ

ンプレート規則に優先する。これは,各種の定義及びテンプレート規則に対して詳細に定義される。

スタイルシートがそれ自体を直接的又は間接的にインポートする場合は,誤りとする。これとは別に,

特定の URI をもつスタイルシートが複数の場所でインポートされる場合は,特別な扱いをしない。インポ

ート木は,インポートされる場所ごとに別々の xsl:stylesheet をもつことになる。

注記 xsl:apply-imports が使用される場合(5.6 を参照),その振る舞いは,インポート優先順位が最も

高い場所でだけスタイルシートがインポートされた場合に,異なってもよい。

2.7

スタイルシートの埋込み

通常,XSLT スタイルシートは,文書要素として xsl:stylesheet 要素をもつ完全な XML 文書とする。しか

し,XSLT スタイルシートは,他の資源に埋め込まれることがあってもよい。次の二つの埋込み形式が,

可能となる。

a) XSLT

スタイルシートは,XML 以外の資源に,文字どおりに埋め込まれてよい。

b) xsl:stylesheet

要素は,文書要素として以外に,XML 文書に出現してよい。

2

番目の埋込み形式を容易にするために,xsl:stylesheet 要素は,一意な識別子を指定する ID 属性をもつ

ことができる。

注記  このような属性を XPath の id 関数で使用するためには,この属性が ID であるものとして実際

に DTD で宣言されなければならない。

xml-stylesheet

処理命令[XML Stylesheet]を用いて,文書に独自のスタイルシートを含める方法を次の例で

示す。URI 参照は,素片識別子をもつ相対 URI を用いて,xsl:stylesheet 要素を位置決めする。

<?xml-stylesheet type="text/xml" href="#style1"?>

<!DOCTYPE doc SYSTEM "doc.dtd">

<doc>

<head>

<xsl:stylesheet id="style1"

                                version="1.0"

                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"


11

X 4169

:2007

                xmlns:fo="http://www.w3.org/1999/XSL/Format">

<xsl:import href="doc.xsl"/>

<xsl:template match="id('foo')">

  <fo:block font-weight="bold"><xsl:apply-templates/></fo:block>

</xsl:template>

<xsl:template match="xsl:stylesheet">

  <!-- ignore -->

</xsl:template>

</xsl:stylesheet>

</head>

<body>

<para id="foo">

...

</para>

</body>

</doc>

注記  スタイルシートが適用される文書に埋め込まれるか,又は埋め込まれたスタイルシートに取り

込まれたり,インポートされたりしてよい場合,それらスタイルシートは,xsl:stylesheet 要素

を無視することを指定するテンプレート規則を含む必要がある。

3

データモデル

XSLT

が使用するデータモデルは,XPath が使用するデータモデルに箇条 で示すものを付加したものと

同じとする。XSLT は,同じデータモデルを用いている,ソース文書,結果文書及びスタイルシート文書

に関して処理を行う。同じ木をもつ二つの XML 文書は,いずれも,XSLT によって同じに取り扱われる。

スタイルシートにおける処理命令及びコメントは無視される。すなわち,スタイルシートは,そのスタ

イルシートを表現する木に処理命令ノードもコメントノードも含まれないものとして取り扱われる。

3.1

ルートの子

ルートの子に関する通常の制限は,結果木では緩和される。結果木は,ノードのシーケンスを,一つの

要素ノードに対して可能な子としてもってよい。特に,結果木は,テキストノードの子及びどのような数

の要素ノードの子をもってもよい。XML 出力メソッド(箇条 16 参照)を用いて書き出す場合,結果木が

整形式の XML 文書でない可能性もある。しかし,結果木は,常に整形式の外部一般解析対象実体となる。

整形式の XML 文書を構文解析することによってソース木が生成される場合,ソース木のルートは,テ

キストノードの子をもたず,要素の子をちょうど一つだけもつという通常の制限を自動的に満たすことに

なる。他の方法,例えば,DOM を用いて,ソース木が生成される場合には,通常の制約は,結果木の場

合と同じようにソース木で緩和される。

3.2

基底 URI

どのノードにも基底 URI と呼ばれる関連する URI が存在する。これは,相対 URI を表現する属性値を

絶対 URI に変換するために使用される。要素又は処理命令が外部実体の中に出現する場合,その要素又は

処理命令の基底 URI は,その外部実体の URI とする。そうでない場合は,基底 URI は,その文書の基底

URI

とする。文書ノードの基底 URI は,その文書実体の URI とする。テキストノード,コメントノード,


12

X 4169

:2007

属性ノード又は名前空間ノードに対する基底 URI は,そのノードの親の基底 URI とする。

3.3

解析対象外実体

ルートには,文書の DTD で宣言された解析対象外実体の各々に対して URI を与える対応付けが存在す

る。この URI は,実体宣言で指定されたシステム識別子及び公開識別子から生成される。 XSLT プロセサ

は,公開識別子を用いて,システム識別子で指定された URI の代わりに,実体に対応する URI を生成して

もよい。XSLT プロセサが公開識別子を用いて URI を生成しない場合は,システム識別子を使用しなけれ

ばならない。すなわち,システム識別子が相対 URI である場合は,基底 URI としての実体宣言を含む資源

の URI を用いて,絶対 URI へと解決しなければならない[RFC2396]。

3.4

空白の削除

ソース文書又はスタイルシート文書の木が構成された後で,XSLT が他の処理を行う前に,削除される

テキストノードもある。テキストノードが空白文字だけを含む場合以外は,テキストノードは削除されな

い。テキストノードを削除することによって,木からテキストノードが取り除かれる。削除処理は,空白

を保存しなければならない要素名(以降,空白保存要素名という。

)の集合を入力として取る。削除処理は,

スタイルシートにもソース文書にも適用されるが,空白保存要素名の集合は,スタイルシート及びソース

文書に対して異なって決定される。

次のいずれかが適用される場合には,テキストノードは保存される。

a)

テキストノードの親の要素名が,空白保存要素名の集合内に存在する。

b)

テキストノードが,少なくとも一つの非空白文字を含む。XML の場合は,空白文字は,#x20,#x9,

#xD

又は#xA とする。

c)

テキストノードの祖先要素が,preserve の値をもつ xml:space 属性をもち,その祖先要素より近い祖先

要素が,default の値をもつ xml:space 属性をもたない。

それ以外の場合は,テキストノードは削除される。

xml:space

属性は,木から削除されない。

注記  このことは,xml:space 属性がリテラル結果要素に指定されている場合には,それが結果に含ま

れることを意味する。

スタイルシートの場合,空白保存要素名の集合は,xsl:text だけから構成される。

<!-- Category: top-level-element -->

<xsl:strip-space

    elements = tokens />

<!-- Category: top-level-element -->

<xsl:preserve-space

    elements = tokens />

ソース文書の場合,空白保存要素名の集合は,xsl:strip-space 最上位要素及び xsl:preserve-space 最上位要

素によって指定される。要素名が空白保存名の集合に含まれているか否かは xsl:strip-space 要素又は

xsl:preserve-space

要 素 と の ベ ス ト マ ッ チ に よ っ て 決 定 さ れ る 。 マ ッ チ し な い か , ベ ス ト マ ッ チ が

xsl:preserve-space

の場合に限り,含まれる。xsl:strip-space 要素及び xsl:preserve-space 要素には,それぞれ

elements

属性が存在し,その値は空白で区切られた NameTest(JIS X 4160 の 3.7 参照)のリストとする。

要素名は NameTest の一つにマッチした場合に xsl:strip-space 要素又は xsl:preserve-space 要素にマッチする。


13

X 4169

:2007

NameTest

が要素に対して XPath ノードテスト(JIS X 4160 の 2.3 参照)として真になる場合に限り,要素

は NameTest にマッチする。二つ以上の xsl:strip-space 要素及び xsl:preserve-space 要素にマッチするとき,

ベストマッチング NameTest によってベストマッチング要素が決定される。これはテンプレート規則と同

様の方法で決定される。

a)

はじめに,インポート優先順位が他のマッチよりも低いマッチをすべて無視する。

b)

次に,他のマッチのデフォルト優先順位よりも低いデフォルト優先順位をもつマッチをすべて無視す

る。

二つ以上のマッチが残る場合は誤りとする。XSLT プロセサは,この誤りを通知してもよい。誤りを通

知しない場合は,

残ったマッチの中から,

スタイルシートで最後に出現するものを選択することによって,

誤りから回復しなければならない。

4

XSLT

は,XPath (JIS X 4160)が定義する式言語を使用する。XSLT では,次を含む様々な目的に式を使用

する。

a)

処理対象のノードの選択。

b)

ノードを異なる方法で処理するための条件の指定。

c)

結果木に挿入されるテキストの生成。

式は,XPath 生成規則の Expr にマッチしなければならない。

式は,XSLT 定義の要素に関する特定の属性値として属性値テンプレートに波括弧で囲まれた形式で出

現する。

XSLT

では,最も外側の式,すなわち,他の式の一部ではない式が,次に示す方法により,文脈を取得

する。

a)

文脈ノードは,現ノードとする。

b)

文脈位置は,現ノードリストにおける現ノードの位置とする。最初の位置は,1 とする。

c)

文脈サイズは,現ノードリストのサイズとする。

d)

変数束縛は,式が出現する属性をもつ要素の適用範囲内にある束縛とする(箇条 11 参照)

e)

名前空間宣言の集合は,

式が出現する属性をもつ要素の適用範囲内に含まれるものとする。これには,

XML

名前空間勧告(JIS X 4158)が要求する接頭辞 xml の暗黙の宣言を含む。xmlns によって宣言され

るとおりのデフォルト名前空間は,この集合の一部ではない。

f)

関数ライブラリは,コア関数ライブラリ,箇条 12 で定義される追加関数及び箇条 14 で示されるとお

りの拡張関数から構成される。式が他の関数への呼出しを含む場合は誤りとする。

5

テンプレート規則

5.1

処理モデル

ソースノードのリストを処理すると,結果木素片が生成される。結果木は,ルートだけを含むリストを

処理することによって構成される。ソースノードのリストは,リストの各メンバを順に処理することで生

成される結果木構造を追加することによって処理される。ノードは,そのノードとマッチするパターンを

もつすべてのテンプレート規則を見い出し,その中で最適なものを選択することによって,処理される。

選択された規則のテンプレートは,現ノードとしてのノード及び現ノードリストとしてのソースノードの

リストを用いてインスタンス化される。テンプレートは,通常,処理対象となるソースノードの付加的な


14

X 4169

:2007

リストを選択する命令を含んでいる。マッチング,インスタンス化及び選択という過程は,新しいソース

ノードが処理のために選択されなくなるまで再帰的に繰り返される。

実装は,この処理モデルを用いて処理された場合と同じ結果となる方法であれば,いかなる方法でも,

ソース文書を自由に処理できる。

5.2

パターン

テンプレート規則は,パターンを使用することで,適用されるノードを識別する。テンプレート規則で

使用されるのと同様に,パターンは,番号付け(7.7 参照)及びキーの宣言(12.2 参照)のために使用さ

れる。パターンは,ノードに関する条件の集合を指定する。条件を満たすノードは,パターンにマッチす

る。条件を満たさないノードは,パターンにマッチしない。パターンの構文は,式の構文の部分集合とす

る。特に,一定の制限を満たす位置パスは,パターンとして使用できる。パターンでもある式は,常にノ

ード集合の型のオブジェクトと評価される。パターンを幾つかの可能な文脈に関して式として評価した結

果のメンバにノードがなる場合,そのノードはそのパターンにマッチする。ここで,可能な文脈とは,文

脈のノードがマッチ判定の対象となっているノードであるか,又はその祖先のノードである文脈のことと

する。

パターンの例を次に示す。

a) para

は,どの para 要素ともマッチする。

b) *

は,どの要素ともマッチする。

c) chapter|appendix

は,どの chapter 要素及びどの appendix 要素ともマッチする。

d) olist/item

は,親要素に olist をもつどの item 要素ともマッチする。

e) appendix//para

は,祖先要素に appendix をもつどの para 要素ともマッチする。

f) /

は,ルートとマッチする。

g) text()

は,どのテキストノードともマッチする。

h) processing-instruction()

は,どの処理命令ともマッチする。

i) node()

は,属性ノード及びルート以外のどのノードともマッチする。

j) id("W11")

は,一意な識別子(ID) W11 をもつ要素とマッチする。

k) para[1]

は,その親の最初の para 子要素であるどの para 要素ともマッチする。

l)

*[position()=1 and self::para]

は,その親の最初の子要素であるどの para 要素ともマッチする。

m) para[last()=1]

は,その親の唯一の para 子要素であるどの para 要素ともマッチする。

n) items/item[position()>1]

は,items 要素の親をもち,その親の最初の item 子要素ではないどの item 要素

ともマッチする。

o)  item[position() mod 2 = 1]

は,その親の item という子要素の中で奇数番目であるどの item 要素に対して

も真となる。

p) div[@class="appendix"]//p

は,class 属性をもち,その値が appendix である div 要素を祖先としてもつ,

どの p 要素ともマッチする。

q) @class

は,どの class 属性ともマッチする。class 属性をもつ要素のことではないことに注意する。

r) @*

は,どの属性ともマッチする。

パターンは,Pattern の文法とマッチしなければならない。Pattern は,|で区切られた位置パスのパターン

の集合とする。位置パスのパターンとは,その段階がすべて child 軸又は attribute 軸だけを使用する位置パ

スのこととする。パターンは,descendant-or-self 軸を用いてはならないが,演算子/と同様に演算子//を用い

てもよい。位置パスのパターンを,リテラル引数をもつ id 関数又は key 関数の呼出しで始めることもでき


15

X 4169

:2007

る。パターン内の述部には,位置パス内の述部と同様に任意の式を使用できる。

Patterns

[1] Pattern

::=

  LocationPathPattern

  | Pattern '|' LocationPathPattern

[2] LocationPathPattern

::=

  '/' RelativePathPattern?

  | IdKeyPattern (('/' | '//') RelativePathPattern)?

  | '//'? RelativePathPattern

[3] IdKeyPattern

::=

  'id' '(' Literal ')'

  | 'key' '(' Literal ',' Literal ')'

[4] RelativePathPattern

::=

  StepPattern

  | RelativePathPattern '/' StepPattern

  | RelativePathPattern '//' StepPattern

[5] StepPattern

::=

  ChildOrAttributeAxisSpecifier NodeTest Predicate*

[6] ChildOrAttributeAxisSpecifier

::=

  AbbreviatedAxisSpecifier

  | ('child' | 'attribute') '::'

パターンがノードにマッチすると定義されるのは,そのパターンが文脈を用いて式として評価されると

きにそのノードが結果として生じるノード集合のメンバであるような文脈が存在する場合に限る。ノード

がマッチ判定される場合,可能な文脈は,マッチ判定されるノード又はそのノードの祖先の文脈ノード,

及びその文脈ノードだけを含む文脈ノードリストをもつ。

例えば,p は,どの p 要素ともマッチするが,これは,いかなる p に対しても,文脈としての p 要素の

親を用いて式 p を評価する場合に,結果として生じるノード集合が,その p 要素をそのメンバの一つとし

て含むことによる。

注記  文書のルートは文書要素の親なので,文書要素である p 要素でも,これはマッチする。

パターンの意味は,式の評価に関して間接的に規定されるが,式の評価に関して考えることなく直接的

にパターンの意味を理解するのは容易である。パターンにおいて,|は選択肢の存在を示している。|で区切

られた選択肢を一つ以上もつパターンは,その選択肢のいずれかがマッチすると,パターンとしてマッチ

する。/又は//で区切られた StepPattern のシーケンスから成るパターンは,右から左に向かってマッチ判定

される。このパターンがマッチするのは,最も右の StepPattern がマッチし,適切な要素がパターンの残り

にマッチする場合とする。区切り子が/である場合は,親だけが適切な要素となる。区切り子が//である場

合は,どの祖先であっても適切な要素となる。子の軸を使用する StepPattern は,NodeTest がノードに対し

て真であって,ノードが属性ノードではない場合にマッチする。属性の軸を使用する StepPattern は,

NodeTest

がノードに対して真であって,ノードが属性ノードである場合にマッチする。[]が存在する場合

には,StepPattern における最初の PredicateExpr(JIS X 4160 の 2.4 参照)は,文脈ノードとしてマッチ判定

されるノード,及びその文脈ノードの兄弟であって文脈ノードリストとして NodeTest にマッチするものと

を用いて評価される。ただし,マッチ判定されるノードは属性ノードではなく,その場合,文脈ノードリ

ストは,マッチ判定される属性と同じ親をもち NameTest にマッチするすべての属性とする。

次に例を示す。

appendix//ulist/item[position()=1]

この例は,次のすべての場合が真のときに限り,ノードとマッチする。

a) NodeTest

item

がノードに対して真であって,そのノードが属性ではない場合。言い換えると,ノード


16

X 4169

:2007

が item 要素である場合。

b)

文脈ノードとしてのノードと,そのノードの兄弟であって文脈ノードリストとしての item 要素である

ものとを一緒にして PredicateExpr position()=1 を評価すると,真となる場合。

c)

ノードが appendix//ulist にマッチする親をもつ場合。これは,appendix 祖先要素をもつ ulist 要素が親

となる場合に真となる。

5.3

テンプレート規則の定義方法

<!-- Category: top-level-element -->

<xsl:template

    match = pattern

    name = qname

  priority = number

  mode = qname>

  <!-- Content: (xsl:param*, template) -->

</xsl:template>

テンプレート規則は,xsl:template 要素を用いて指定する。match 属性は,ソースノード,又はその規則

が適用するノードを識別する Pattern とする。xsl:template 要素が name 属性をもたなければ,match 属性が,

要求される(箇条 参照)

。match 属性の値が VariableReference(JIS X 4160 の 3.7 参照)を含むことは,誤

りとする。xsl:template 要素の内容は,テンプレート規則が適用されるときインスタンス化されるテンプレ

ートとする。

例えば,XML 文書が次を含むとする。

This is an <emph>important</emph> point.

次のテンプレート規則は,emph 要素にマッチし,bold の font-weight 特性をもつ fo:inline-sequence フォ

ーマット化オブジェクトを生成する。

<xsl:template match="emph">

  <fo:inline-sequence font-weight="bold">

    <xsl:apply-templates/>

  </fo:inline-sequence>

</xsl:template>

注記  この文書の例は,名前空間 http://www.w3.org/1999/XSL/Format に fo:接頭辞を使用する。この名

前空間は,[XSL]で定義されるフォーマット化オブジェクトの名前空間である。

5.4

に示すとおり,xsl:apply-templates 要素は,ソース要素の子を再帰的に処理する。

5.4

テンプレート規則の適用

<!-- Category: instruction -->

<xsl:apply-templates

  select = node-set-expression

  mode = qname>

    <!-- Content: (xsl:sort | xsl:with-param)* -->

</xsl:apply-templates>

次の例は,chapter 要素に関してブロックを生成し,その直接の子を処理する。


17

X 4169

:2007

<xsl:template match="chapter">

  <fo:block>

    <xsl:apply-templates/>

  </fo:block>

</xsl:template>

select

属性が存在しないとき,xsl:apply-templates 命令は,テキストノードを含む現ノードのすべての子

を処理する。しかし,3.4 で指定されるとおり,削除されたテキストノードは処理されない。空白ノードの

削除が要素に関して不可能であったとき,要素の内容にあるすべての空白はテキストとして処理され,し

たがって,子要素間の空白は,position 関数によって返される,子要素の位置の決定において意味をもつ。

select

属性は,すべての子を処理するのではなく,式が選択するノードを処理するために,使用できる。

select

属性の値は,式とする。式は,ノード集合に対して評価される。選択されたノード集合は,ソート

の規定が存在しなければ(箇条 10 参照)

,文書順に処理される。次の例は,author-group の子である author

をすべて処理する。

<xsl:template match="author-group">

  <fo:inline-sequence>

    <xsl:apply-templates select="author"/>

  </fo:inline-sequence>

</xsl:template>

次の例は,author-group の子である author の given-name をすべて処理する。

<xsl:template match="author-group">

  <fo:inline-sequence>

    <xsl:apply-templates select="author/given-name"/>

  </fo:inline-sequence>

</xsl:template>

次の例は,book 要素の子孫要素である heading をすべて処理する。

<xsl:template match="book">

  <fo:block>

    <xsl:apply-templates select=".//heading"/>

  </fo:block>

</xsl:template>

現ノードの子孫ではない要素を処理することもできる。次の例は,department 要素が group という子を

もち,employee という子孫をもつと仮定する。従業員の所属を見つけて,department の子である group を

処理する。

<xsl:template match="employee">

  <fo:block>

        Employee <xsl:apply-templates select="name"/> belongs to group

    <xsl:apply-templates select="ancestor::department/group"/>

  </fo:block>

</xsl:template>

複数の xsl:apply-templates 要素は,簡単な再順序付けをするために,単一のテンプレート内で使用できる。


18

X 4169

:2007

次の例は,二つの HTML の表を生成する。最初の表は国内販売が記入され,二つ目の表は海外販売が記入

される。

<xsl:template match="product">

  <table>

    <xsl:apply-templates select="sales/domestic"/>

  </table>

  <table>

    <xsl:apply-templates select="sales/foreign"/>

  </table>

</xsl:template>

注記 1  二つのマッチする子孫が見つかり,その一方が他方の子孫であることもある。この場合も特

別には取り扱われない。いずれの子孫も通常どおり処理される。例えば,次のソース文書を

考える。

<doc><div><div></div></div></doc>

ここで,

<xsl:template match="doc">

  <xsl:apply-templates select=".//div"/>

</xsl:template>

という規則は,外側の div 要素も内側の div 要素も処理する。

注記 2  通常,xsl:apply-templates は,現ノードの子孫であるノードだけを処理するために,使用され

る。xsl:apply-templates をこのとおりに使用すると,終端のないループに入ってしまうことは

ない。しかし,xsl:apply-templates を,現ノードの子孫ではない要素を処理するために使用す

ると,終端のないループを生じる可能性がある。次に例を示す。

<xsl:template match="foo">

  <xsl:apply-templates select="."/>

</xsl:template>

実装がこのループを検知できることがあるかもしれないが,実装が検知できない,終端の

ないループにスタイルシートが入ってしまう可能性がある。これは,サービスセキュリティ

リスクの否定を示すものかもしれない。

5.5

テンプレート規則の競合解決

一つのソースノードが,複数のテンプレート規則にマッチすることがある。使用するテンプレート規則

の決定方法を次に示す。

決定手順 1

最初に,

最高のインポート優先順位をもつマッチするテンプレート規則

(単数又は複数)

より低いインポート優先順位をもつ,すべてのマッチするテンプレート規則を考慮から除外す

る。

決定手順 2

次に,最高の優先度をもつマッチするテンプレート規則(単数又は複数)より低い優先

度をもつすべてのマッチするテンプレート規則を考慮から除外する。テンプレート規則の優先

度は,テンプレート規則の priority 属性によって指定される。この値は,任意選択として先頭

にマイナス記号(-)が付く生成規則 Number にマッチする,正又は負の実数でなければならな

い。デフォルト優先度は,次のとおり計算される。


19

X 4169

:2007

a)

パターンが|で区切られた複数の選択肢を含むとき,それは,各選択肢に一つのテンプレート規則の集

合と等価に扱われる。

b)

パターンが,

ChildOrAttributeAxisSpecifier

で始まる QName の形式をもつか,

ChildOrAttributeAxisSpecifier

で始まる processing-instruction(Literal)の形式をもつとき,優先度は 0 とする。

c)

パターンが,ChildOrAttributeAxisSpecifier で始まる NCName:*の形式をもつとき,優先度は-0.25 とす

る。

d)

それら以外の場合で,パターンが,ChildOrAttributeAxisSpecifier で始まる NodeTest だけから構成され

ているとき,優先度は-0.5 とする。

e)

それら以外の場合,優先度は 0.5 とする。

したがって,最も普通の種類のパターン(特定の型及び特定の展開名をもつノードについてテスト

するパターン)は,優先度 0 をもつ。次に固有性の低い種類のパターン(特定の型及び特定の名前空

間 URI の展開名をもつノードについてテストするパターン)は,優先度-0.25 をもつ。それより固有

性の低いパターン(特定の型をもつノードをテストするだけのパターン)は,優先度-0.5 をもつ。最

も普通の種類のパターンよりも固有性の高いパターンは,優先度 0.5 をもつ。

この処理が,マッチするテンプレート規則が複数残った場合は,誤りとする。XSLT プロセサは,誤り

を通知してもよい。誤りを通知しない場合,XSLT プロセサは,残ったマッチするテンプレート規則の中

から,スタイルシートの中に最後に現れる一つを選択することによって,回復しなければならない。

5.6

テンプレート規則の上書き

<!-- Category: instruction -->

<xsl:apply-imports />

インポートされるスタイルシートにおいてテンプレート規則を上書きするために使用されるテンプレー

ト規則(5.5 参照)は,上書きされたテンプレート規則を呼び出すために,xsl:apply-imports 要素を使用で

きる。

スタイルシートの処理のどの点でも,現テンプレート規則が存在する。パターンをマッチングすること

によってテンプレート規則が選択されるときは常に,そのテンプレート規則が,規則のテンプレートのイ

ンスタンス化に関する現テンプレート規則となる。xsl:for-each 要素をインスタンス化すると,現テンプレ

ート規則は,xsl:for-each 要素の内容のインスタンス化に関して無効となる。

xsl:apply-imports

は,現テンプレート規則を含むスタイルシート要素の中にインポートされたテンプレー

ト規則だけを用いて,現ノードを処理する。ノードは,現テンプレート規則のモードで処理される。現テ

ンプレート規則が無効な場合,xsl:apply-imports がインスタンス化されるのは誤りとする。

例えば,スタイルシート doc.xsl が example 要素に関するテンプレート規則を含むとする。

<xsl:template match="example">

  <pre><xsl:apply-templates/></pre>

</xsl:template>

別のスタイルシートは doc.xsl をインポートでき,example 要素の扱いを変更できる。それを次に例示す

る。

<xsl:import href="doc.xsl"/>

<xsl:template match="example">

    <div style="border: solid red">


20

X 4169

:2007

     <xsl:apply-imports/>

    </div>

</xsl:template>

組合せの効果は,example を次の形式の要素に変換することになる。

<div style="border: solid red"><pre>...</pre></div>

5.7

モード

モードは,要素を複数回処理することを可能にし,毎回異なる結果を生成する。

xsl:template

及び xsl:apply-templates は,どちらも任意選択の mode 属性をもつ。mode 属性の値は,QName

であり,それは 2.4 で記述されるとおりに展開される。xsl:template が match 属性をもたないとき,それは

mode

属性をもってはならない。xsl:apply-templates 要素が mode 属性をもつとき,それは,同じ値の mode

属性をもつ xsl:template 要素からのテンプレート規則だけに適用する。xsl:apply-templates 要素が mode 属性

をもたないとき,それは,mode 属性をもたない xsl:template 要素からのテンプレート規則だけに適用する。

5.8

組込みテンプレート規則

スタイルシートの明示的なテンプレート規則によって,パターンのマッチに成功しない場合,再帰的処

理を継続可能にするために,組込みテンプレート規則が存在する。このテンプレート規則は,要素ノード

及びルートのどちらにも適用する。組込みテンプレート規則と等価なものを次に示す。

<xsl:template match="*|/">

  <xsl:apply-templates/>

</xsl:template>

各モードの組込みテンプレート規則も存在する。それは,スタイルシートの明示的なテンプレート規則

によって,パターンのマッチに成功しない場合,同じモードでの再帰的処理を継続可能にできる。このテ

ンプレート規則は,要素ノード及びルートのどちらにも適用する。モード m のための組込みテンプレート

規則と等価なものを次に示す。

<xsl:template match="*|/" mode="m">

  <xsl:apply-templates mode="m"/>

</xsl:template>

テキストノード及び属性ノードについての,テキストをコピーする組込みテンプレート規則も存在する。

<xsl:template match="text()|@*">

  <xsl:value-of select="."/>

</xsl:template>

処理命令及びコメントについての組込みテンプレート規則は,何もしない。

<xsl:template match="processing-instruction()|comment()"/>

名前空間ノードの組込みテンプレート規則も,何もしない。名前空間ノードとマッチすることができる

パターンは存在しない。そこで,その組込みテンプレート規則は,名前空間ノードに適用されるテンプレ

ート規則だけとする。

組込みテンプレート規則は,

スタイルシートの前に暗黙的にインポートされたかのように扱われるので,

他のすべてのテンプレート規則より低いインポート優先順位をもつ。したがって,作成者は,明示的なテ

ンプレート規則を含むことによって,組込みテンプレート規則を上書きできる。

6

名前付きテンプレート


21

X 4169

:2007

<!-- Category: instruction -->

<xsl:call-template

    name = qname>

  <!-- Content: xsl:with-param* -->

</xsl:call-template>

テンプレートは,名前によって呼び出すことができる。name 属性をもつ xsl:template 要素は,名前付き

テンプレートを指定する。name 属性の値は,QName であり,それは 2.4 で記述されるとおりに展開され

る。xsl:template 要素が name 属性をもつとき,それは match 属性をもってもよいが,必ずしももつ必要は

ない。xsl:call-template 要素は,名前によってテンプレートを呼び出す。それは,呼び出されるテンプレー

トを識別する name 属性を必要とする。xsl:apply-templates とは異なり,xsl:call-template は,現ノード又は

現ノードリストを変更しない。

xsl:template

要素の match 属性,mode 属性及び priority 属性は,テンプレートが xsl:call-template 要素によ

って呼び出されるかどうかに影響を与えない。同様に,xsl:template 要素の name 属性は,xsl:apply-templates

要素によってテンプレートが呼び出されるかどうかに影響を与えない。

スタイルシートが,同じ名前及び同じインポート優先順位をもつ複数のテンプレートを含むとき,それ

は誤りとなる。

7

結果木の生成

結果木の中にノードを直接生成する命令を,箇条 に示す。

7.1

要素及び属性の生成

7.1.1

リテラル結果要素

テンプレートにおいては,XSLT 名前空間に属さず,拡張要素(14.1 参照)ではないスタイルシートの

要素は,インスタンス化されて,同じ展開名をもつ要素ノードを生成する。要素の内容は,テンプレート

であり,それはインスタンス化されて,生成された要素ノードの内容を与える。生成された要素ノードは,

スタイルシート木の要素ノード上に存在した属性ノードで,XSLT 名前空間において名前をもつ属性以外

の属性ノードをもつことになる。

生成された要素ノードは,スタイルシート木の要素ノード上に存在した名前空間ノードのコピーももつ

ことになる。ただし,文字列の値が,XSLT 名前空間 URI (http://www.w3.org/1999/XSL/Transform),拡張名

前空間として宣言された名前空間 URI(14.1 参照)

,又は排除される名前空間として指定される名前空間

URI

である名前空間は除く。名前空間 URI は,xsl:stylesheet 要素の exclude-result-prefixes 属性又はリテラ

ル結果要素の xsl:exclude-result-prefixes 属性を使用することによって,排除される名前空間として指定され

る。これらの属性の値はどちらも,名前空間接頭辞の空白で区切ったリストとする。各接頭辞に限定され

る 名 前 空 間 は , 排 除 さ れ る 名 前 空 間 と し て 指 定 さ れ る 。 exclude-result-prefixes 属 性 又 は

xsl:exclude-result-prefixes

属性をもつ要素に,接頭辞に限定される名前空間が存在しないときは,誤りとす

る。

(xmlns によって宣言される)デフォルト名前空間は,名前空間の接頭辞のリストに#default を含むこ

とによって,排除される名前空間として指定されてもよい。排除される名前空間としての名前空間の指定

は,exclude-result-prefixes 属性又は xsl:exclude-result-prefixes 属性をもつ要素をルートとするスタイルシー

トの部分木の中で有効となる。xsl:stylesheet 要素をルートとする部分木は,その xsl:stylesheet 要素の子に

よってインポートされる又は含まれるどんなスタイルシートをも含まない。


22

X 4169

:2007

注記  スタイルシートが,ソース木をアドレスするためだけに名前空間宣言を使用する場合,

exclude-result-prefixes

属性における接頭辞の指定は,結果木の不必要な名前空間宣言を回避する

ことになる。

リテラル結果要素の属性値は,属性値テンプレートとして解釈される。このテンプレートは,波括弧({})

の中にある式を含むことができる。

結果木において名前空間 URI を指定するために用いられるスタイルシート木の名前空間 URI を,リテラ

ル名前空間 URI と呼ぶ。これは次に適用される。

a)

スタイルシートにおけるリテラル結果要素の展開名の名前空間 URI

b)

スタイルシートにおけるリテラル結果要素に指定される属性の展開名の名前空間 URI

c)

スタイルシートにおけるリテラル結果要素の名前空間ノードの文字列値

<!-- Category: top-level-element -->

<xsl:namespace-alias

    stylesheet-prefix = prefix | "#default"

    result-prefix = prefix | "#default" />

スタイルシートは,ある名前空間 URI が別の名前空間 URI に関する別名であると宣言するために,

xsl:namespace-alias

要素を使用できる。リテラル名前空間 URI  が別の名前空間 URI に関する別名になると

宣言されたとき,結果木の名前空間 URI は,リテラル名前空間 URI そのものの代わりに,リテラル名前空

間 URI がその別名である名前空間 URI となる。xsl:namespace-alias 要素は,stylesheet-prefix 属性によって

指定される接頭辞に限定される名前空間 URI が,result-prefix 属性によって指定される接頭辞に限定される

名前空間 URI に関する別名であると宣言する。したがって,stylesheet-prefix 属性は,スタイルシートに現

れる名前空間 URI を指定し,

result-prefix

属性は,

結果木に現れる対応する名前空間 URI を指定する。

(xmlns

によって宣言される)デフォルト名前空間は,接頭辞の代わりに#default を用いて指定されてもよい。名

前空間 URI が複数の異なる名前空間 URI に関する別名になると宣言されると,最高のインポート優先順位

をもつ宣言が使用される。この宣言が複数存在する場合は,誤りとする。 XSLT プロセサは誤りを通知し

てよい。誤りを通知しない場合は,最高のインポート優先順位をもつ宣言の中から,スタイルシートの最

後に現れるものを選択することによって,誤りから回復しなければならない。

リテラル結果要素を用いて,要素,属性又は XSLT 名前空間 URI を使用する名前空間ノードを生成する

場合,スタイルシートは別名を使用しなければならない。次にその例を示す。

<xsl:stylesheet

  version="1.0"

  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

  xmlns:fo="http://www.w3.org/1999/XSL/Format"

  xmlns:axsl="http://www.w3.org/1999/XSL/TransformAlias">

<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="xsl"/>

<xsl:template match="/">

  <axsl:stylesheet>

    <xsl:apply-templates/>

  </axsl:stylesheet>

</xsl:template>


23

X 4169

:2007

<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>

注記 XSLT 名前空間 URI 以外の名前空間に関する別名を使用する必要がある場合もある。例えば,

ディジタル署名を扱う名前空間に属するリテラル結果要素は,XSLT スタイルシートが,一般

用のセキュリティソフトウエアによって間違って扱われることを引き起こすことがある。名前

空間に関する別名の使用は,これらの間違った扱いの可能性を回避する。

7.1.2

xsl:element

による要素の生成

<!-- Category: instruction -->

<xsl:element

    name = { qname }

  namespace = { uri-reference }

  use-attribute-sets = qnames>

  <!-- Content: template -->

</xsl:element>

xsl:element

要素は,計算された名前を用いて要素を生成することを可能にする。生成される要素の展開

名は,必す(須)の name 属性及び任意選択の namespace 属性によって指定される。xsl:element 要素の内容

は,属性及び生成された要素の子に関するテンプレートとする。

name

属性は,属性値テンプレートとして解釈される。属性値テンプレートをインスタンス化した結果と

しての文字列が QName でない場合は,誤りとする。XSLT プロセサは,誤りを通知してもよい。誤りを通

知しない場合は,xsl:element 要素をインスタンス化した結果を,どのような初期属性ノードをも除き,

xsl:element

要素の内容をインスタンス化することによって生成されるノードのシーケンスにすることによ

って,誤りから回復しなければならない。namespace 属性が存在しない場合,QName は,どのようなデフ

ォルト名前空間宣言をも含めて,実際に xsl:element 要素に関する名前空間宣言を用いて,展開名に展開さ

れる。

namespace

属性が存在する場合には,それも,属性値テンプレートとして解釈される。属性値テンプレ

ートをインスタンス化した結果から生じる文字列は,URI 参照になることが望ましい。文字列が構文に合

った URI 参照でなくても,誤りではない。文字列が空のとき,要素の展開名は,null 名前空間 URI をもつ。


24

X 4169

:2007

そうでないとき,文字列は,生成される要素の展開名の名前空間 URI として使用される。name 属性が指

定する QName の局所部分は,生成される要素の展開名の局所部分として使用される。

XSLT

プロセサは,生成される要素を XML として出力するために使用される接頭辞を選択するとき,

name

属性で指定される QName の接頭辞を利用してもよい。しかし,それらは必す(須)ではない。

7.1.3

xsl:attribute

による属性の生成

<!-- Category: instruction -->

<xsl:attribute

    name = { qname }

  namespace = { uri-reference }>

  <!-- Content: template -->

</xsl:attribute>

xsl:attribute

要素は,スタイルシートにおけるリテラル結果要素によって生成されようと,xsl:element な

どの命令によって生成されようと,結果要素に属性を追加するために使用できる。生成される属性の展開

名は,必す(須)の name 属性及び任意選択の namespace 属性によって指定される。xsl:attribute 要素をイ

ンスタンス化することは,

含まれる結果要素のノードに属性ノードを追加する。

xsl:attribute

要素の内容は,

生成される属性の値に関するテンプレートとする。

name

属性は,属性値テンプレートとして解釈される。属性値テンプレートをインスタンス化することの

結果として得られる文字列が QName ではないか,又は文字列 xmlns になる場合は,誤りとする。XSLT プ

ロセサは,誤りを通知してもよい。誤りを通知しない場合は,結果木に属性を追加しないことによって,

誤りから回復しなければならない。namespace 属性が存在しない場合,QName は,どのようなデフォルト

の名前空間宣言をも含めないで,実際に xsl:attribute 要素に関する名前空間宣言を用いて,展開名に展開さ

れる。

namespace

属性が存在する場合,それも,属性値テンプレートとして解釈される。それをインスタンス

化した結果から生じる文字列は,

URI

参照になることが望ましい。

文字列が構文に合った URI でなくても,

誤りではない。文字列が空のとき,属性の展開名は null 名前空間 URI をもつ。そうではない場合,文字列

は,生成される属性の展開名の名前空間 URI として使用される。name 属性が指定する QName の局所部分

は,生成される属性の展開名の局所部分として使用される。

XSLT

プロセサは,生成される属性を XML として出力するために使用される接頭辞を選択するときに,

name

属性で指定される QName の接頭辞を利用してもよい。しかし,これは必す(須)ではなく,接頭辞

が xmlns であるときは,利用してはならない。したがって,次の例は誤りではない。

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

しかし,出力される名前空間宣言になることはない。

要素に属性を追加することは,その要素のどんな既存の属性をも,同一の展開名で置き換える。

次はすべて誤りとする。

a)

子を付加した後で要素に属性を追加する。実装は,誤りを通知しても,属性を無視してもよい。

b)

要素ではないノードに属性を追加する。実装は,誤りを通知しても,属性を無視してもよい。

c) xsl:attribute

要素の内容をインスタンス化している間に,テキストノード以外のノードを生成する。実

装は,誤りを通知しても,誤り原因のノードをその内容とともに無視してもよい。

注記 xsl:attribute が改行のあるテキストノードを含む場合,XML 出力は文字参照を含まなければなら


25

X 4169

:2007

ない。次にそれを例示する。

<xsl:attribute name="a">x

y</xsl:attribute>

この記述は,次の出力を与える。

a="x&#xA;y"

(又は,同等のすべての文字参照を出力する結果となる。

)XML 出力は,次のとおりではあ

り得ない。

a="x

y"

これは,XML1.0 が,属性値における改行文字はスペースに正規化されることを要求するが,

改行文字への文字参照は正規化されないことを要求することに基づく。データモデルの属性値

は,正規化後の属性値を表す。木の属性値に現れる改行が,文字参照としてではなく改行文字

として出力された場合,XML の再構文解析によって生成される木の属性値は,改行ではなくス

ペースを含むことになる。これは,木が正しく出力されなかったことを意味する。

7.1.4

名前付き属性集合

<!-- Category: top-level-element -->

<xsl:attribute-set

    name = qname

  use-attribute-sets = qnames>

  <!-- Content: xsl:attribute* -->

</xsl:attribute-set>

xsl:attribute-set

要素は,名前付き属性集合を定義する。name 属性は,属性集合の名前を指定する。name

属性の値は,QName であり,それは 2.4 で記述されるとおりに展開される。xsl:attribute-set 要素の内容は,

集合内の属性を指定する 0 個以上の xsl:attribute 要素で構成する。

属性集合は,xsl:element 要素,xsl:copy 要素(7.5 参照)又は xsl:attribute-set 要素に use-attribute-sets 属性

を指定することによって使用される。use-attribute-sets 属性の値は,空白で区切った属性集合の名前のリス

トとする。各名前は,QName として指定され,それは,2.4 において記述されるとおりに展開される。

use-attribute-sets

属性を指定することは,

名前付き属性集合のそれぞれの各属性に関する xsl:attribute 要素を,

use-attribute-sets

属性をもつ要素の内容の先頭に追加することと等価になる。追加の順序は,属性集合の名

前が use-attribute-sets 属性で指定される順序と同じとする。xsl:attribute-set 要素に use-attribute-sets 属性を使

用することが,属性集合に対して直接的又は間接的にそれ自体を使用させる場合は,誤りとする。

属性集合は,リテラル結果要素に xsl:use-attribute-sets 属性を指定することによって,使用することもで

きる。xsl:use-attribute-sets 属性の値は,空白で区切った属性集合の名前のリストとする。xsl:use-attribute-sets

属性は,追加規則をもつ xsl:element の use-attribute-sets 属性と同じ効果がある。この追加規則では,リテラ

ル結果要素自体に関して指定される属性が,すべての実際の xsl:attribute 要素の前だが,xsl:use-attribute-sets

属性によって意味されるすべての xsl:attribute 要素の後に,xsl:attribute 要素によって指定されたかのように

取り扱われる。したがって,リテラル結果要素の場合,xsl:use-attribute-sets 属性において名前付けされた

属性集合からの属性は,最初に,属性においてリストされた順に追加され,次にリテラル結果要素に指定

される属性が追加され,最後に xsl:attribute 要素が指定するすべての属性が追加される。属性を要素に追加


26

X 4169

:2007

することは,要素の既存の属性を同じ名前で置き換えるため,これは,属性集合において指定される属性

が,リテラル結果要素自体に指定される属性によって上書きされ得ることを意味する。

xsl:attribute-set

要素における各 xsl:attribute 要素の中のテンプレートは,属性集合が使用されるたびにイ

ンスタンス化される。この場合のインスタンス化には,use-attribute-sets 属性又は xsl:use-attribute-sets 属性

をもつ要素をインスタンス化するために使用される場合と同じ現ノード及び現ノードリストが使用される。

しかし,どの変数束縛が見えるかを決定するのは,use-attribute-sets 属性又は xsl:use-attribute-sets 属性をも

つ要素のスタイルシート内の位置ではなく,xsl:attribute 要素のスタイルシート内の位置となる(箇条 11

参照)

。したがって,最上位の xsl:variable 要素及び xsl:param 要素によって宣言される変数及びパラメタだ

けが,見える。

次の例は,名前付き属性集合 title-style を生成し,それをテンプレート規則において使用する。

<xsl:template match="chapter/heading">

  <fo:block quadding="start" 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>

同一の展開名をもつ属性集合の複数定義は,併合される。

インポート優先順位が高い定義からの属性は,

インポート優先順位がそれよりも低い定義からの属性に優先する。同一の展開名及び等しいインポート優

先順位をもち,同一の属性を含む二つの属性集合が存在する場合,その属性をも包むもっと高いインポー

ト優先順位をもつ属性集合の定義が存在しなければ,誤りとする。XSLT プロセサは,誤りを通知しても

よい。誤りを通知しない場合,最も高いインポート優先順位をもつ属性を指定する定義の中から,スタイ

ルシートにおいて最後に指定されたものを選択することによって,誤りから回復しなければならない。属

性集合の属性がどこで指定されたかは,属性を属性集合に併合することだけに関係する。属性集合が使用

されるとき,それに区別はない。xsl:attribute 要素の use-attribute-sets 属性に出現するそれぞれの属性集合名

について,その名前をもつ属性集合のすべての定義は use-attribute-sets 属性が xsl:attribute 子要素の等価な

シーケンスに置き換えられる前に併合されなければならない。xsl:attribute-set 要素のどの use-attribute-sets

属性も,

その xsl:attribute-set 要素が同じ展開名をもつ他の xsl:attribute-set 要素と併合される前に,

xsl:attribute

要素の等価なシーケンスと置き換えられなければならない。同じ展開名をもつ xsl:attribute-set 要素が併合

された場合,use-attribute-sets 属性を置き換えるために追加された xsl:attribute 子要素はどれも,ちょうどそ

れらが元々スタイルシートで子要素として規定されていたかのように扱われる。

7.2

テキストの生成

テンプレートは,テキストノードを含むこともできる。3.4 で規定されるとおり,空白を削除した後で残

るテンプレートの中の各テキストノードは,結果木に同一の文字列値をもつテキストノードを生成するこ

とになる。結果木において隣接するテキストノードは,自動的に併合される。

テキストは,木レベルで処理されることに注意されたい。したがって,テンプレートの中の&lt;のマー

ク付けは,<という文字を含むテキストノードによって,スタイルシート木に表示されることになる。こ

れは,<という文字を含む結果木のテキストノードを生成し,それが,XML 文書として結果木が表現され


27

X 4169

:2007

るときに,&lt;のマーク付け(又は等価な文字参照)によって表示される。ただしこれは,16.4 に示され

るとおり,出力エスケープが無効化されていない場合に限る。

<!-- Category: instruction -->

<xsl:text

    disable-output-escaping = "yes" | "no">

  <!-- Content: #PCDATA -->

</xsl:text>

リテラルデータ文字は,xsl:text 要素の中にラップされてもよい。このラッピングは,どの空白文字が削

除されるか(3.4 参照)を変更してもよいが,XSLT プロセサによってその後文字がどのように扱われるか

には影響しない。

注記 XSLT は,xml:lang 属性及び xml:space 属性を特別には扱わない。特に次の点に注意する。

a)

結果木で必要とされる xml:lang 属性又は xml:space 属性を明示的に生成することは,スタイ

ルシートの作成者の責任とする。

b) XSLT

名前空間の要素に xml:lang 属性又は xml:space 属性を指定することは,xml:lang 属性又

は xml:space 属性が結果木に現れる原因にはならない。

7.3

処理命令の生成

<!-- Category: instruction -->

<xsl:processing-instruction

    name = { ncname }>

  <!-- Content: template -->

</xsl:processing-instruction>

xsl:processing-instruction

要 素 は , イ ン ス タ ン ス 化 さ れ て , 処 理 命 令 ノ ー ド を 生 成 す る 。

xsl:processing-instruction

要 素 の 内 容 は , 処 理 命 令 ノ ー ド の 文 字 列 値 に 関 す る テ ン プ レ ー ト と す る 。

xsl:processing-instruction

要素は,処理命令ノードの名前を指定する必す(須)の name 属性をもつ。name

属性の値は,属性値テンプレートとして解釈される。

次に例を示す。

<xsl:processing-instruction name="xml-stylesheet">href="book.css" type="text/css"</xsl:processing-instruction>

これは,次の処理命令を生成する。

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

name

属性をインスタンス化する結果生じた文字列が,

NCName

でも PITarget でもない場合,

誤りとする。

XSLT

プロセサは,誤りを通知してもよい。誤りを通知しない場合,処理命令を結果木に追加しないこと

によって,誤りから回復しなければならない。

注記  これは,xsl:processing-instruction が XML 宣言を出力するために使用できないことを意味する。

その代わりに,xsl:output 要素を使用することが望ましい(箇条 16 参照)

xsl:processing-instruction

の内容をインスタンス化することが,テキストノード以外のノードを生成する

場合,誤りとする。XSLT プロセサは,誤りを通知してもよい。誤りを通知しない場合は,問題のあるノ

ードをその内容とともに無視することによって,誤りから回復しなければならない。

xsl:processing-instruction

の内容をインスタンス化した結果が?>という文字列を含む場合,誤りとする。

XSLT

プロセサは,誤りを通知してもよい。誤りを通知しない場合は,後に>が付くすべての?の発生の後


28

X 4169

:2007

にスペースを 1 個挿入することによって,誤りから回復しなければならない。

7.4

コメントの生成

<!-- Category: instruction -->

<xsl:comment>

  <!-- Content: template -->

</xsl:comment>

xsl:comment

要素はインスタンス化されて,結果木においてコメントノードを生成する。xsl:comment 要

素の内容は,コメントノードの文字列値に関するテンプレートとする。

次に例を示す。

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

これは,次のコメントを生成する。

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

xsl:comment

の内容のインスタンス化が,テキストノード以外のノードを生成する場合は,誤りとする。

XSLT

プロセサは,誤りを通知してもよい。誤りを通知しない場合,問題のあるノードをその内容ととも

に無視することによって,誤りから回復しなければならない。

xsl:comment

の内容をインスタンス化した結果が,文字列--を含むか,-で終わる場合は,誤りとする。

XSLT

プロセサは,誤りを通知してもよい。誤りを通知しない場合,もう一つの-が後につくすべての-の後,

又はコメントの末尾にあるすべての-の後にスペースを 1 個挿入することによって,誤りから回復しなけれ

ばならない。

7.5

コピー

<!-- Category: instruction -->

<xsl:copy

  use-attribute-sets = qnames>

  <!-- Content: template -->

</xsl:copy>

xsl:copy

要素は,現ノードをコピーする簡単な方法を提供する。xsl:copy 要素をインスタンス化すること

は,現ノードのコピーを生成する。現ノードの名前空間ノードも自動的にコピーされるが,ノードの属性

及び子は自動的にはコピーされない。xsl:copy 要素の内容は,生成されるノードの属性及び子に関するテ

ンプレートとする。内容は,属性又は子をもつことができる型のノード(つまり,ルート及び要素ノード)

に限ってインスタンス化される。

xsl:copy

要素は,use-attribute-sets 属性(7.1.4 参照)をもってよい。これは,要素ノードをコピーすると

きだけ,使用される。

結果木のルートは暗黙的に生成されるので,ルートは特別に扱われる。現ノードがルートである場合,

xsl:copy

はルートを生成せず,内容テンプレートを用いるだけとする。

例えば,恒等変換は,xsl:copy を用いて次のとおり書かれる。

<xsl:template match="@*|node()">

  <xsl:copy>

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

  </xsl:copy>


29

X 4169

:2007

</xsl:template>

現ノードが属性である場合,現ノードと同じ名前をもつ属性を生成するために xsl:attribute を使用するこ

とが誤りとなると,xsl:copy を使用することも誤りとする(7.1.3 参照)

現ノードが名前空間ノードの場合,それをコピーすることは,結果木においてそれを含むノードに名前

空間ノードを追加する。この追加されるノードが要素でない場合,誤りとする。実装は誤りを通知しても

よいし,又は名前空間ノードを無視してもよい。要素に子が追加された後,又は属性が追加された後に名

前空間ノードを追加することは誤りとする。実装は誤りを追加してもよいし,又は名前空間ノードを無視

してもよい。要素が同じ名前の名前空間ノードを既にもっている場合に,名前区間ノードを追加すること

は誤りとする。ただし,両方の名前空間ノードが同じ文字列値をもつ場合はこの限りではない。その場合

は重複が無視される。名前空間ノードが null 名前をもち,要素が null 名前空間 URI をもつとき,名前空間

ノードを要素に追加することは誤りとする。

次の例は,どのように xml:lang 属性がソースから結果へ簡単にコピーされるかを示す。スタイルシート

が,次の名前付きテンプレートを定義しているとする。

<xsl:template name="apply-templates-copy-lang">

 <xsl:for-each select="@xml:lang">

   <xsl:copy/>

 </xsl:for-each>

 <xsl:apply-templates/>

</xsl:template>

このとき,xml:lang 属性をコピーするには,次を実行すればよい。

<xsl:call-template name="apply-templates-copy-lang"/>

次の実行は行わない。

<xsl:apply-templates/>

7.6

生成テキストの計算

テンプレート内では,xsl:value-of 要素は,例えば,ソース木からテキストを抽出したり,変数の値を挿

入することによって,生成されたテキストを計算するために利用できる。xsl:value-of 要素は,select 属性

の値として指定される式を用いて,これを実行する。波括弧({})で式を囲むことによって,リテラル結

果要素の属性値の中で式も使用できる。

7.6.1

xsl:value-of

によるテキストの生成

<!-- Category: instruction -->

<xsl:value-of

    select = string-expression

    disable-output-escaping = "yes" | "no" />

xsl:value-of

要素は,インスタンス化されて,結果木にテキストノードを生成する。必す(須)の select

属性は,式とする。この式は評価され,結果のオブジェクトは,string 関数への呼出しによるかのように,

文字列に変換される。文字列は,生成されるテキストノードの文字列値を指定する。文字列が空であると,

テキストノードは生成されないことになる。生成されたテキストノードは,隣接するすべてのテキストノ

ードと併合される。

xsl:copy-of

要素は,ノード集合を,それを文字列に変換することなく,結果木にコピーするために使用


30

X 4169

:2007

できる(11.3 参照)

例えば,次は,given-name 属性及び family-name 属性をもつ person 要素から HTML の段落を生成する。

段落は,後にスペースが付く現ノードの given-name 属性の値と,現ノードの family-name 属性の値とを含

むことになる。

<xsl:template match="person">

  <p>

   <xsl:value-of select="@given-name"/>

   <xsl:text> </xsl:text>

   <xsl:value-of select="@family-name"/>

    </p>

</xsl:template>

もう一つの例として,次は,given-name 及び family-name の子要素をもつ person 要素から HTML の段落

を生成する。段落は,後にスペースが付く現ノードの最初の given-name 子要素の文字列値と,現ノードの

最初の family-name 子要素の文字列値とを含む。

<xsl:template match="person">

  <p>

   <xsl:value-of select="given-name"/>

   <xsl:text> </xsl:text>

   <xsl:value-of select="family-name"/>

    </p>

</xsl:template>

次の例は,手続きのセキュリティレベルを含む段落を各 procedure 要素の前に置く。手続きに適用される

セキュリティレベルは,procedure 要素又はその祖先要素の security 属性によって決定されることを仮定す

る。複数の要素が security 属性をもつとき,セキュリティレベルはその手続きに最も近い要素によって決

定されることも仮定する。

<xsl:template match="procedure">

  <fo:block>

    <xsl:value-of select="ancestor-or-self::*[@security][1]/@security"/>

  </fo:block>

  <xsl:apply-templates/>

</xsl:template>

7.6.2

  属性値テンプレート

リテラル結果要素の属性などの,属性値テンプレートとして解釈される属性値においては,波括弧({})

で式を囲むことによって,式を使用できる。属性値テンプレートは,式とそれを囲む波括弧とを式の評価

結果で置き換え,結果オブジェクトを string 関数への呼出しによってこのように文字列に変換することに

よって,インスタンス化される。波括弧は,属性が属性値テンプレートとして解釈されるものとして特に

明示されなければ,XSLT スタイルシートの属性値においては認識されない。要素構文のまとめでは,こ

れらの属性の値は,波括弧で囲まれる。

注記  すべての属性が,属性値テンプレートとして解釈されるわけではない。その値が式又はパター

ンである属性,最上位要素の属性及び名前付けされた XSLT オブジェクトを参照する属性は,


31

X 4169

:2007

属性値テンプレートとして解釈されない。さらに,xmlns 属性は,属性値テンプレートとして

解釈されない。そうすることは,XML 名前空間勧告に適合しない。

次の例は,ソースの中の photograph 要素から img 結果要素を生成する。img 要素の src 属性の値は,

image-dir

変数と photograph 要素の href 子要素の文字列値とから計算される。

img

要素の width 属性の値は,

photograph

要素の size 子要素の width 属性の値から計算される。

<xsl:variable name="image-dir">/images</xsl:variable>

<xsl:template match="photograph">

<img src="{$image-dir}/{href}" width="{size/@width}"/>

</xsl:template>

次のソースがあると,

<photograph>

  <href>headquarters.jpg</href>

  <size width="300"/>

</photograph>

結果は次のとおりとなる。

<img src="/images/headquarters.jpg" width="300"/>

属性値テンプレートがインスタンス化されると,式の外側の二重の左又は右の波括弧は,一重の波括弧

に置換されることになる。右の波括弧が,二つ目の右波括弧が続くことなく,式の外側の属性値テンプレ

ートの中に出現する場合,誤りとする。式中のリテラル内にある右波括弧は,式を終了するものとして認

識されない。

波括弧は,式の内部で再帰的に認識されない。次に例を示す。

<a href="#{id({@ref})/title}">

これは,許容されない。代わりに,簡単に次のとおりとする。

<a href="#{id(@ref)/title}">

7.7

番号付け

<!-- Category: instruction -->

<xsl:number

    level = "single" | "multiple" | "any"

  count = pattern

    from = pattern

    value = number-expression

  format = { string }

  lang = { nmtoken }

    letter-value = { "alphabetic" | "traditional" }

  grouping-separator = { char }

  grouping-size = { number } />

xsl:number

要素は,結果木にフォーマットした番号を挿入するために用いられる。挿入される番号は,

式によって指定してよい。value 属性は,式を含む。式は評価され,結果オブジェクトは,number 関数の

呼出しによるかのように,数値に変換される。数値が NaN,無限大又は 0.5 より小さいとき誤りとする。


32

X 4169

:2007

XSLT

プロセサは誤りを通知してもよい。誤りを通知しない場合は,string 関数の呼び出しによるかのよう

に数値を文字列に変換し,結果の文字列を結果木に挿入することによって,誤りから回復しなければなら

ない。そうでなければ,数値は整数に丸められ,7.7.1 で指定される属性を用いて,文字列に変換される。

この文脈では,これらの属性のそれぞれの値は,属性値テンプレートとして解釈される。変換後,結果の

文字列は,結果木に挿入される。例えば,次の例は,ソートされるリストを番号付けしている。

<xsl:template match="items">

  <xsl:for-each select="item">

    <xsl:sort select="."/>

        <p>

      <xsl:number value="position()" format="1. "/>

            <xsl:value-of select="."/>

        </p>

  </xsl:for-each>

</xsl:template>

value

属性が指定されない場合は,xsl:number 要素が,ソース木の現ノードの位置に基づいて番号を挿入

する。次の属性は,現ノードの番号付けの方法を制御する。

a) level

属性は,ソース木のどのレベルが考慮されるかを指定する。それは,single,multiple 又は any の

値をもつ。デフォルト値は,single とする。

b) count

属性は,どのノードがそのレベルでカウントされるのが望ましいかを指定するパターンとする。

count

属性が指定されない場合,現ノードと同じノード型をもつすべてのノードに一致するパターンが

デフォルトとなり,現ノードが展開名をもつ場合,現ノードと同じ展開名をもつあらゆるノードにマ

ッチするパターンがデフォルトとなる。

c) from

属性は,カウントの開始位置を指定するパターンとする。

さらに,7.7.1 で指定される属性は,value 属性が指定される場合と同様に,数値から文字列への変換に

使用する。

xsl:number

要素はまず,level 属性,count 属性及び from 属性を用いて,正の整数のリストを構成する。

a) level="single"

のとき,それは,count パターンにマッチする ancester-or-self 軸における最初のノードま

でさかのぼ(遡)り,count パターンにマッチする祖先の前の兄弟の数に 1 を加えたものを含む,長さ

1

のリストを構成する。これらの祖先がない場合は,それは空のリストを構成する。from 属性が指定

されると,検索される祖先は,from パターンにマッチする最も近い祖先の子孫であるものだけとなる。

前の兄弟は,ここでは preceding-sibling 軸をもつものと同じ意味をもつ。

b) level="multiple"

のとき,それは,要素そのものが最後にくる文書順に並んだ現ノードのすべての祖先

のリストを構成する。次に,リストから count パターンにマッチするノードを選択する。それから,

count

パターンにマッチするそのノードの前の兄弟の数に 1 を加えたものに,リストの中の各ノードを

マッピングする。from 属性が指定されない場合は,検索される祖先は,from パターンにマッチする最

も近い祖先の子孫であるものだけとなる。前の兄弟は,ここでは preceding-sibling 軸をもつものと同じ

意味をもつ。

c) level="any"

のとき,それは,count パターンにマッチし,次の集合に属するノードの数を含む,長さ 1

のリストを構成する。その集合は,現ノードと,すべての名前空間ノード及び属性ノードを除いて文

書順に現ノードの前にある文書のすべてのレベルのすべてのノードとを含む(言い換えると,preceding


33

X 4169

:2007

軸及び ancestor-or-self 軸のメンバの和集合。

。マッチするノードが一つもない場合,空のリストを構

成する。from 属性が指定されると,from パターンに一致する現ノードの前で,最初のノードの後のノ

ードだけが,考慮される。

数値のリストは,7.7.1 で指定される属性を用いて,文字列に変換される。この文脈では,これらの属性

のそれぞれの値は,属性値テンプレートとして解釈される。変換後,結果のストリングは,結果木に挿入

される。

次の例は,順序付きリストの項目を番号付けする。

<xsl:template match="ol/item">

  <fo:block>

    <xsl:number/><xsl:text>. </xsl:text><xsl:apply-templates/>

  </fo:block>

<xsl:template>

次の二つの規則は,title 要素を番号付けする。これは,一連の付録を後に付けた一連の章を含む文書を

意図している。そこでは,章(chapter)も付録(appendix)も節(section)を含み,節は,小節(subsection)を含む。

章は,1,2,3 と番号付けされ,付録は,A,B,C と番号付けされる。章の中の節は,1.1,1.2,1.3 と番

号付けされ,付録の中の節は,A.1,A.2,A.3 と番号付けされる。

<xsl:template match="title">

  <fo:block>

     <xsl:number level="multiple"

                                  count="chapter|section|subsection"

                                  format="1.1 "/>

     <xsl:apply-templates/>

  </fo:block>

</xsl:template>

<xsl:template match="appendix//title" priority="1">

  <fo:block>

     <xsl:number level="multiple"

                                  count="appendix|section|subsection"

                                  format="A.1 "/>

     <xsl:apply-templates/>

  </fo:block>

</xsl:template>

次の例は,章の中の備考(note)に連続的に番号付けを行う。

<xsl:template match="note">

  <fo:block>

     <xsl:number level="any" from="chapter" format="(1) "/>

     <xsl:apply-templates/>

  </fo:block>

</xsl:template>

次の例は,3 部分のラベルをもつ HTML の H4 要素に番号付けを行う。


34

X 4169

:2007

<xsl:template match="H4">

 <fo:block>

   <xsl:number level="any" from="H1" count="H2"/>

   <xsl:text>.</xsl:text>

   <xsl:number level="any" from="H2" count="H3"/>

   <xsl:text>.</xsl:text>

   <xsl:number level="any" from="H3" count="H4"/>

   <xsl:text> </xsl:text>

   <xsl:apply-templates/>

 </fo:block>

</xsl:template>

7.7.1

数値から文字列への変換の属性

次の属性は,数値リストの文字列への変換を制御するために使用される。数値は 0 よりも大きい整数と

する。属性は,すべてオプションとする。

主な属性は,format とする。format 属性のデフォルト値は,1 とする。format 属性は,各トークンが英数

文字の最大シーケンス又は非英数文字の最大シーケンスである,トークンのシーケンスに分割される。英

数文字とは,Nd,Nl,No,Lu,Ll,Lt,Lm 又は Lo の Unicode 分類をもつどの文字をも意味する。英数文

字のトークン(フォーマットトークン)は,リストの各数値に使用されるフォーマットを指定する。最初

のトークンが非英数文字のトークンであると,構成される文字列は,そのトークンで始まる。最後のトー

クンが非英数文字であると,構成される文字列は,そのトークンで終わる。二つのフォーマットトークン

の間に現れる非英数文字のトークンは,リストの数値を結合するために使用される分離子のトークンとす

る。  n 番目のフォーマットトークンは,リストの n 番目の数値をフォーマットするために使用される。フ

ォーマットトークンよりも多くの数値が存在すると,最後のフォーマットトークンが残りの数値をフォー

マットするために使用される。フォーマットトークンがない場合,すべての数値をフォーマットするため

に,1 のフォーマットトークンが使用される。フォーマットトークンは,数値 1 を表示するために使用さ

れる文字列を指定する。2 番目以降の各数値は,その数値をフォーマットするために使用されるフォーマ

ットトークンの前にある分離子のトークンによって,前の数値と分離される。または,分離子のトークン

がない場合,.(ピリオド文字)によって分離される。

フォーマットトークンは,HTML4.0 における OL 要素の type 属性に許容される値のスーパセットとし,

次のとおり解釈される。

a)

最後の文字が,

(Unicode 文字特性データベースの中で指定される)10 進数の値 1 をもち,その前の文

字の Unicode の値が最後の文字の Unicode の値よりも 1 だけ小さいどのトークンも,数値の 10 進数表

現を生成する。そこでは,各数値は,少なくともフォーマットトークンと同じ長さとする。したがっ

てフォーマットトークン 1 は,シーケンス 1 2 ... 10 11 12 ...を生成し,フォーマットトークン 01 は,

シーケンス 01 02 ... 09 10 11 12 ... 99 100 101 を生成する。

b)

フォーマットトークン A は,シーケンス A B C ... Z AA AB AC...を生成する。

c)

フォーマットトークン a は,シーケンス a b c ... z aa ab ac...を生成する。

d)

フォーマットトークン i は,シーケンス i ii iii iv v vi vii viii ix x ...を生成する。

e)

フォーマット I は,シーケンス I II III IV V VI VII VIII IX X ...を生成する。

f)

他のどのフォーマットトークンも,そのトークンで開始する番号付けシーケンスを示す。実装がその


35

X 4169

:2007

トークンで始まる番号付けシーケンスをサポートしないときは,1 のフォーマットトークンを使用し

なければならない。

アルファベットのシーケンスで番号付けするとき,lang 属性が,どの言語のアルファベットを使用する

かを指定する。それは,XML (JIS X 4159)の xml:lang と同じ範囲の値をもつ。lang 値が指定されないとき,

システム環境から言語を決定するのが望ましい。実装者は,番号付けをサポートする言語を文書化するこ

とが望ましい。

注記  実装者は,特定の言語でどのように番号付けするかを仮定せず,サポートしたい言語を適切に

調査することが望ましい。多くの言語の番号付け規則は,英語とは大きく異なる。

letter-value

属性は,文字を使用する番号付けのシーケンス間のあいまいさをなくす。多くの言語におい

ては,文字を使用する番号付けのシーケンスが通常二つある。一つの番号付けのシーケンスは,アルファ

ベット順で数値を文字に割り当て,もう一つは,その言語の伝統的な別の方法で,数値を各文字に割り当

てる。英語では,これらは,フォーマットトークン a 及び i によって指定される番号付けシーケンスに対

応する。ある言語では,各シーケンスの最初のメンバが同一であるため,フォーマットトークンだけでは

あいまいになる。alphabetic の値は,アルファベット順を指定する。traditional の値は,他のシーケンスを

指定する。letter-value 属性が指定されないとき,どのようにあいまいさを解決するかは実装依存となる。

注記  二つの適合 XSLT プロセサが,一つの数値を正確に同一の文字列に変換しないことがあり得る。

ある XSLT プロセサは,幾つかの言語をサポートしなくてもよい。さらに,xsl:number の属性

によって指定されないどんな特定の言語に関しても,変換を実行する方法において可能なバリ

エーションが存在してもよい。XSLT の将来の版は,これらのバリエーションの制御を与える

追加属性を提供し得る。実装者は,これに関する xsl:number の実装固有の名前空間属性を用い

てもよい。

grouping-separator

属性は,10 進の番号付けシーケンスにおけるグループ化(例えば千の)分離子として

用いる分離子を与え,オプションの grouping-size は,グループ化のサイズ(通常は 3)を指定する。例え

ば , grouping-separator=" , " 及 び grouping-size="3" は , 1 , 000 , 000 と い う 形 式 の 数 値 を 生 成 す る 。

grouping-separator

属性及び grouping-size 属性のうち一つだけが指定されると,その指定は無視される。

変換規定の例を次に示す。

a) format="&#x30A2;"

は,片仮名の番号付けを指定する。

b) format="&#x30A4;"

は,

“イロハ”順での片仮名の番号付けを指定する。

c) format="&#x0E51;"

は,タイ数字を使用した番号付けを指定する。

d) format="&#x05D0;"

letter-value="traditional"

は,

“伝統的な”ヘブライ語の番号付けを指定する。

e) format="&#x10D0;"

letter-value="traditional"

は,グルジア語の番号付けを指定する。

f) format="&#x03B1;"

letter-value="traditional"

は,

“古代”ギリシャ語の番号付けを指定する。

g) format="&#x0430;"

letter-value="traditional"

は,

“古代”スラブ語の番号付けを指定する。


36

X 4169

:2007

8

繰返し

<!-- Category: instruction -->

<xsl:for-each

    select = node-set-expression>

  <!-- Content: (xsl:sort*, template) -->

</xsl:for-each>

結果が既知で通常の構造をもつとき,選択したノードに関してテンプレートを直接指定できることは,

役に立つ。xsl:for-each 命令は,テンプレートを含む。そのテンプレートは,select 属性が指定する式によ

って選択された各ノードに関してインスタンス化される。select 属性は必す(須)とする。式は,ノード

集合に対して評価しなければならない。テンプレートは,現ノードとして選択されたノード,及び現ノー

ドリストとして選択されたすべてのノードのリストを用いて,インスタンス化される。ソートの指定がな

い場合は,ノードは文書順に処理される(箇条 10 参照)

例えば,次の構造をもつ XML 文書を考える。

<customers>

    <customer>

    <name>...</name>

    <order>...</order>

    <order>...</order>

  </customer>

    <customer>

    <name>...</name>

    <order>...</order>

    <order>...</order>

  </customer>

</customers>

次は,各 customer 要素に対する行をもつ表を含む HTML 文書を生成する。

<xsl:template match="/">

    <html>

        <head>

      <title>Customers</title>

        </head>

        <body>

            <table>

                <tbody>

          <xsl:for-each select="customers/customer">

                        <tr>

                            <th>

                                <xsl:apply-templates select="name"/>

                            </th>


37

X 4169

:2007

                            <xsl:for-each select="order">

                                <td>

                                    <xsl:apply-templates/>

                                </td>

                            </xsl:for-each>

                        </tr>

                    </xsl:for-each>

        </tbody>

            </table>

        </body>

  </html>

</xsl:template>

9

条件付き処理

XSLT

には,テンプレートにおいて条件付き処理を実行できる二つの命令,xsl:if 及び xsl:choose がある。

xsl:if

命令は,単純な if-then 条件を提供する。xsl:choose 命令は,幾つもの可能性がある場合に,一つの選

択肢を選ぶ機能を提供する。

9.1

xsl:if

による条件付き処理

<!-- Category: instruction -->

<xsl:if

    test = boolean-expression>

  <!-- Content: template -->

</xsl:if>

xsl:if

要素は,test 属性をもつ。この属性は,式を指定する。内容は,テンプレートとする。式は評価さ

れ,boolean 関数への呼出しを用いたように,結果オブジェクトが論理値に変換される。結果が真である場

合,内容のテンプレートはインスタンス化される。そうでない場合は,何も生成されない。次の例では,

名前のグループの中の名前が,カンマで分離されたリストとしてフォーマットされる。

<xsl:template match="namelist/name">

  <xsl:apply-templates/>

  <xsl:if test="not(position()=last())">

, </xsl:if>

</xsl:template>

次の例では,表の行を 1 行おきに黄色に着色する。

<xsl:template match="item">

    <tr>

    <xsl:if test="position() mod 2 = 0">

       <xsl:attribute name="bgcolor">yellow</xsl:attribute>

        </xsl:if>

    <xsl:apply-templates/>

  </tr>


38

X 4169

:2007

</xsl:template>

9.2

xsl:choose

による条件付き処理

<!-- Category: instruction -->

<xsl:choose>

  <!-- Content: (xsl:when

+, xsl:otherwise?) -->

</xsl:choose>

<xsl:when

    test = boolean-expression>

  <!-- Content: template -->

</xsl:when>

<xsl:otherwise>

  <!-- Content: template -->

</xsl:otherwise>

xsl:choose

要素は,多くの可能な選択肢の中から一つを選択する。この要素は,xsl:when 要素のシーケン

ス,及びその後にオプションとして続く xsl:otherwise 要素から構成される。各 xsl:when 要素は,単一の属

性 test をもち,この属性は,式を指定する。xsl:when 要素及び xsl:otherwise 要素の内容は,テンプレート

とする。xsl:choose 要素が処理されると,各 xsl:when 要素は,式を評価し,その結果のオブジェクトを,

boolean

関数への呼出しを行ったように論理値に変換することによって,順にテストされる。テスト結果が

真である最初の xsl:when 要素だけの内容が,インスタンス化される。xsl:when に真のものがなければ,

xsl:otherwise

要素の内容がインスタンス化される。すべての xsl:when 要素が真でなく,xsl:otherwise 要素が

存在しないときは,何も生成されない。

次の例は,順序付きリストがネストされる深さに従って,アラビア数字,英字又はローマ数字を用いる

順序付きリストの項目を列挙する。

<xsl:template match="orderedlist/listitem">

  <fo:list-item indent-start='2pi'>

    <fo:list-item-label>

      <xsl:variable name="level"

                                        select="count(ancestor::orderedlist) mod 3"/>

            <xsl:choose>

                <xsl:when test='$level=1'>

                    <xsl:number format="i"/>

                </xsl:when>

                <xsl:when test='$level=2'>

                    <xsl:number format="a"/>

                </xsl:when>

                <xsl:otherwise>

                    <xsl:number format="1"/>


39

X 4169

:2007

                </xsl:otherwise>

            </xsl:choose>

      <xsl:text>. </xsl:text>

    </fo:list-item-label>

    <fo:list-item-body>

      <xsl:apply-templates/>

    </fo:list-item-body>

  </fo:list-item>

</xsl:template>

10

ソート

<xsl:sort

  select = string-expression

  lang = { nmtoken }

    data-type = { "text" | "number" | qname-but-not-ncname }

    order = { "ascending" | "descending" }

    case-order = { "upper-first" | "lower-first" } />

ソートは,xsl:apply-templates 要素又は xsl:for-each 要素の子として xsl:sort 要素を追加することによって

指定される。最初の xsl:sort 子要素は,1 次ソートキーを指定し,2 番目の xsl:sort 子要素は,2 次ソートキ

ーを指定し,以降同様とする。xsl:apply-templates 要素又は xsl:for-each 要素が,一つ以上の xsl:sort の子を

もつとき,選択されたノードを文書順に処理する代わりに,それは,指定されたソートキーに従ってノー

ドをソートし,ソート順にそれらを処理する。xsl:for-each 要素で使用されるとき,xsl:sort 要素は最初に現

れなければならない。テンプレートが xsl:apply-templates 及び xsl:for-each によってインスタンス化される

とき,現ノードリストは,ソート順に処理されるノードの完全リストで構成される。

xsl:sort

は,値が式である select 属性をもつ。処理対象の各ノードについては,式は,現ノードとしての

ノードと,現ノードリストとして文書順に処理されるノードの完全リストとを用いて,評価される。結果

オブジェクトは,string 関数への呼出しを行ったように,文字列に変換される。この文字列は,そのノー

ドのソートキーとして使用される。select 属性のデフォルト値は.であり,このため,現ノードの文字列値

が,ソートキーとして使用されることになる。

この文字列は,そのノードに関するソートキーとして動作する。xsl:sort に関する次に示すオプションの

属性は,ソートキーのリストをどのようにソートするかを制御する。これらの属性のすべての値は,属性

値テンプレートとして解釈される。

a) order

は,文字列を昇順にソートするのが望ましいか,又は降順でソートするのが望ましいかを指定す

る。ascending は昇順を指定し,descending は降順を指定する,デフォルト値は ascending とする。

b) lang

は,ソートキーの言語を指定する。それは,xml:lang (JIS X 4159)と同じ範囲の値をもつ。lang 値

が指定されないとき,システム環境から言語を決定するのが望ましい。

c) data-type

は,文字列のデータ型を指定する。次の値を使用できる。

1) text

は,ソートキーが,lang が指定する言語に関して文化的に正しい方式で,辞書編集的にソート

されることを指定する。


40

X 4169

:2007

2) number

は,ソートキーが数値に変換され,数値に従ってソートされることを指定する。ソートキー

は number 関数への呼出しを行ったように,数値に変換される。lang 属性は,無視される。昇順で

は NaN はすべての他の数値に先行し,降順ではすべての他の数値より後になる。

3)

接頭辞をもつ QName は,2.4 で記述されるとおり,展開名に展開される。展開名は,データ型を識

別する。この場合の振る舞いは,この文書で規定されない。

デフォルト値は,text とする。

注記 XSL 作業グループは,XSLT の将来の版が,XML スキーマを使ってこの属性にさらに値を

定義することを計画している。

d) case-order

は,値 upper-first 又は lower-first をもつ。data-type="text"の場合に,これが適用され,大文

字を小文字の前にソートするか,又はその逆かをそれぞれ指定する。例えば,lang="en"の場合,

case-order="upper-first"

を指定すると昇順では A a B b とソートされ,case-order="lower-first"を指定する

と昇 順 では a A b B とソー ト され る 。降 順 では 結果 は 逆転 す る。 例 えば ,lang="en" の 場 合,

case-order="upper-first"

を指定すると,降順では bBaA とソートされる。デフォルト値は,言語に依存

する。

注記 1  二つの適合する XSLT プロセサが,厳密に同一の結果をソートしないこともあり得る。あ

る XSLT プロセサは,幾つかの言語をサポートしなくてもよい。さらに,xsl:sort の属性が

指定しない特定の言語のソートにおいて,バリエーションがあり得る。例えば,日本語に

おいて,平仮名又は片仮名のどちらを先にソートするかというバリエーションがある。

XSLT

の将来の版は,これらのバリエーションの制御を与えるために,追加属性を提供し

てもよい。実装者は,これに関する xsl:sort の実装固有の名前空間属性を用いてもよい。

注記 2  実装者が,国際化されたソートの情報に関する[UNICODE TR10]を調査することを推奨す

る。

ソートは安定していなければならない。ノードのソート済みリストにおいて,すべて等しいとされるソ

ートキーをもつどの部分リストも文書順になければならない。

例えば,従業員データベースが次の形式をもつとする。

<employees>

  <employee>

        <name>

      <given>James</given>

      <family>Clark</family>

        </name>

    ...

  </employee>

</employees>

名前によってソートされる従業員のリストは,次を用いて生成される。

<xsl:template match="employees">

    <ul>

    <xsl:apply-templates select="employee">

      <xsl:sort select="name/family"/>

      <xsl:sort select="name/given"/>


41

X 4169

:2007

    </xsl:apply-templates>

  </ul>

</xsl:template>

<xsl:template match="employee">

  <li>

    <xsl:value-of select="name/given"/>

    <xsl:text> </xsl:text>

    <xsl:value-of select="name/family"/>

  </li>

</xsl:template>

11

変数及びパラメタ

<!-- Category: top-level-element -->

<!-- Category: instruction -->

<xsl:variable

    name = qname

  select = expression>

  <!-- Content: template -->

</xsl:variable>

<!-- Category: top-level-element -->

<xsl:param

    name = qname

  select = expression>

  <!-- Content: template -->

</xsl:param>

変数とは,ある値に束縛されてもよい名前とする。変数が束縛される値,すなわち,変数の値は,式が

返すことのできる型のいずれのオブジェクトでも可能とする。変数を束縛するために使用できる要素が二

つ存在する。それらは,xsl:variable 及び xsl:param とする。xsl:param 変数に指定される値は,束縛のデフ

ォルト値だけとする点を,両者の相違点とする。xsl:param 要素が出現するテンプレート又はスタイルシー

トが呼び出される場合,デフォルト値の代わりに,使用するパラメタを渡してもよい。

xsl:variable

及び xsl:param の両方とも,必す(須)の name 属性をもつ。この属性は,変数の名前を指定

する。name 属性の値は,QName であって,これは,2.4 で示されるとおりに展開される。

これら変数束縛要素をどのように用いても,束縛が見えているスタイルシート木の範囲が存在する。式

の有効範囲内にある変数束縛の集合は,式がスタイルシートに出現する時点で見えている束縛から構成さ

れる。

11.1

結果木素片

変数は,付加的なデータ型を式言語に導入する。この付加的なデータ型を結果木素片と呼ぶ。四つの基

本 Xpath データ型である string,number,boolean 又は node-set の一つの代わりに結果木素片に変数を束縛


42

X 4169

:2007

してもよい。結果木素片は,結果木の素片を表現する。結果木素片は,単一のルートだけを含むノード集

合と等価に扱われる。しかし,結果木素片に関して許可される演算は,ノード集合に関して許可される演

算の部分集合とする。

演算が文字列に関して許可される場合に限り,

結果木素片でその演算が許可される。

ただし,文字列に関する演算は,最初に文字列から数値又は論理値への変換処理を含んでもよい。特に,

結果木素片では,演算子/,//及び[]の使用は許可されない。許可された演算が結果木素片に関して実行さ

れると,等価なノード集合に関して演算が実行されたのと全く同じに実行される。

結果木素片が結果木にコピーされる場合(11.3 参照)

,等価なノード集合におけるルートの子であるすべ

てのノードが,順番どおりに結果木に追加される。

式は,結果木素片の変数を参照する,結果木素片を返す拡張関数を呼び出す,又は値が結果木素片であ

るシステム特性を獲得することによってだけ,結果木素片の型の値を返すことができる。

11.2

変数値及びパラメタ値

変数束縛要素は,次の三つのいずれかの方法で,変数の値を指定できる。

a)

変数束縛要素が select 属性をもつ場合,属性の値は,式でなければならず,変数の値は,式を評価し

た結果から得られるオブジェクトとなる。この場合,内容は空でなければならない。

b)

変数束縛要素が select 属性をもたず内容が空ではない場合,すなわち,変数束縛要素が一つ以上の子

ノードをもつ場合は,

変数束縛要素の内容が値を指定する。変数束縛要素の内容はテンプレートだが,

インスタンス化されて変数の値を提供する。値は,テンプレートをインスタンス化することによって

生成されるノードのシーケンスを子としてもつ単一のルートを含むノード集合と等価な結果木素片と

する。結果木素片におけるノードの基底 URI は,変数束縛要素の基底 URI とする。

テンプレートをインスタンス化することによって生成されるノードのシーケンスのメンバが属性ノ

ード又は名前空間ノードである場合は,誤りとする。これは,ルートが,属性ノード又は名前空間ノ

ードを子としてもつことができないことによる。XSLT プロセサは誤りを通知してもよい。誤りを通

知しない場合は,その属性ノード又は名前空間ノードを追加しないことによって,誤りから回復しな

ければならない。

c)

変数束縛要素が空の内容をもち,select 属性をもたない場合,変数の値は,空の文字列とする。そこ

で,

<xsl:variable name="x"/>

これは次と等価となる。

<xsl:variable name="x" select="''"/>

注記 1  位置によってノードを選択するために変数を使用する場合は,次をしないように注意する。

<xsl:variable name="n">2</xsl:variable>

...

<xsl:value-of select="item[$n]"/>

<xsl:variable name="n" select="2"/>

...

<xsl:value-of select="item[$n]"/>

又は

<xsl:variable name="n">2</xsl:variable>

...

<xsl:value-of select="item[position()=$n]"/>


43

X 4169

:2007

注記 2  空のノード集合をパラメタのデフォルト値として指定する便利な方法の一つを次に示す。

<xsl:param name="x" select="/.."/>

11.3  xsl:copy-of

による変数値及びパラメタ値の使用

<!-- Category: instruction -->

<xsl:copy-of

    select = expression />

xsl:copy-of

要素を用いて,結果木に結果木素片を挿入することができる。この場合,xsl:value-of のよう

に,最初に文字列に変換する必要はない(7.6.1 参照)

。必す(須)の select 属性は,式を含む。式を評価

した結果が結果木素片である場合は,完全な素片が,結果木にコピーされる。結果がノード集合である場

合は,その集合におけるすべてのノードが,文書順に結果木にコピーされる。要素ノードをコピーすると,

要素ノードそれ自体だけでなく,その要素ノードの属性ノード,名前空間ノード及び子もコピーされる。

ルートは,その子をコピーすることによって,コピーされる。属性又は名前空間ノードのコピーについて

は,xsl:copy(7.5 参照)と同様の規則が適用される。結果がノード集合でも結果木素片でもない場合は,

xsl:value-of

を使用する場合と同様に,その結果は文字列に変換され,それから,結果木に挿入される。

11.4

最上位の変数及びパラメタ

xsl:variable

及び xsl:param の両方が,最上位要素として許される。最上位の変数束縛要素は,どこからで

も見える大域変数を宣言する[他の束縛より隠ぺい(蔽)されている場合を除く。

。最上位の xsl:param 要

素は,スタイルシートへのパラメタを宣言する。ただし,XSLT は,パラメタをスタイルシートに渡す機

構を定義しない。スタイルシートが特定の名前の変数について二つ以上の束縛を含む場合は,最も高いイ

ンポート優先順位をもつ束縛が用いられる。一つのスタイルシートに同じ名前及び同じインポート優先順

位をもつ最上位の変数の束縛が二つ以上含まれる場合は,誤りとする。最上位では,変数の値を指定する

式又はテンプレートは,ソース文書のルートの処理に使用される文脈と同じ文脈を用いて評価される。現

ノードはソース文書のルートとし,現ノードリストはソース文書のルートだけを含むリストとする。大域

変数 x の値を指定するテンプレート又は式が大域変数 y を参照する場合は,

y

に対する値が x の値の前

に計算されなければならない。大域変数のすべての定義に対して,この処理を実行できない場合は誤りと

する。言い換えると,定義が循環する場合は誤りとする。

次の例では,大域変数 para-font-size が宣言されており,属性値テンプレートでそれが参照されている。

<xsl:variable name="para-font-size">12pt</xsl:variable>

<xsl:template match="para">

 <fo:block font-size="{$para-font-size}">

   <xsl:apply-templates/>

 </fo:block>

</xsl:template>

11.5

テンプレート内の変数及びパラメタ

xsl:variable

及び xsl:param は,最上位だけでなく,テンプレートでも使用できる。xsl:variable は,命令が

使用できるテンプレート内であれば場所を問わず使用できる。この場合,束縛は,それに続くすべての兄

弟及びその子孫に対して見えている。束縛が xsl:variable 要素それ自体に対しては見えていない点に注意す

る。xsl:param は,xsl:template 要素の先頭で子として使用できる。この文脈では,束縛は,それに続くすべ

ての兄弟及びその子孫に対して見えている。束縛が xsl:param 要素それ自体に対しては見えていない点に注


44

X 4169

:2007

意する。

ある束縛が,他の束縛が見えている位置で出現し,両方の束縛が同じ名前をもつ場合,前者の束縛は,

他の束縛を隠ぺいする。テンプレート内で xsl:variable 要素又は xsl:param 要素が確立した束縛が,そのテ

ンプレート内で xsl:variable 要素又は xsl:param 要素が同様に確立した他の束縛を隠ぺいする場合は誤りと

する。テンプレートで,xsl:variable 要素又は xsl:param 要素が確立した束縛が,最上位要素である xsl:variable

又は xsl:param が確立した他の束縛を隠ぺいする場合は誤りとはしない。この場合は,最上位の束縛は他の

束縛によって隠ぺいされているスタイルシートの領域内では見えない。したがって,次は誤りとなる。

<xsl:template name="foo">

<xsl:param name="x" select="1"/>

<xsl:variable name="x" select="2"/>

</xsl:template>

しかし,次は許される。

<xsl:param name="x" select="1"/>

<xsl:template name="foo">

<xsl:variable name="x" select="2"/>

</xsl:template>

注記 Java において,テンプレート内の xsl:variable 要素に最も近いものは,初期化子をもつ final 局所

変数宣言である。例えば,

<xsl:variable name="x" select="'value'"/>

の意味は,

final Object x = "value";

と類似している。XSLT には,次の Java の代入演算子と等価のものが存在しない。

x = "value";

これは,この記述が存在すると,先頭から始めて最後まで続けるというバッチ的な方法以外

で文書を処理する実装の生成が困難になってしまうことによる。

11.6

テンプレートへのパラメタの引渡し

<xsl:with-param

    name = qname

  select = expression>

  <!-- Content: template -->

</xsl:with-param>

パラメタは,xsl:with-param 要素を用いて,テンプレートに渡される。必す(須)の name 属性は,パラ

メタ,すなわち,その束縛の値が置き換えられる変数,の名前を指定する。name 属性の値は,QName で

あって,2.4 で示されるとおりに展開される。xsl:with-param は,xsl:call-template 及び xsl:apply-templates の

内部で使用できる。単一の xsl:call-template 又は xsl:apply-templates 要素が同じ名前の xsl:with-param 要素を

二つ以上含む場合は誤りとする。パラメタの値は,xsl:variable 及び xsl:param に対する場合と同じ方法で指

定される。xsl:with-param 要素が指定する値の計算に使用される現ノード及び現ノードリストは,その要素

が出現する xsl:apply-templates 要素又は xsl:call-template 要素に使用されるものと同じとする。パラメタ x

を,x  のための xsl:param 要素をもたないテンプレートに渡すことは,誤りとはしない。この場合,パラメ


45

X 4169

:2007

タは単に無視される。

次の例では,数値のフォーマットを制御するために,引数をもつ 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>

12

追加関数

箇条 12 では,コア XPath 関数ライブラリへの XSLT 固有の追加を示す。これら追加関数の中には,スタ

イルシートの最上位要素が指定する情報を利用するものもある。箇条 12 では,これらの要素についても示

す。

12.1

複数のソース文書

関数  node-set document(objectnode-set?)

document

関数を使用することによって,主ソース文書以外の XML 文書にアクセスすることができる。

document

関数が引数を一つだけもち,その引数がノード集合(node-set)である場合,引数のノード集合に

おける各ノードについて,そのノードの文字列値を 1 番目の引数とし,そのノードを唯一のメンバとして

もつノード集合を 2 番目の引数として document 関数を呼び出して結果を求め,最後にそれらの結果の和集

合をとったものをこの関数の結果とする。document 関数が二つの引数をもち,最初の引数がノード集合で

ある場合,そのノード集合における各ノードについて,ノードの文字列値を 1 番目の引数とし,元の

document

関数に渡される 2 番目の引数を 2 番目の引数として document 関数を呼び出して結果を求め,最

後にそれらの結果の和集合をとったものをこの関数の結果とする。

document

関数に対する最初の引数がノード集合ではない場合,最初の引数は,string 関数に対する呼出

しによるものとして,文字列に変換される。この文字列は,URI 参照として取り扱われる。すなわち,URI

が識別する資源が検索される。検索動作の結果得られたデータは,XML 文書として構文解析され,データ

モデルに従って木が構成される(箇条 参照)

。資源の検索中に誤りが発生した場合は,XSLT プロセサが

誤りを通知してもよい。誤りを通知しない場合は,空のノード集合を返すことによって誤りから回復しな

ければならない。検索誤りとして考えられるものには,XSLT プロセサが URI によって使用される URI 方

式をサポートしない場合がある。 XSLT プロセサは,特定の URI 方式をサポートすることを要求されない。

XSLT

プロセサ用の文書化において,XSLT プロセサがどの URI 方式をサポートするかを指定するのが望

ましい。

URI

参照が素片識別子を含まない場合,文書のルートだけを含むノード集合が返される。URI 参照が素


46

X 4169

:2007

片識別子を含む場合,関数は,URI 参照の素片識別子が識別する木のノードを含むノード集合を返す。素

片識別子の意味は,URI の検索結果のメディア型に依存する。素片識別子の処理中に誤りが発生した場合

は,XSLT プロセサが誤りを通知してもよい。誤りを通知しない場合は,空のノード集合を返すことによ

って,誤りから回復しなければならない。考えられる誤りを次に示す。

a)

素片識別子が,XSLT ノード集合が表現できないものを識別する場合。例えば,テキストノード内の

文字の範囲など。

b) XSLT

プロセサが検索結果のメディア型に対する素片識別子をサポートしない場合。XSLT プロセサは,

特定のメディア型のサポートを要求されない。XSLT プロセサ用の文書化において,XSLT プロセサが

どのメディア型に対する素片識別子をサポートするかを指定するのが望ましい。

検索動作の結果得られたデータは,検索結果のメディア型に関係なく,XML 文書として構文解析される。

最上位メディア型が text の場合は,メディア型が text/xml である場合と同じ方法で構文解析される。それ

以外の場合は,メディア型が application/xml である場合と同じ方法で構文解析される。

注記  最上位の xml メディア型は存在しないので,text/xml 又は application/xml 以外のメディア型をも

つデータが,実際には XML であることもある。

URI

参照は相対的であってもよい。2 番目の引数のノード集合のうち,文書順で最初にあるノードの基

底 URI  (3.2 参照)は,相対 URI を絶対 URI へと解決するための基底 URI として使用される。2 番目の引

数のノード集合が空で,URI 参照が相対的であれば,誤りとする。XSLT プロセサは誤りを通知してもよ

い。誤りを通知しない場合は,空のノード集合を返すことによって,誤りから回復しなければならない。2

番目の引数が省略されている場合は,document 関数への呼出しを取り込む式を含むスタイルシートのノー

ドをデフォルトとして使用する。長さがゼロの URI 参照は,URI 参照がそれに対して相対的に解決されて

いる文書の参照である点に注意する。したがって,document("")は,スタイルシートのルートを参照する。

スタイルシートの木表現は,そのスタイルシートを含む XML 文書が最初のソース文書であった場合と全

く同じとする。

二つの文書が同じ URI によって識別される場合,両者は同一の文書として取り扱われる。比較に使用さ

れる URI は,相対 URI が解決された結果の絶対 URI であって,素片識別子を含まない。一つのルート及

び他のルートが同じ文書からのものである場合は,両者は同じノードとして取り扱われる。したがって,

次の式は常に真となる。

generate-id(document("foo.xml"))=generate-id(document("foo.xml"))

document

関数は,ノード集合が二つ以上の文書からのノードを含んでもよい可能性を生じさせる。この

ようなノード集合の場合は,同じ文書における二つのノードの相対的な文書順は,JIS X 4160 が定義する

通常の文書順とする。異なる文書における二つのノードの相対的な文書順は,二つのノードを含む文書の

実装依存の順序付けによって決定される。実装が文書の順序付けを行う方法には,矛盾しない順序付けを

行うこと以外に制約はない。すなわち,実装は,文書の同じ集合に対しては,常に同じ順序を使用しなけ

ればならない。

12.2

キー

キーの使用によって,暗黙的な相互参照構造を含む文書を扱うことができる。XML の ID,IDREF 及び

IDREFS

の各属性型は,XML 文書が相互参照を明示的に行える機構を提供する。XSLT は,XPath id 関数

を通じてこれをサポートする。しかし,この機構には多くの制限がある。それを次に示す。

a) ID

属性は,DTD においてそのように宣言されなければならない。ID 属性が外部 DTD の部分集合でだ

け ID 属性として宣言される場合,ID 属性として認識されるのは,XML プロセサが外部 DTD の部分


47

X 4169

:2007

集合を読む場合に限られる。しかし,XML は,XML プロセサに外部 DTD を読むことを要求しない。

特に,文書が standalone="yes"と宣言されている場合には,XML プロセサは外部 DTD を読まないこと

を選択してよい。

b)

文書は一意的な ID の集合をただ一つだけ含むことができる。一意的な ID の異なる独立な複数の集合

があってはならない。

c)

要素の ID は,属性でだけ指定できる。要素の内容又は子要素による指定はできない。

d) ID

は,XML の名前のつけ方に従わなければならない。例えば,スペースを含むことはできない。

e)

要素がもつことができる ID は,最大で一つとする。

f)

多くとも一つの要素が特定の ID をもつことができる。

これらの制限のために,XML 文書は,ID/IDREF/IDREFS 属性が明示的には宣言しない相互参照構造を

含むことがある。

キーは,次の三つから成る。

a)

キーをもつノード

b)

キーの名前(展開名)

c)

キーの値(文字列)

スタイルシートは,xsl:key 要素を用いて,各文書に対してキーの集合を宣言する。このキーの集合が,

ノード x ,名前 y 及び値 z をもつメンバを含む場合,ノード x は,名前 y 及び値 z を伴ったキーを

もつという。

したがって,キーは一種の一般化 ID であって,XML ID と同じ制限には従わない。すなわち,次のとお

りとなる。

a)

キーは,xsl:key 要素を用いて,スタイルシートで宣言される。

b)

一つのキーは,一つの値だけでなく一つの名前をもつ。各キーの名前は,識別子の分離し独立した空

間を区別するものとして考えてよい。

c)

例えば,属性,子要素又は内容といった,使いやすい場所のどこにでも,要素に対する名前付きキー

の値を指定してよい。XPath 式が,特定の名前付きキーに対する値を見つける場所を指定するために

使用される。

d)

キーの値は,任意の文字列とすることができる。名前とする制約はない。

e)

同じノード及び同じキーの名前をもつが,異なるキーの値をもつ文書には,

複数のキーが存在できる。

f)

同じキーの名前及び同じキーの値をもつが,

異なるノードをもつ文書には,

複数のキーが存在できる。

<!—Category: top-level-element -->

<xsl:key

    name = qname

    match = pattern

    use = expression />

xsl:key

要素は,キーを宣言するために使用される。name 属性は,キーの名前を指定する。name 属性の

値は,QName であって,2.4 で示されるとおりに展開される。match 属性は,Pattern とする。xsl:key 要素

は,match 属性で指定されるパターンにマッチするあらゆるノードのキーについての情報を提供する。use

属性は,キーの値を指定する式とする。式は,パターンにマッチする各ノードごとに一度評価される。結

果がノード集合である場合,パターンにマッチするノードは,ノード集合における各ノードに対して,そ


48

X 4169

:2007

の値がノード集合におけるノードの文字列値である指定された名前のキーをもつ。それ以外の場合は,結

果は,文字列に変換され,パターンにマッチするノードは,その文字列と等しい値をもつ指定された名前

のキーをもつ。したがって,xsl:key 要素が次を満たす場合に限り,ノード x は,名前 y 及び値 z を伴

ったキーをもつ。

a) x

が,xsl:key 要素の match 属性で指定されるパターンにマッチする。

b) xsl:key

要素の name 属性の値が,y  に等しい。

c) xsl:key

要素の use 属性で指定される式を,x  を現ノードとし,x  だけを含むノードリストをオブジェ

クト u を結果として生じる現ノードリストとして評価する場合には,z  が,string 関数への呼出しに

よるものとして u を文字列に変換した結果と等しくなるか,又は u がノード集合であって,z  が u

における一つ以上のノードの文字列値と等しくなるかのいずれかとする。

与えられたノードにマッチする xsl:key 要素が二つ以上存在してもよい点に注意する。同じインポート優

先順位をもっていない場合でも,マッチする xsl:key 要素すべてが使用される。

use

属性又は match 属性のいずれかの値が VariableReference を含む,又は key 関数の呼び出しを含むこと

は誤りとする。

関数  node-set key(stringobject)

key

関数は,id 関数が ID に対して行うことを,キーに対して行う。最初の引数は,キーの名前を指定す

る。この引数の値は,QName でなければならず,2.4 で示されるとおりに展開される。key 関数の 2 番目

の引数がノード集合型である場合,結果は,key 関数を引数のノード集合における各ノードの文字列値に

適用した結果の和集合とする。key 関数の 2 番目の引数がその他の型である場合は,引数は,string 関数へ

の呼出しによるものとして文字列に変換され,この文字列と等しい名前付きキーに対する値をもつ文脈ノ

ードと同じ文書におけるノードを含むノード集合を返す。

次に宣言の例を示す。

<xsl:key name="idkey" match="div" use="@id"/>

式 key("idkey",@ref)は,XML ソース文書で宣言された ID 属性が次のものだけと仮定して,id(@ref)と

同じノード集合を返す。

<!ATTLIST div id ID #IMPLIED>

この場合,現ノードの ref 属性は,空白を含まないと仮定している。

<prototype name="key" return-type="node-set">

<arg type="string"/>

<arg type="object"/>

</prototype>

さらに,function 要素を用いて関数名を参照すると仮定する。

<function>key</function>

このとき,次の記述によって,スタイルシートは,参照と定義との間にハイパリンクを生成することが

できる。

<xsl:key name="func" match="prototype" use="@name"/>

<xsl:template match="function">

<b>

  <a href="#{generate-id(key('func'

,.))}">

    <xsl:apply-templates/>


49

X 4169

:2007

    </a>

</b>

</xsl:template>

<xsl:template match="prototype">

<p><a name="{generate-id()}">

<b>Function: </b>

...

</a></p>

</xsl:template>

key

は常に現ノードと同一の文書中のノードを返す。他の文書からの key を取り出すためには,はじめ

に現ノードを変更することが必要となる。例えば,<bibref>XSLT</bibref>という形式での書誌参照を含む

文書を仮定し,次の形式の項目をもつ書誌データベースを含む別の XML 文書 bib.xml が存在するものとす

る。

<entry name="XSLT">...</entry>

このとき,スタイルシートは次を用いて,bibref 要素を変換することができる。

<xsl:key name="bib" match="entry" use="@name"/>

<xsl:template match="bibref">

  <xsl:variable name="name" select="."/>

  <xsl:for-each select="document('bib.xml')">

    <xsl:apply-templates select="key('bib'

,$name)"/>

  </xsl:for-each>

</xsl:template>

12.3

数字のフォーマット化

関数  string format-number(numberstringstring?)

format-number

関数は,2 番目の引数によって指定されたフォーマットパターン文字列,及び 3 番目の引

数で名前付けされた 10 進フォーマットを用いて,最初の引数を文字列に変換する。3 番目の引数が存在し

ない場合は,デフォルトの 10 進フォーマットが使用される。フォーマットパターン文字列は,JDK 1.1 の

DecimalFormat

クラスが指定する構文に従う。フォーマットパターン文字列は,現地化された記法で表現

される。すなわち,その 10 進フォーマットは,パターンにおいてどの文字が特別な意味をもつかを決定す

る。ただし,引用文字は現地化されないので例外とする。フォーマットパターンは,通貨記号(#x00A4)

を含んではならない。この機能に対するサポートは,JDK 1.1 の初期リリース後,追加された。10 進フォ

ーマット名は,QName でなければならず,2.4 で示されるとおりに展開される。指定された展開名をもつ

10

進フォーマットの宣言をスタイルシートが含まない場合は,誤りとする。

注記 1  実装は,JDK 1.1 の実装を使用することも,Java で実装することも要求されない。

注記 2  スタイルシートは,Xpath における他の機能を用いて,数字の丸めを制御できる。

注記 3  原勧告では,JDK 1.1 の DecimalFormat として,次の URL が参照されているが、現在は入手

不可能となっている。

http://java.sun.com/products/jdk/1.1/docs/api/java.text.DecimalFormat.html

JDK

の新しい版の DecimalFormat に関する情報は、次の URL 等から入手できる。

http://java.sun.com/j2se/1.4.2/docs/api/java/text/DecimalFormat.html


50

X 4169

:2007

<!-- Category: top-level-element -->

<xsl:decimal-format

    name = qname

  decimal-separator = char

  grouping-separator = char

  infinity = string

  minus-sign = char

  NaN = string

  percent = char

  per-mille = char

  zero-digit = char

  digit = char

  pattern-separator = char />

xsl:decimal-format

要素は,10 進フォーマットを宣言する。10 進フォーマットは,format-number 関数が

使用するフォーマットパターンの解釈を制御する。name 属性が存在する場合,要素は,名前付けされた

10

進フォーマットを宣言する。それ以外の場合は,要素は,デフォルトの 10 進フォーマットを宣言する。

name

属性の値は,QName であって,2.4 で示されたとおりに展開される。あらゆるデフォルト値を考慮し

て,すべての属性に対して同じ値を常に宣言するわけではない場合には,インポート優先順位が異なって

いるとしても,デフォルトの 10 進フォーマット,又は与えられた名前をもつ 10 進フォーマットのいずれ

かを 2 回以上宣言することは誤りとする。

スタイルシートがデフォルトの 10 進フォーマットを含んでいな

い場合,属性をもたない xsl:decimal-format 要素と等価な宣言が仮定される。

xsl:decimal-format

の他の属性は,JDK 1.1 の DecimalFormatSymbols クラスのメソッドに対応する。get メ

ソッド及び set メソッドの各対に対して,xsl:decimal-format 要素のために定義された属性が一つずつ存在す

る。

次の属性は,フォーマットパターンにおける文字の解釈の制御,及び数字のフォーマット化の結果に現

れてよい文字の指定の両方を行う。

a) decimal-separator

は,小数点記号に使用する文字を指定する。デフォルト値は,ピリオド文字(.)と

する。

b) grouping-separator

は,千単位などのグループ化分離子として使用する文字を指定する。デフォルト値

は,コンマ文字(,

)とする。

c) percent

は,パーセント記号として使用する文字を指定する。デフォルト値は,パーセント文字(%)

とする。

d) per-mille

は,パーミル(千分率)記号として使用する文字を指定する。デフォルト値は,Unicode の

パーミル(千分率)文字(#x2030)とする。

e) zero-digit

は,数字のゼロとして使用する文字を指定する。デフォルト値は,数字のゼロ(0)とする。

次の属性は,フォーマットパターンにおいて文字の解釈を制御する。

a) digit

は,フォーマットパターンにおいて数字のために使用する文字を指定する。デフォルト値は,番

号記号文字(#)とする。

b) pattern-separator

は,パターンにおいて正及び負の部分パターンを分離するために使用する文字を指定


51

X 4169

:2007

する。デフォルト値は,セミコロン文字(;)とする。

次の属性は,数字をフォーマット化した結果に現れてもよい文字又は文字列を指定する。

a) infinity

は,無限大を表すために使用する文字列を指定する。デフォルト値は,文字列 Infinity とする。

b) NaN

は,NaN 値を表すために使用する文字列を指定する。デフォルト値は,文字列 NaN とする。

c) minus-sign

は,デフォルトの負記号として使用される文字を指定する。デフォルト値は,ハイフンマ

イナス文字(-,#x2D)とする。

12.4

他の追加関数

関数  node-set current()

current

関数は,現ノードを唯一のメンバとしてもつノード集合を返す。最も外側の式,すなわち,他の

式の内部に現れない式,に対して,現ノードは,常に文脈ノードと同じとする。次に例を示す。

<xsl:value-of select="current()"/>

これは,次と同じ意味である。

<xsl:value-of select="."/>

しかし,角括弧内では,通常,現ノードは文脈ノードと異なる。次に例を示す。

<xsl:apply-templates select="//glossary/item[@name=current()/@ref]"/>

これは,親要素が glossary であって,name 属性の値が現ノードの ref 属性の値と等しい item 要素をすべ

て処理することになる。これは,次とは異なる。

<xsl:apply-templates select="//glossary/item[@name=./@ref]"/>

この意味は,次と同じである。

<xsl:apply-templates select="//glossary/item[@name=@ref]"/>

これは,

親要素が glossary であって,

同じ値の name 属性及び ref 属性をもつ item 要素をすべて処理する。

current

関数をパターンにおいて使用するのは誤りとする。

関数  string unparsed-entity-uri(string)

unparsed-entity-uri

は,文脈ノードと同じ文書における,指定された名前をもつ解析対象外実体の URI を

返す(3.3 参照)

。このような実体が存在しない場合には,空の文字列を返す。

関数  string generate-id(node-set?)

generate-id

関数は,引数のノード集合の中の,文書順で最初のノードを一意に識別する文字列を返す。

一意の識別子は,ASCII 英数文字から構成されなければならず,先頭はアルファベット文字でなければな

らない。したがって,文字列は構文的に XML 名となる。実装が同じノードに対して常に同じ識別子を生

成し,異なるノードからは常に異なる識別子が生成されていれば,いかなる都合のよい方法で,自由に識

別子を生成してもよい。文書が変換されるごとに,実装が同じ識別子を生成しなければならないという義

務はない。生成された一意の識別子がソース文書で指定される一意の ID とは異なるという保証はない。

引数のノード集合が空の場合,空の文字列が返される。引数が省略される場合,そのデフォルトは文脈ノ

ードとする。

関数  object system-property(string)

引数は,QName である文字列へと評価されなければならない。QName は,式の適用範囲にある名前空

間宣言を用いて,名前に展開される。system-property 関数は,名前で識別されるシステム特性の値を表現

するオブジェクトを返す。このようなシステム特性が存在しない場合は,空の文字列が返されるのが望ま

しい。

実装は,次のシステム特性を提供しなければならない。これらはすべて,XSLT 名前空間内に存在する。


52

X 4169

:2007

a) xsl:version

。プロセサが実装する XSLT の版を示す数値。この規格が指定する XSLT の版を実装する

XSLT

プロセサに対しては,数値は 1.0 とする。

b) xsl:vendor

。XSLT プロセサのベンダを識別する文字列。

c) xsl:vendor-url

。XSLT プロセサのベンダを識別する URL を含む文字列。通常,これは,ベンダの Web

サイトのホストページ(ホームページ)とする。

ベンダは XSLT 名前空間内に追加のシステム特性を定義してはならない。

13

メッセージ

<!-- Category: instruction -->

<xsl:message

    terminate = "yes" | "no">

  <!-- Content: template -->

</xsl:message>

xsl:message

命令は,XSLT プロセサに依存する方法でメッセージを送信する。xsl:message 命令の内容は,

テンプレートとする。xsl:message は,内容をインスタンス化することによってインスタンス化され,XML

素片を生成する。この XML 素片は,メッセージの内容とする。

注記 XSLT プロセサは,警告ボックスをポップアップすること,又はログファイルに書込みするこ

とによって,xsl:message を実装してもよい。

terminate

属性が値 yes をもつとき,XSLT プロセサは,メッセージを送信した後,処理を終了するのが

望ましい。そのデフォルト値は,no とする。

現地化を行う便利な方法の一つに,メッセージテキストなどの現地化された情報を XML 文書に設定す

ることがある。この XML 文書は,スタイルシートへの追加入力ファイルになる。例えば,言語 L に関す

るメッセージが,次の形式で,XML ファイル resources/L.xml の中に記憶されるとする。

<messages>

  <message name="problem">A problem was detected.</message>

  <message name="error">An error was detected.</message>

</messages>

スタイルシートは,メッセージを現地化するために,次のアプローチを使える。

<xsl:param name="lang" select="'en'"/>

<xsl:variable name="messages"

  select="document(concat('resources/'

, $lang, '.xml'))/messages"/>

<xsl:template name="localized-message">

  <xsl:param name="name"/>

  <xsl:message>

    <xsl:value-of select="$messages/message[@name=$name]"/>

  </xsl:message>

</xsl:template>

<xsl:template name="problem">

  <xsl:call-template name="localized-message"/>


53

X 4169

:2007

    <xsl:with-param name="name">problem</xsl:with-param>

  </xsl:call-template>

</xsl:template>

14

拡張

XSLT

は,拡張要素及び拡張関数という二種類の拡張を可能にする。

この版の XSLT は,拡張の実装を定義するための機構を提供していない。したがって,XSLT 実装間で

移植可能でなければならない XSLT スタイルシートは,利用可能になる特定の拡張に依存してはならない。

XSLT

は,XSLT スタイルシートに対して,それを処理する XSLT プロセサが特定の利用可能な拡張の実装

をもつかどうかを定義可能にして,それらの拡張が利用できなければ何がおきるかを指定可能にする機構

を提供する。XSLT スタイルシートが注意深くそれらの機構を利用すれば,それは,拡張を活用し,どの

ような XSLT 実装でも動作することができる。

14.1

拡張要素

要素の拡張機構は,名前空間が拡張名前空間として指定されることを可能にする。名前空間が拡張名前

空間として指定され,その名前空間からの名前をもつ要素がテンプレートに現れるとき,要素は,リテラ

ル結果要素としてではなく,命令として扱われる。名前空間は,命令の意味を決定する。

注記 xsl:stylesheet 要素の子である要素はテンプレートに現れていないため,非 XSLT 最上位要素は,

ここで定義する拡張要素ではなく,14.1 の記述はそれには適用しない。

xsl:stylesheet

要 素 の extension-element-prefixes 属 性 , 又 は リ テ ラ ル 結 果 要 素 若 し く は 拡 張 要 素 の

xsl:extension-element-prefixes

属性を使用することによって,名前空間は,拡張名前空間として指定される。

これら両属性の値は,名前空間接頭辞を空白で分離したリストとする。各接頭辞に束縛した名前空間は,

拡張名前空間として指定される。extension-element-prefixes 属性又は xsl:extension-element-prefixes 属性をも

つ要素に接頭辞を束縛した名前空間がない場合は,誤りとする。名前空間接頭辞のリストに#default を含

むことによって,

(xmlns によって宣言される)デフォルトの名前空間を,拡張名前空間として指定しても

よい。拡張名前空間としての名前空間の指定は,extension-element-prefixes 属性又は xsl:extension-element-

prefixes

属性をもつ要素をルートとするスタイルシートの部分木内に影響を及ぼす。xsl:stylesheet 要素をル

ートとする部分木は,その xsl:stylesheet 要素の子によってインポートされる又は含まれるどのようなスタ

イルシートをも含まない。

XSLT

プロセサが,利用可能な特定の拡張要素の実装をもたないときは,element-available 関数が,要素

の名前に偽を返さなければならない。これらの拡張要素がインスタンス化されるとき,XSLT プロセサは,

箇条 15 で指定するとおり,要素に関するフォールバックを実行しなければならない。XSLT プロセサは,

実装が利用できない拡張要素をテンプレートが含むという理由だけで,誤りを通知してはならない。

XSLT

プロセサが,利用可能な特定の拡張要素の実装をもつ場合,element-available 関数は,その要素の

名前に真を返さなければならない。

14.2

拡張関数

FunctionCall

式の中の FunctionName が,NCName ではない場合(つまり,それがコロンを含む場合)

,そ

れは拡張関数への呼出しとして扱われる。FunctionName は,評価内容からの名前空間宣言を用いて,名前

に展開される。

XSLT

プロセサが,利用可能な特定の名前の拡張関数の実装をもたない場合,function-available 関数は,

その名前に偽を返さなければならない。これらの拡張関数が式の中に現れ,拡張関数が実際に呼び出され


54

X 4169

:2007

る場合,XSLT プロセサは,誤りを通知しなければならない。XSLT プロセサは,利用できる実装がない拡

張関数を式が含むという理由だけで,誤りを通知してはならない。

XSLT

プロセサが,利用可能な特定の名前の拡張関数の実装をもつ場合,function-available 関数は,その

名前に真を返さなければならない。これらの拡張が呼び出される場合,XSLT プロセサは,関数呼出しの

引数にそれを渡して,実装を呼び出さなければならない。実装によって返される結果は,関数呼出しの結

果として返される。

15

フォールバック

<!-- Category: instruction -->

<xsl:fallback>

  <!-- Content: template -->

</xsl:fallback>

通常,xsl:fallback 要素をインスタンス化することは,何もしない。しかし,XSLT プロセサが命令要素

に関してフォールバックを実行するとき,命令要素が一つ以上の xsl:fallback の子をもてば,xsl:fallback の

子のそれぞれの内容は,順次インスタンス化されなければならない。そうでない場合は,誤りを通知しな

ければならない。xsl:fallback 要素の内容は,テンプレートとする。

特定の要素又は関数が利用できないときにスタイルシートがどう振る舞うかを明示的に制御するために,

次の関数は,xsl:choose 命令及び xsl:if 命令とともに利用できる。

関数boolean element-available(string)

引数は,QName である文字列に評価しなければならない。QName は,式の有効範囲にある名前空間宣

言を用いて,展開名に展開される。スコープ中にデフォルトの名前空間が存在する場合は,それが接頭辞

をもたない QName の展開に使用される。element-available 関数は,展開名が命令の名前である場合及びそ

の場合に限り,真を返す。展開名が XSLT 名前空間 URI に等しい名前空間 URI をもつ場合は,それは,

XSLT

が定義する要素を参照する。そうでない場合は,それは,拡張要素を参照する。展開名が null の名

前空間 URI をもつ場合,element-available 関数は,偽を返すことになる。

関数boolean function-available(string)

引数は,QName である文字列に評価しなければならない。QName は,式の有効範囲にある名前空間宣

言を用いて,展開名に展開される。function-available 関数は,展開名が関数ライブラリの中の関数の名前

である場合及びその場合に限り,真を返す。展開名が null でない名前空間 URI をもつ場合,それは,拡張

関数を参照する。そうでない場合は,それは,XPath 又は XSLT が定義する関数を参照する。


55

X 4169

:2007

16

出力

<!-- Category: top-level-element -->

<xsl:output

    method = "xml" | "html" | "text" | qname-but-not-ncname

  version = nmtoken

  encoding = string

    omit-xml-declaration = "yes" | "no"

    standalone = "yes" | "no"

  doctype-public = string

  doctype-system = string

  cdata-section-elements = qnames

    indent = "yes" | "no"

  media-type = string />

XSLT

プロセサは,バイトのシーケンスとして結果木を出力してもよいが,それができることは必す(須)

ではない(箇条 17 参照)

。xsl:output 要素は,スタイルシートの作成者が,どのように結果木を出力させた

いかを指定することを可能にする。XSLT プロセサが結果木を出力する場合,xsl:output 要素が指定すると

おりに出力するのが望ましい。しかし,これは必す(須)ではない。

xsl:output

要素は,最上位要素としてだけ使用できる。

xsl:output

の method 属性は,

結果木を出力するのに使用されるのが望ましい全体のメソッドを識別する。

この値は,QName でなければならない。QName が接頭辞をもたないとき,それは,この規格で指定され

るメソッドを識別し,xml,html 又は text の一つでなければならない。QName が接頭辞をもつとき,QName

は,2.4 に記述されるとおりに,展開名に展開される。展開名は,出力メソッドを識別する。この場合の振

る舞いは,この規格では指定しない。

method

属性のデフォルトは,次のとおり選択される。

a)

結果木のルートが,子要素をもつ。

b)

結果木のルート(つまり,文書要素)の最初の要素の子の展開名が,

(大文字及び小文字のすべての組

合せにおける)ローカル部分 html 及び null の名前空間 URI をもつ。

c)

結果木のルートの最初の要素の子より前のどんなテキストノードも,空白文字だけを含む。

これらの場合には,デフォルトの出力メソッドは,html とする。そうでない場合は,デフォルトの出力

メソッドは xml とする。xsl:output 要素が存在しない場合,又は xsl:output 要素が method 属性の値を指定し

ない場合,デフォルトの出力メソッドを使用するのが望ましい。

xsl:output

の他の属性は,出力メソッドのパラメタを提供する。使用できる属性を次に示す。

a) version

は,出力メソッドの版を指定する。

b) indent

は,結果木の出力時に,XSLT プロセサが追加の空白を加えてもよいかどうかを指定する。その

値は,yes 又は no でなければならない。

c) encoding

は,XSLT プロセサが文字のシーケンスをバイトのシーケンスとして符号化するために使用

が望まれる文字符号化を指定する。属性の値は,大文字及び小文字を区別しないで扱われるのが望ま

しい。値は,#x21 から#x7E までの範囲(つまり,印刷可能 ASCII 文字)の中の文字だけを含まなけ

ればならない。値は,Internet Assigned Numbers Authority [IANA],[RFC2278]で登録された charset であ


56

X 4169

:2007

るか,又は X-で始まるかのどちらかであることが望ましい。

d) media-type

は,結果木を出力することから得られるデータのメディア型(MIME 内容型)を指定する。

charset

パラメタは,明示的に指定されないのが望ましい。その代わり,最上位メディア型が text であ

る場合,出力メソッドが実際に使用する文字符号化に従って,charset パラメタが追加されるのが望ま

しい。

e) doctype-system

は,文書型宣言に用いられるシステム識別子を指定する。

f) doctype-public

は,文書型宣言に用いられる公開識別子を指定する。

g) omit-xml-declaration

は,XSLT プロセサが XML 宣言を出力するのが望ましいかどうかを指定する。値

は,yes 又は no でなければならない。

h) standalone

は,

XSLT

プロセサがスタンドアロン文書宣言を出力するのが望ましいかどうかを指定する。

値は,yes 又は no でなければならない。

i) cdata-section-elements

は,そのテキストノードの子が,CDATA セクションを用いて出力されるのが望

ましい要素の名前のリストを指定する。

各属性の詳細な意味は,それが適用できる各出力メソッドについて,別々に記述される。属性の意味が

出力メソッドに記述されないと,それはその出力メソッドに適用できない。

スタイルシートは,複数の xsl:output 要素を含んでもよく,xsl:output 要素をも含むスタイルシートを含

んだりインポートしてよい。スタイルシートに現れる xsl:output 要素はすべて,単一の有効な xsl:output 要

素に併合される。cdata-section-elements 属性については,有効な値は,指定された値の和集合とする。他の

属性については,有効な値は,最高のインポート優先順位をもつ指定された値とする。一つの属性に関し

て二つ以上のこれらの値があると,それは誤りとする。XSLT プロセサは,誤りを通知してもよい。それ

が誤りを通知しないとき,スタイルシートの最後に現れる値を使用することによって,誤りから回復する

のが望ましい。属性の値は,xsl:output 要素が併合された後に,デフォルトとなる。異なる出力メソッドは,

一つの属性に関して,異なるデフォルト値をもってもよい。

16.1  XML

出力メソッド

xml

出力メソッドは,整形式の XML 外部一般解析実体として,結果木を出力する。結果木のルートが

単一の要素ノードの子をもち,テキストノードの子をもたない場合,実体は,整形式の XML 文書実体で

あってもよい。実体が,次のとおり自明の XML 文書ラッパの中で参照される場合を考える。

<!DOCTYPE doc [

<!ENTITY e SYSTEM "entity-URI">

]>

<doc>&e;</doc>

ここで,entity-URI は実体の URI とする。ラッパ文書は,全体として,XML 名前空間の勧告(JIS X 4158)

に適合した整形式の XML 文書であることが望ましい。さらに,その出力は,次のとおりであることが望

ましい。つまり,箇条 において指定された XML 文書としてラッパを構文解析し,次に文書要素を削除

して,その子要素を代わりにルートの子とすることによって,新しい木が構成されたとき,新しい木は,

結果木と同じになる。ここで,次の可能な例外がある。

a)

二つの木における属性及び名前空間ノードの順序は,異なってもよい。

b)

新しい木は,結果木に存在しなかった名前空間ノードを含んでもよい。

注記 XSLT プロセサは,XML として結果木を出力する過程において,名前空間宣言を追加すること

を必要としてよい。


57

X 4169

:2007

c)

二つの木のノードのベース URI は異なってもよい。

XSLT

プロセサが doctype-system 属性のために文書型宣言を生成した場合,又は standalone 属性のために

スタンドアロン文書宣言を生成した場合,出力は整形式の XML 文書でなければならず,前述の要件は,

DTD

を処理しない XML 処理系を用いて,どんなラッパも使用することなく,その文書を直接パースした

結果生成された木に適用される。

注記 DTD の処理は属性のデフォルトによって,木に追加の属性を出現させ得る。

version

属性は,結果木を出力するのに使用する XML の版を指定する。XSLT プロセサが XML のこの版

を利用可能にしないとき,XSLT プロセサが利用可能にする XML の版を使用するのが望ましい。XML 宣

言に出力される版(XML 宣言が出力されるとき)は,プロセサが結果木を出力するのに使用した XML の

版に対応するのが望ましい。version 属性の値は,XML 勧告(JIS X 4159)の生成規則 VersionNum にマッチ

するのが望ましい。デフォルト値は 1.0 とする。

encoding

属性は,結果木を出力するために用いる望ましい符号化を指定する。XSLT プロセサは,UTF-8

及び UTF-16 の値を遵守する必要がある。他の値については,XSLT プロセサが指定された符号化を利用可

能にしない場合,誤りを通知してよい。誤りを通知しない場合は,代わりに UTF-8 又は UTF-16 を使用す

るのが望ましい。XSLT プロセサは,名前が XML 勧告(JIS X 4159)の生成規則 EncName にマッチしない符

号化を用いてはならない。encoding 属性が指定されない場合,XSLT プロセサは,UTF-8 又は UTF-16 のど

ちらかを使用するのが望ましい。XSLT プロセサが出力に用いている符号化において表現され得ない文字

を,結果木が含む可能性がある。この場合,XML が文字参照を認識する文脈の中(つまり,属性ノード又

はテキストノードの値の中)に文字が現れるなら,その文字を文字参照として出力するのが望ましい。そ

うでなければ(例えば,文字が要素の名前の中に現れるなら)

,XSLT プロセサは誤りを通知するのが望ま

しい。

indent

属性が値 yes をもつとき,xml 出力メソッドは,結果をうまく字下げするために,結果木の中の空

白に加えて(ソース文書又はスタイルシートのどちらかから削除した空白に基づくこともある。

,空白を

出力してもよい。indent 属性が値 no をもつとき,どんな追加の空白も出力するのは望ましくない。デフォ

ルト値は,no とする。xml 出力メソッドは,次のことを確実にする追加の空白を出力するアルゴリズムを

使用するのが望ましい。つまり,xsl:text だけからなる空白保存要素の集合で,3.4 に記述された処理を用

いて,出力から空白が削除されれば,結果は,追加の空白が出力される場合と追加の空白が出力されない

場合とが同じになる。

注記  混合内容をもつ要素型を含む文書型とともに indent="yes"を使用するのは,通常,安全ではない。

cdata-section-elements

属性は,空白で分離した QName のリストを含む。各 QName は,QName が現れる

xsl:output

要素の実際の名前空間宣言を用いて,展開名に展開される。デフォルト名前空間が存在する場合

は,接頭辞をもたない QName にそのデフォルト値が使用される。複数の xsl:output 要素を単一の有効な

xsl:output

要素に併合する前に,この拡張処理を実行する。テキストノードの親の展開名がリストのメンバ

である場合,テキストノードは CDATA セクションとして出力されるのが望ましい。次に例を示す。

<xsl:output cdata-section-elements="example"/>

この記述によって,

<example>&lt;foo></example>

として,又は

<example><![CDATA[<foo>]]></example>

としてスタイルシートに書かれたリテラル結果要素の出力は,次のとおりとなる。


58

X 4169

:2007

<example><![CDATA[<foo>]]></example>

テキストノードが文字]]>のシーケンスを含む場合,

現在開いている CDATA セクションを]]の後で閉じ,

>

の前で新しい CDATA セクションを開くのが望ましい。例えば,スタイルシートに次のとおり書かれたリ

テラル結果要素を考える。

<example>]]&gt;</example>

これは,次のとおり出力される。

<example><![CDATA[]]]]><![CDATA[>]]></example>

テキストノードが,結果木を出力するために使用する文字符号化で表現できない文字を含む場合,現在

開いている CDATA セクションを文字の前で閉じ,文字参照又は実体参照を用いて文字を出力し,テキス

トノードの中で更に続く文字には新しい CDATA セクションを開くのが望ましい。

cdata-section-elements

属性が明示的に指定するテキストノードは,CDATA セクションを用いて出力され

るのが望ましいが,それ以外の場合に,CDATA セクションを使用するのは望ましくない。

omit-xml-declaration

属性が値 yes をもたない場合,xml 出力メソッドが XML 宣言を出力するのが望まし

い。XML 宣言は,版情報及び符号化宣言の両方を含むのが望ましい。standalone 属性が指定されるとき,

それは,standalone 属性の値と同じ値をもつスタンドアロン文書宣言を含むのが望ましい。そうでないと

きは,それは,スタンドアロン文書宣言を含まないのが望ましい。これによって,それが,

(文書実体の先

頭で使用できる)XML 宣言及び(外部一般解析実体の先頭で使用できる)テキスト宣言の両方であること

が確実になる。

doctype-system

属性が指定される場合,xml 出力メソッドは,最初の要素の直前に文書型宣言を出力する

のが望ましい。<!DOCTYPE に続く名前は,最初の要素の名前であるのが望ましい。doctype-public 属性も

指定される場合は,xml 出力メソッドは,PUBLIC に続けて公開識別子を出力し,それからシステム識別

子を出力するのが望ましい。そうでない場合は,SYSTEM に続けてシステム識別子を出力するのが望まし

い。内部サブセットは空であるのが望ましい。doctype-system 属性が指定されなければ,doctype-public 属

性は,無視されるのが望ましい。

media-type

属性は,xml 出力メソッドに適用できる。media-type 属性のデフォルト値は,text/xml とする。

16.2  HTML

出力メソッド

html

出力メソッドは,結果木を HTML として出力する。次に例を示す。

<xsl:stylesheet version="1.0"

                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html"/>

<xsl:template match="/">

    <html>

   <xsl:apply-templates/>

  </html>

</xsl:template>

...

</xsl:stylesheet>

version

属性は,HTML の版を示す。デフォルト値は 4.0 であり,それは,結果が,HTML 4.0 勧告[HTML]

に適合する HTML として出力されることが望ましいことを指定する。

要素の展開名が null の名前空間 URI をもたない場合,html 出力メソッドが,xml 出力メソッドとは異な


59

X 4169

:2007

って,要素を出力しないのが望ましい。展開名が null でない名前空間 URI をもつ要素は,XML として出

力されるのが望ましい。要素の展開名が null の名前空間 URI をもつが,展開名のローカル部分が HTML

要素の名前として認識されない場合,span などの,空ではない行内要素と同じ方法で,要素を出力するの

が望ましい。

html

出力メソッドは,空要素の終了タグを出力しないのが望ましい。 HTML 4.0 に関しては,空要素は,

area

,base,basefont,br,col,frame,hr,img,input,isindex,link,meta 及び param とする。例えば,<br/>

又は<br></br>としてスタイルシートに書かれた要素は,<br>として出力されるのが望ましい。

html

出力メソッドは,大文字・小文字にかかわらず,HTML 要素の名前を認識するのが望ましい。例え

ば,br,BR 又は Br という名前の要素は,すべて HTML の br 要素として認識され,終了タグなしで出力

されるのが望ましい。

html

出力メソッドは,script 要素及び style 要素の内容についてエスケープ処理を実行しないのが望まし

い。例えば,リテラル結果要素がスタイルシートに次のとおり書かれているとする。

<script>if (a &lt; b) foo()</script>

又は

<script><![CDATA[if (a < b) foo()]]></script>

これは,次の出力を与える。

<script>if (a < b) foo()</script>

html

出力メソッドは,属性値に現れる文字<をエスケープしないのが望ましい。

indent

属性が値 yes をもつとき,html 出力メソッドは,どのように HTML 利用者エージェントが出力を

レンダリングするかをそれが変更しない限り,それが結果木を出力するときに,空白を追加してよく,削

除してもよい。デフォルト値は,yes とする。

html

出力メソッドは,HTML 4.0 勧告の B.2.1 で推奨されるメソッドを用いて,URI 属性値の非 ASCII

文字をエスケープするのが望ましい。

html

出力メソッドは,出力メソッドが使っている HTML の版において,文字実体参照がある文字につい

て定義されている場合は,その文字実体参照を用いて,文字を出力してよい。

html

出力メソッドは,?>ではなく,>でもって,処理命令を終了するのが望ましい。

html

出力メソッドは,ブール属性(属性の名前に等しい単一の許容された値だけをもつ属性)を最小化

した形式で出力するのが望ましい。例えば,開始タグが,スタイルシートに次のとおり書かれているとす

る。

<OPTION selected="selected">

これは,次のとおり出力される。

<OPTION selected>

html

出力メソッドは,{文字の直前の属性値に現れる文字&をエスケープしないのが望ましい(HTML 4.0

勧告の B.7.1 を参照)

。例えば,開始タグがスタイルシートに次のとおり書かれているとする。

<BODY bgcolor='&amp;{{randomrbg}};'>

これは,次のとおり出力される。

<BODY bgcolor='&{randomrbg};'>

encoding

属性は,使用が望まれる符号化を指定する。HEAD 要素がある場合,html 出力メソッドは,HEAD

要素の開始タグの直後に META 要素を追加して,実際に使用される文字符号化を指定するのが望ましい。

次に例を示す。


60

X 4169

:2007

<HEAD>

<META http-equiv="Content-Type" content="text/html; charset=EUC-JP">

...

結果木が,XSLT プロセサが出力に用いている符号化において表現できない文字を含むことがあり得る。

この場合,HTML が文字参照を認識する文脈の中に文字が現れれば,その文字は,文字実体参照又は 10

進数の文字参照として出力されるのが望ましい。そうでなければ(例えば,script 要素の中,style 要素の

中,又はコメントの中)

,XSLT プロセサは,誤りを通知するのが望ましい。

doctype-public

属性又は doctype-system 属性が指定される場合,html 出力メソッドは,最初の要素の直前

に文書型宣言を出力するのが望ましい。

<!DOCTYPE

に続く名前は,

HTML

又は html であるのが望ましい。

doctype-public

属性が指定される場合,出力メソッドは,指定された公開識別子の前に PUBLIC を出力する

のが望ましい。doctype-system 属性も指定される場合,それは,公開識別子に続けて,指定されたシステ

ム識別子を出力するのが望ましい。doctype-system 属性は指定されているが,doctype-public 属性は指定さ

れていない場合,出力メソッドは,SYSTEM を出力し,それに続けて指定されたシステム識別子を出力す

るのがよい。

media-type

属性は,html 出力メソッドに適用できる。デフォルト値は,text/html とする。

16.3

テキスト出力メソッド

text

出力メソッドは,エスケープ処理を行うことなく,結果木の各テキストノードの文字列値を文書順

に出力することによって,結果木を出力する。

media-type

属性は,text 出力メソッドに適用できる。media-type 属性のデフォルト値は,text/plain とする。

encoding

属性は,text 出力メソッドが文字のシーケンスをバイトのシーケンスに変換するために使用す

るのが望ましい符号化を識別する。デフォルト値は,システムに依存する。結果木が,XSLT プロセサが

出力に用いている符号化において表現できない文字を含む場合,XSLT プロセサは,誤りを通知するのが

望ましい。

16.4

出力エスケープの無効化

<xsl:text disable-output-escaping="yes">&lt;</xsl:text>

これは,単一の文字<を生成する。

結果木のテキストノード以外のものに使用されるテキストノードに関して,出力エスケープが無効化さ

れることは,誤りとする。したがって,コメント,処理命令又は属性ノードの文字列値を生成するのに使

用する xsl:value-of 要素又は xsl:text 要素に関して,出力エスケープを無効化することは,誤りとする。結

果木の素片が,エスケープが無効化されたテキストノードを含む場合に,結果木の素片を数値又は文字列

に変換することも誤りとする。いずれの場合も,XSLT プロセサは,誤りを通知してよい。誤りを通知し

ない場合は,disable-output-escaping 属性を無視することによって,誤りから回復しなければならない。

ルートが xsl:copy-of 要素(11.3 参照)を用いてコピーされ,ルートの子孫のテキストノードに対してエ

スケープが無効化された場合,エスケープはそのテキストノードのコピー結果でも無効とされるのが望ま

しい。次に例を示す。

<xsl:variable name="x">

<xsl:text disable-output-escaping="yes">&lt;</xsl:text>

</xsl:variable>

<xsl:copy-of select="$x"/>

これは&lt;ではなく,<を出力する。


61

X 4169

:2007

disable-output-escaping

属性は,xml 出力メソッドの場合と同様に,html 出力メソッドでも用いてよい。text

出力メソッドは,出力エスケープを実行しないため,disable-output-escaping 属性を無視する。

XSLT

プロセサは,どのように結果木が出力されるかを制御するとき,出力エスケープを無効化できる

だけとする。そうでない場合もある。例えば,出力する代わりに,別の XSLT 変換のソース木として,結

果木を用いてもよい。 XSLT プロセサは,出力エスケープの無効化をサポートすることは必す(須)では

ない。 xsl:value-of 又は xsl:text が出力エスケープが無効化されることを指定し,XSLT プロセサがこれを

サポートしていない場合は,XSLT プロセサは誤りを通知してもよい。誤りを通知しない場合は,出力エ

スケープを無効化しないことによって,誤りから回復しなければならない。

XSLT

プロセサが出力に用いている符号化において表現できない文字に関して,出力エスケープが無効

化される場合は,XSLT プロセサは誤りを通知してよい。誤りを通知しない場合は,出力エスケープを無

効化しないことによって誤りから回復しなければならない。

出力エスケープの無効化は,すべての XSLT プロセサでは動作しなくてもよく,結果が整形式ではない

XML

となり得るため,別の方法がない場合にそれを使用するのが望ましい。

17

適合性

適合する XSLT プロセサは,この規格で指定されるとおりに,ソース木を結果木に変換するために,ス

タイルシートを使用できなければならない。適合する XSLT プロセサは,結果を XML 又はその他の形式

で出力できる必要はない。

注記 XSLT プロセサのベンダは,結果木を XML として出力可能にすることによって,又は DOM 若

しくは SAX などの標準的な API をとおしての結果木へのアクセスを提供することによって,

そのプロセサが適合して振る舞うことを検証する方法を提供することを強く推奨されている。

適合する XSLT プロセサは,この規格が XSLT プロセサに対して誤りを通知しないことを特に許容する

場合以外は,どんな誤りをも通知しなければならない。適合する XSLT プロセサは,それが通知した誤り

から回復してもよいが,必ずしも回復しなくてもよい。

適合する XSLT プロセサは,スタイルシートの処理によって消費される資源の処理に制限を与えてもよ

い。

18

この規格における記法

XSLT

が定義する各要素型の規定の前に,その要素型の要素に関するモデルの形式でその構文の要約が

置かれる。構文要約記法の意味を次に示す。

属性は,その名前が太字である場合及びその場合に限り,必す(須)とする。

属性値の位置に現れる文字列は,その属性の許容された値を指定する。これが波括弧によって囲まれて

いる場合は,属性値は属性値テンプレートとして扱われ,波括弧内に現れる文字列は,属性値テンプレー

トをインスタンス化した結果の可能な値を指定する。別の可能な値は,|によって分離される。引用符で囲

まれた文字列は,その固有の文字列に等しい値を示す。引用符で囲まれていないイタリックの名前は,値

の特定の型を指定する。

要素が空でなくてもよい場合,要素は使用可能な内容を指定するコメントを含む。使用可能な内容は,

XML

の要素型宣言に類似する方法で指定される。template は,テキストノード,リテラル結果要素,拡張

要素及び instruction 分類に属する XSLT 要素の混合が許容されることを意味する。top-level-elements は,

top-level-element

分類に属する XSLT 要素の混合が許容されることを意味する。


62

X 4169

:2007

要素の前には,それが instruction 分類,top-level-element 分類,又はその両方に属するかどうかを示すコ

メントを記述する。要素の分類は,template 又は top-level-elements を許容する要素の内容に,それが許容

されるかどうかだけに影響する。


63

X 4169

:2007

附属書 A

規定) 
文献

序文

この附属書の A.1 は,引用規格について規定する。また,A.2 は参考文献について記載するものであっ

て,規定の一部ではない。

A.1

引用規格(規定)

XML

JIS X 4159:2005

  拡張可能なマーク付け言語(XML) 1.0

注記  World Wide Web Consortium. Extensible Markup Language (XML) 1.0 (Third Edition). W3C

Recommendation.

が,この規格に一致している。

 http://www.w3.org/TR/2004/REC-xml-20040204/

を参照。

XML Names

JIS X 4158:2005

  XML 名前空間

注記  World Wide Web Consortium. Namespaces in XML. W3C Recommendation.  が,この規格に一致

している。http://www.w3.org/TR/REC-xml-names を参照。

XPath

JIS X 4160:2007

  XML パス言語(XPath) 1.0

注記  World Wide Web Consortium. XML Path Language. W3C Recommendation  が,この規格に一致

している。http://www.w3.org/TR/xpath を参照。

A.2

参考文献(参考)

CSS2

World Wide Web Consortium. Cascading Style Sheets, level 2 (CSS2). W3C Recommendation.

注記 http://www.w3.org/TR/1998/REC-CSS2-19980512 を参照。

DSSSL

JIS X 4153:1998

  文書スタイル意味指定言語(DSSSL)

注記 1  International Organization for Standardization, International Electrotechnical Commission.

ISO/IEC 10179:1996, Information technology

−Processing languages−Document Style

Semantics and Specification Language (DSSSL)

が,この規格に一致している。

注記 2  ISO/IEC 10179: 1996 は,Technical Corrigendum 1 が 2001 年に,Amendment 1 が 2003 年に

発行された。それに対応して,2002 年に JIS X 4153  文書スタイル意味指定言語(DSSSL)

(追補 1)

,2005 年に JIS X 4153  文書スタイル意味指定言語(DSSSL)(追補 2)が発行さ

れている。

HTML

World Wide Web Consortium. HTML 4.0 specification. W3C Recommendation.

注記 http://www.w3.org/TR/REC-html40 を参照。


64

X 4169

:2007

IANA

Internet Assigned Numbers Authority. Character Sets.

注記 ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets を参照。

RFC2278

N. Freed, J. Postel. IANA Charset Registration Procedures. IETF RFC 2278.

注記 http://www.ietf.org/rfc/rfc2278.txt を参照。

RFC2376

E. Whitehead, M. Murata. XML Media Types. IETF RFC 2376.

注記 http://www.ietf.org/rfc/rfc2376.txt を参照。

RFC2396

T. Berners-Lee, R. Fielding, and L. Masinter. Uniform Resource Identifiers (URI): Generic Syntax. IETF RFC

2396.

注記 1 http://www.ietf.org/rfc/rfc2396.txt を参照。

注記 2 RFC

2396

は廃止され,RFC 3986 Uniform Resource Identifier (URI): Generic Syntax が公表

されている。http://www.ietf.org/rfc/rfc3986.txt を参照。

UNICODE TR10

Unicode Consortium. Unicode Technical Report #10. Unicode Collation Algorithm. Unicode Technical Report.

注記 http://www.unicode.org/unicode/reports/tr10/index.html を参照。

XHTML

World Wide Web Consortium. XHTML 1.0: The Extensible HyperText Markup Language. W3C Proposed

Recommendation.

注記 http://www.w3.org/TR/xhtml1 を参照。

XPointer

World Wide Web Consortium. XML Pointer Language (XPointer). W3C Working Draft.

注記 http://www.w3.org/TR/xptr を参照。

XML Stylesheet

World Wide Web Consortium. Associating stylesheets with XML documents. W3C Recommendation.

注記 http://www.w3.org/TR/xml-stylesheet を参照。

XSL

World Wide Web Consortium. Extensible Stylesheet Language (XSL). W3C Working Draft.

注記 http://www.w3.org/TR/WD-xsl を参照。


65

X 4169

:2007

附属書 B

規定)

要素構文のまとめ

序文

この附属書は,要素構文のまとめについて規定する。

<!-- Category: instruction -->

<xsl:apply-imports />

<!-- Category: instruction -->

<xsl:apply-templates

  select = node-set-expression

  mode = qname>

    <!-- Content: (xsl:sort | xsl:with-param)* -->

</xsl:apply-templates>

<!-- Category: instruction -->

<xsl:attribute

    name = { qname }

  namespace = { uri-reference }>

  <!-- Content: template -->

</xsl:attribute>

<!-- Category: top-level-element -->

<xsl:attribute-set

    name = qname

  use-attribute-sets = qnames>

  <!-- Content: xsl:attribute* -->

</xsl:attribute-set>

<!-- Category: instruction -->

<xsl:call-template

    name = qname>

  <!-- Content: xsl:with-param* -->

</xsl:call-template>

<!-- Category: instruction -->

<xsl:choose>


66

X 4169

:2007

  <!-- Content: (xsl:when

+, xsl:otherwise?) -->

</xsl:choose>

<!-- Category: instruction -->

<xsl:comment>

  <!-- Content: template -->

</xsl:comment>

<!-- Category: instruction -->

<xsl:copy

  use-attribute-sets = qnames>

  <!-- Content: template -->

</xsl:copy>

<!-- Category: instruction -->

<xsl:copy-of

    select expression />

<!-- Category: top-level-element -->

<xsl:decimal-format

    name = qname

  decimal-separator = char

  grouping-separator = char

  infinity = string

  minus-sign = char

  NaN = string

  percent = char

  per-mille = char

  zero-digit = char

  digit = char

  pattern-separator = char />

<!-- Category: instruction -->

<xsl:element

    name = { qname }

  namespace = { uri-reference }

  use-attribute-sets = qnames>

  <!-- Content: template -->

</xsl:element>


67

X 4169

:2007

<!-- Category: instruction -->

<xsl:fallback>

  <!-- Content: template -->

</xsl:fallback>

<!-- Category: instruction -->

<xsl:for-each

    select = node-set-expression>

  <!-- Content: (xsl:sort*, template) -->

</xsl:for-each>

<!-- Category: instruction -->

<xsl:if

    test = boolean-expression>

  <!-- Content: template -->

</xsl:if>

<xsl:import

    href = uri-reference />

<!-- Category: top-level-element -->

<xsl:include

    href = uri-reference />

<!-- Category: top-level-element -->

<xsl:key

    name = qname

    match = pattern

    use = expression />

<!-- Category: instruction -->

<xsl:message

    terminate = "yes" | "no">

  <!-- Content: template -->

</xsl:message>

<!-- Category: top-level-element -->

<xsl:namespace-alias

    stylesheet-prefix = prefix | "#default"

    result-prefix = prefix | "#default" />


68

X 4169

:2007

<!-- Category: instruction -->

<xsl:number

    level = "single" | "multiple" | "any"

  count = pattern

    from = pattern

    value = number-expression

  format = { string }

  lang = { nmtoken }

    letter-value = { "alphabetic" | "traditional" }

  grouping-separator = { char }

  grouping-size = { number } />

<xsl:otherwise>

  <!-- Content: template -->

</xsl:otherwise>

<!-- Category: top-level-element -->

<xsl:output

    method = "xml" | "html" | "text" | qname-but-not-ncname

  version = nmtoken

  encoding = string

    omit-xml-declaration = "yes" | "no"

    standalone = "yes" | "no"

  doctype-public = string

  doctype-system = string

  cdata-section-elements = qnames

    indent = "yes" | "no"

  media-type = string />

<!-- Category: top-level-element -->

<xsl:param

    name = qname

  select = expression>

  <!-- Content: template -->

</xsl:param>

<!-- Category: top-level-element -->

<xsl:preserve-space

    elements = tokens />


69

X 4169

:2007

<!-- Category: instruction -->

<xsl:processing-instruction

    name = { ncname }>

  <!-- Content: template -->

</xsl:processing-instruction>

<xsl:sort

  select = string-expression

  lang = { nmtoken }

    data-type = { "text" | "number" | qname-but-not-ncname }

    order = { "ascending" | "descending" }

    case-order = { "upper-first" | "lower-first" } />

<!-- Category: top-level-element -->

<xsl:strip-space

    elements = tokens />

<xsl:stylesheet

    id = id

  extension-element-prefixes = tokens

  exclude-result-prefixes = tokens

  version = number>

  <!-- Content: (xsl:import*, top-level-elements) -->

</xsl:stylesheet>

<!-- Category: top-level-element -->

<xsl:template

    match = pattern

    name = qname

  priority = number

  mode = qname>

  <!-- Content: (xsl:param*, template) -->

</xsl:template>

<!-- Category: instruction -->

<xsl:text

    disable-output-escaping = "yes" | "no">

  <!-- Content: #PCDATA -->

</xsl:text>


70

X 4169

:2007

<xsl:transform

    id = id

  extension-element-prefixes = tokens

  exclude-result-prefixes = tokens

    version = number>

  <!-- Content: (xsl:import*, top-level-elements) -->

</xsl:transform>

<!-- Category: instruction -->

<xsl:value-of

    select = string-expression

    disable-output-escaping = "yes" | "no" />

<!-- Category: top-level-element -->

<!-- Category: instruction -->

<xsl:variable

    name = qname

  select = expression>

  <!-- Content: template -->

</xsl:variable>

<xsl:when

    test = boolean-expression>

  <!-- Content: template -->

</xsl:when>

<xsl:with-param

    name = qname

  select = expression>

  <!-- Content: template -->

</xsl:with-param>


71

X 4169

:2007

附属書 C 

参考)

XSLT

スタイルシートの DTD 素片

序文

この附属書は,

XSLT

スタイルシートの DTD 素片について記載するものであって,

規定の一部ではない。

注記 XML1.0

DTD

は,XML 名前空間を利用可能としないので,この DTD 素片は規定ではない。し

たがって,この DTD 素片は,XSLT スタイルシートの可能な構造を正確には記述できない。

次の実体は,特定の結果 DTD のインスタンスを生成する XSLT スタイルシートのための DTD を構成す

るのに使用できる。実体を参照する前に,スタイルシート DTD は,許容される結果要素型をリストした

result-elements

パラメタ実体を定義しなければならない。次に例を示す。

<!ENTITY % result-elements "

  | fo:inline-sequence

  | fo:block

">

これらの結果要素は,xsl:use-attribute-sets 属性及び xsl:extension-element-prefixes 属性をもつことを宣言さ

れるのが望ましい。次の実体は,この目的で,result-element-atts パラメタを宣言する。XSLT が結果要素に

許容する内容は,%template;の内容モデルをもつ次の実体において宣言される XSLT 要素に許容されるもの

と同じになる。DTD は,結果 DTD の制約を反映するために,%template;よりも制限が多い内容モデルを用

いてもよい。

DTD

は,non-xsl-top-level パラメタ実体を定義して,XSLT 名前空間以外の名前空間からの追加の最上位

要素を許容してよい。

この DTD における xsl:接頭辞の使用は,XSLT スタイルシートがこの接頭辞の使用を必要とすることを

意味しない。この DTD の中で宣言されるどの要素も,名前が xmlns:で始まる属性,又はこの DTD で宣言

される属性に加えて名前が xmlns に等しい属性をもってよい。

<!ENTITY % char-instructions "

  | xsl:apply-templates

  | xsl:call-template

  | xsl:apply-imports

  | xsl:for-each

    | xsl:value-of

  | xsl:copy-of

  | xsl:number

  | xsl:choose

  | xsl:if

  | xsl:text

    | xsl:copy

    | xsl:variable


72

X 4169

:2007

  | xsl:message

  | xsl:fallback

">

<!ENTITY % instructions "

  %char-instructions;

  | xsl:processing-instruction

  | xsl:comment

  | xsl:element

  | xsl:attribute

">

<!ENTITY % char-template "

 (#PCDATA

  %char-instructions;)*

">

<!ENTITY % template "

 (#PCDATA

  %instructions;

  %result-elements;)*

">

<!-- Used for the type of an attribute value that is a URI reference.-->

<!ENTITY % URI "CDATA">

<!-- Used for the type of an attribute value that is a pattern.-->

<!ENTITY % pattern "CDATA">

<!-- Used for the type of an attribute value that is an

     attribute value template.-->

<!ENTITY % avt "CDATA">

<!-- Used for the type of an attribute value that is a QName; the prefix

          gets expanded by the XSLT processor. -->

<!ENTITY % qname "NMTOKEN">

<!-- Like qname but a whitespace-separated list of QNames. -->

<!ENTITY % qnames "NMTOKENS">


73

X 4169

:2007

<!-- Used for the type of an attribute value that is an expression.-->

<!ENTITY % expr "CDATA">

<!-- Used for the type of an attribute value that consists

     of a single character.-->

<!ENTITY % char "CDATA">

<!-- Used for the type of an attribute value that is a priority. -->

<!ENTITY % priority "NMTOKEN">

<!ENTITY % space-att "xml:space (default|preserve) #IMPLIED">

<!-- This may be overridden to customize the set of elements allowed

at the top-level. -->

<!ENTITY % non-xsl-top-level "">

<!ENTITY % top-level "

 (xsl:import*

  (xsl:include

  | xsl:strip-space

  | xsl:preserve-space

  | xsl:output

    | xsl:key

  | xsl:decimal-format

  | xsl:attribute-set

    | xsl:variable

    | xsl:param

  | xsl:template

  | xsl:namespace-alias

  %non-xsl-top-level;)*)

">

<!ENTITY % top-level-atts '

  extension-element-prefixes CDATA #IMPLIED

  exclude-result-prefixes CDATA #IMPLIED

    id ID #IMPLIED

  version NMTOKEN #REQUIRED

  xmlns:xsl CDATA #FIXED "http://www.w3.org/1999/XSL/Transform"

  %space-att;


74

X 4169

:2007

'>

<!-- This entity is defined for use in the ATTLIST declaration

for result elements. -->

<!ENTITY % result-element-atts '

  xsl:extension-element-prefixes CDATA #IMPLIED

  xsl:exclude-result-prefixes CDATA #IMPLIED

  xsl:use-attribute-sets %qnames; #IMPLIED

  xsl:version NMTOKEN #IMPLIED

'>

<!ELEMENT xsl:stylesheet %top-level;>

<!ATTLIST xsl:stylesheet %top-level-atts;>

<!ELEMENT xsl:transform %top-level;>

<!ATTLIST xsl:transform %top-level-atts;>

<!ELEMENT xsl:import EMPTY>

<!ATTLIST xsl:import href %URI; #REQUIRED>

<!ELEMENT xsl:include EMPTY>

<!ATTLIST xsl:include href %URI; #REQUIRED>

<!ELEMENT xsl:strip-space EMPTY>

<!ATTLIST xsl:strip-space elements CDATA #REQUIRED>

<!ELEMENT xsl:preserve-space EMPTY>

<!ATTLIST xsl:preserve-space elements CDATA #REQUIRED>

<!ELEMENT xsl:output EMPTY>

<!ATTLIST xsl:output

  method %qname; #IMPLIED

  version NMTOKEN #IMPLIED

  encoding CDATA #IMPLIED

  omit-xml-declaration (yes|no) #IMPLIED

  standalone (yes|no) #IMPLIED

  doctype-public CDATA #IMPLIED

  doctype-system CDATA #IMPLIED

  cdata-section-elements %qnames; #IMPLIED


75

X 4169

:2007

  indent (yes|no) #IMPLIED

  media-type CDATA #IMPLIED

>

<!ELEMENT xsl:key EMPTY>

<!ATTLIST xsl:key

  name %qname; #REQUIRED

  match %pattern; #REQUIRED

  use %expr; #REQUIRED

>

<!ELEMENT xsl:decimal-format EMPTY>

<!ATTLIST xsl:decimal-format

  name %qname; #IMPLIED

  decimal-separator %char; "."

  grouping-separator %char; "

,"

  infinity CDATA "Infinity"

  minus-sign %char; "-"

  NaN CDATA "NaN"

  percent %char; "%"

  per-mille %char; "&#x2030;"

  zero-digit %char; "0"

  digit %char; "#"

  pattern-separator %char; ";"

>

<!ELEMENT xsl:namespace-alias EMPTY>

<!ATTLIST xsl:namespace-alias

  stylesheet-prefix CDATA #REQUIRED

  result-prefix CDATA #REQUIRED

>

<!ELEMENT xsl:template

 (#PCDATA

  %instructions;

  %result-elements;

  | xsl:param)*

>

<!ATTLIST xsl:template


76

X 4169

:2007

  match %pattern; #IMPLIED

  name %qname; #IMPLIED

  priority %priority; #IMPLIED

  mode %qname; #IMPLIED

  %space-att;

>

<!ELEMENT xsl:value-of EMPTY>

<!ATTLIST xsl:value-of

  select %expr; #REQUIRED

  disable-output-escaping (yes|no) "no"

>

<!ELEMENT xsl:copy-of EMPTY>

<!ATTLIST xsl:copy-of select %expr; #REQUIRED>

<!ELEMENT xsl:number EMPTY>

<!ATTLIST xsl:number

   level (single|multiple|any) "single"

   count %pattern; #IMPLIED

   from %pattern; #IMPLIED

   value %expr; #IMPLIED

   format %avt; '1'

   lang %avt; #IMPLIED

   letter-value %avt; #IMPLIED

   grouping-separator %avt; #IMPLIED

   grouping-size %avt; #IMPLIED

>

<!ELEMENT xsl:apply-templates (xsl:sort|xsl:with-param)*>

<!ATTLIST xsl:apply-templates

  select %expr; "node()"

  mode %qname; #IMPLIED

>

<!ELEMENT xsl:apply-imports EMPTY>

<!-- xsl:sort cannot occur after any other elements or

any non-whitespace character -->


77

X 4169

:2007

<!ELEMENT xsl:for-each

 (#PCDATA

  %instructions;

  %result-elements;

    | xsl:sort)*

>

<!ATTLIST xsl:for-each

  select %expr; #REQUIRED

  %space-att;

>

<!ELEMENT xsl:sort EMPTY>

<!ATTLIST xsl:sort

  select %expr; "."

  lang %avt; #IMPLIED

  data-type %avt; "text"

  order %avt; "ascending"

  case-order %avt; #IMPLIED

>

<!ELEMENT xsl:if %template;>

<!ATTLIST xsl:if

  test %expr; #REQUIRED

  %space-att;

>

<!ELEMENT xsl:choose (xsl:when

+, xsl:otherwise?)>

<!ATTLIST xsl:choose %space-att;>

<!ELEMENT xsl:when %template;>

<!ATTLIST xsl:when

  test %expr; #REQUIRED

  %space-att;

>

<!ELEMENT xsl:otherwise %template;>

<!ATTLIST xsl:otherwise %space-att;>

<!ELEMENT xsl:attribute-set (xsl:attribute)*>


78

X 4169

:2007

<!ATTLIST xsl:attribute-set

  name %qname; #REQUIRED

  use-attribute-sets %qnames; #IMPLIED

>

<!ELEMENT xsl:call-template (xsl:with-param)*>

<!ATTLIST xsl:call-template

  name %qname; #REQUIRED

>

<!ELEMENT xsl:with-param %template;>

<!ATTLIST xsl:with-param

  name %qname; #REQUIRED

  select %expr; #IMPLIED

>

<!ELEMENT xsl:variable %template;>

<!ATTLIST xsl:variable

  name %qname; #REQUIRED

  select %expr; #IMPLIED

>

<!ELEMENT xsl:param %template;>

<!ATTLIST xsl:param

  name %qname; #REQUIRED

  select %expr; #IMPLIED

>

<!ELEMENT xsl:text (#PCDATA)>

<!ATTLIST xsl:text

  disable-output-escaping (yes|no) "no"

>

<!ELEMENT xsl:processing-instruction %char-template;>

<!ATTLIST xsl:processing-instruction

  name %avt; #REQUIRED

  %space-att;

>

<!ELEMENT xsl:element %template;>


79

X 4169

:2007

<!ATTLIST xsl:element

  name %avt; #REQUIRED

  namespace %avt; #IMPLIED

  use-attribute-sets %qnames; #IMPLIED

  %space-att;

>

<!ELEMENT xsl:attribute %char-template;>

<!ATTLIST xsl:attribute

  name %avt; #REQUIRED

  namespace %avt; #IMPLIED

  %space-att;

>

<!ELEMENT xsl:comment %char-template;>

<!ATTLIST xsl:comment %space-att;>

<!ELEMENT xsl:copy %template;>

<!ATTLIST xsl:copy

  %space-att;

  use-attribute-sets %qnames; #IMPLIED

>

<!ELEMENT xsl:message %template;>

<!ATTLIST xsl:message

  %space-att;

  terminate (yes|no) "no"

>

<!ELEMENT xsl:fallback %template;>

<!ATTLIST xsl:fallback %space-att;>


80

X 4169

:2007

附属書 D 

参考)

序文

この附属書は,文書及びデータの例について記載するものであって,規定の一部ではない。

D.1

文書の例

この例は,単純 DTD に適合する文書を XHTML[XHTML]に変換するためのスタイルシートとする。そ

の DTD を次に示す。

<!ELEMENT doc (title

, chapter*)>

<!ELEMENT chapter (title

, (para|note)*, section*)>

<!ELEMENT section (title

, (para|note)*)>

<!ELEMENT title (#PCDATA|emph)*>

<!ELEMENT para (#PCDATA|emph)*>

<!ELEMENT note (#PCDATA|emph)*>

<!ELEMENT emph (#PCDATA|emph)*>

スタイルシートを次に示す。

<xsl:stylesheet version="1.0"

                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

                                xmlns="http://www.w3.org/TR/xhtml1/strict">

<xsl:strip-space elements="doc chapter section"/>

<xsl:output

   method="xml"

      indent="yes"

   encoding="iso-8859-1"

/>

<xsl:template match="doc">

 <html>

   <head>

     <title>

       <xsl:value-of select="title"/>

     </title>

   </head>

      <body>

     <xsl:apply-templates/>

   </body>


81

X 4169

:2007

 </html>

</xsl:template>

<xsl:template match="doc/title">

    <h1>

    <xsl:apply-templates/>

  </h1>

</xsl:template>

<xsl:template match="chapter/title">

    <h2>

    <xsl:apply-templates/>

  </h2>

</xsl:template>

<xsl:template match="section/title">

    <h3>

    <xsl:apply-templates/>

  </h3>

</xsl:template>

<xsl:template match="para">

  <p>

    <xsl:apply-templates/>

    </p>

</xsl:template>

<xsl:template match="note">

  <p class="note">

    <b>NOTE: </b>

    <xsl:apply-templates/>

    </p>

</xsl:template>

<xsl:template match="emph">

    <em>

    <xsl:apply-templates/>

  </em>

</xsl:template>

</xsl:stylesheet>


82

X 4169

:2007

次の入力文書を用いる。

<!DOCTYPE doc SYSTEM "doc.dtd">

<doc>

<title>Document Title</title>

<chapter>

<title>Chapter Title</title>

<section>

<title>Section Title</title>

<para>This is a test.</para>

<note>This is a note.</note>

</section>

<section>

<title>Another Section Title</title>

<para>This is <emph>another</emph> test.</para>

<note>This is another note.</note>

</section>

</chapter>

</doc>

それは,次の結果を生成する。

<?xml version="1.0" encoding="iso-8859-1"?>

<html xmlns="http://www.w3.org/TR/xhtml1/strict">

<head>

<title>Document Title</title>

</head>

<body>

<h1>Document Title</h1>

<h2>Chapter Title</h2>

<h3>Section Title</h3>

<p>This is a test.</p>

<p class="note">

<b>NOTE: </b>This is a note.</p>

<h3>Another Section Title</h3>

<p>This is <em>another</em> test.</p>

<p class="note">

<b>NOTE: </b>This is another note.</p>

</body>

</html>

D.2

データの例

次の例は,三つの異なる XSLT スタイルシートを用いて,XML で表現されるデータを変換し,そのデー


83

X 4169

:2007

タの三つの異なる表現,HTML,SVG 及び VRML を生成する。

入力データを次に示す。

<sales>

        <division id="North">

                                <revenue>10</revenue>

                                <growth>9</growth>

                                <bonus>7</bonus>

                </division>

        <division id="South">

                                <revenue>4</revenue>

                                <growth>3</growth>

                                <bonus>4</bonus>

                </division>

        <division id="West">

                                <revenue>6</revenue>

                                <growth>-1.5</growth>

                                <bonus>2</bonus>

                </division>

</sales>

次のスタイルシートは,2.3 に示す簡素化した構文を用いており,データを HTML に変換する。

<html xsl:version="1.0"

      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

            lang="en">

        <head>

        <title>Sales Results By Division</title>

        </head>

        <body>

                <table border="1">

                        <tr>

                                <th>Division</th>

                                <th>Revenue</th>

                                <th>Growth</th>

                                <th>Bonus</th>

                        </tr>

                        <xsl:for-each select="sales/division">

                <!-- order the result by revenue -->

                                <xsl:sort select="revenue"

                                                    data-type="number"

                                                    order="descending"/>

                                <tr>


84

X 4169

:2007

                                        <td>

                                                <em><xsl:value-of select="@id"/></em>

                                        </td>

                                        <td>

                                                <xsl:value-of select="revenue"/>

                                        </td>

                                        <td>

                                                <!-- highlight negative growth in red -->

                                                <xsl:if test="growth &lt; 0">

                                                          <xsl:attribute name="style">

                                 <xsl:text>color:red</xsl:text>

                                                          </xsl:attribute>

                                                </xsl:if>

                                                <xsl:value-of select="growth"/>

                                        </td>

                                        <td>

                                                <xsl:value-of select="bonus"/>

                                        </td>

                                </tr>

                        </xsl:for-each>

                </table>

        </body>

</html>

HTML

出力を次に示す。

<html lang="en">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<title>Sales Results By Division</title>

</head>

<body>

<table border="1">

<tr>

<th>Division</th><th>Revenue</th><th>Growth</th><th>Bonus</th>

</tr>

<tr>

<td><em>North</em></td><td>10</td><td>9</td><td>7</td>

</tr>

<tr>

<td><em>West</em></td><td>6</td><td style="color:red">-1.5</td><td>2</td>

</tr>


85

X 4169

:2007

<tr>

<td><em>South</em></td><td>4</td><td>3</td><td>4</td>

</tr>

</table>

</body>

</html>

次のスタイルシートは,データを SVG に変換する。

<xsl:stylesheet version="1.0"

                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

                xmlns="http://www.w3.org/Graphics/SVG/SVG-19990812.dtd">

<xsl:output method="xml" indent="yes" media-type="image/svg"/>

<xsl:template match="/">

<svg width = "3in" height="3in">

    <g style = "stroke: #000000">

        <!-- draw the axes -->

        <line x1="0" x2="150" y1="150" y2="150"/>

        <line x1="0" x2="0" y1="0" y2="150"/>

        <text x="0" y="10">Revenue</text>

        <text x="150" y="165">Division</text>

        <xsl:for-each select="sales/division">

            <!-- define some useful variables -->

            <!-- the bar's x position -->

                        <xsl:variable name="pos"

                          select="(position()*40)-30"/>

            <!-- the bar's height -->

                        <xsl:variable name="height"

                                                    select="revenue*10"/>

            <!-- the rectangle -->

            <rect x="{$pos}" y="{150-$height}"

                                    width="20" height="{$height}"/>

            <!-- the text label -->

            <text x="{$pos}" y="165">

                                <xsl:value-of select="@id"/>


86

X 4169

:2007

                        </text>

            <!-- the bar value -->

            <text x="{$pos}" y="{145-$height}">

                                <xsl:value-of select="revenue"/>

                        </text>

                </xsl:for-each>

        </g>

</svg>

</xsl:template>

</xsl:stylesheet>

SVG

出力を次に示す。

<svg width="3in" height="3in"

     xmlns="http://www.w3.org/Graphics/SVG/svg-19990412.dtd">

    <g style="stroke: #000000">

        <line x1="0" x2="150" y1="150" y2="150"/>

        <line x1="0" x2="0" y1="0" y2="150"/>

        <text x="0" y="10">Revenue</text>

        <text x="150" y="165">Division</text>

        <rect x="10" y="50" width="20" height="100"/>

        <text x="10" y="165">North</text>

                <text x="10" y="45">10</text>

        <rect x="50" y="110" width="20" height="40"/>

        <text x="50" y="165">South</text>

        <text x="50" y="105">4</text>

        <rect x="90" y="90" width="20" height="60"/>

        <text x="90" y="165">West</text>

                <text x="90" y="85">6</text>

        </g>

</svg>

次のスタイルシートは,データを VRML に変換する。

<xsl:stylesheet version="1.0"

                xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- generate text output as mime type model/vrml

,  using default charset -->

<xsl:output method="text" encoding="UTF-8" media-type="model/vrml"/>

        <xsl:template match="/">#VRML V2.0 utf8

# externproto definition of a single bar element


87

X 4169

:2007

EXTERNPROTO bar [

  field SFInt32 x 

  field SFInt32 y 

  field SFInt32 z

  field SFString name 

    ]

  "http://www.vrml.org/WorkingGroups/dbwork/barProto.wrl"

# inline containing the graph axes

Inline {

        url "http://www.vrml.org/WorkingGroups/dbwork/barAxes.wrl"

                }

                                <xsl:for-each select="sales/division">

bar {

                x <xsl:value-of select="revenue"/>

                y <xsl:value-of select="growth"/>

                z <xsl:value-of select="bonus"/>

                name "<xsl:value-of select="@id"/>"

                }

                                </xsl:for-each>

        </xsl:template>

</xsl:stylesheet>

VRML

出力を次に示す。

#VRML V2.0 utf8

# externproto definition of a single bar element

EXTERNPROTO bar [

  field SFInt32 x 

  field SFInt32 y 

  field SFInt32 z

  field SFString name 

    ]

  "http://www.vrml.org/WorkingGroups/dbwork/barProto.wrl"

# inline containing the graph axes

Inline {

        url "http://www.vrml.org/WorkingGroups/dbwork/barAxes.wrl"


88

X 4169

:2007

                }

bar {

                x 10

                y 9

                z 7

                name "North"

                }

bar {

                x 4

                y 3

                z 4

                name "South"

                }

bar {

                x 6

                y -1.5

                z 2

                name "West"

                }


89

X 4169

:2007

附属書 E

参考)

貢献者

序文

この附属書は,貢献者について記載するものであって,規定の一部ではない。

原勧告の原案の作成に貢献したメンバを次に示す。

a)  Daniel Lipkin, Saba

b)  Jonathan Marsh, Microsoft

c)

Henry Thompson, University of Edinburgh

d) Norman Walsh,

Arbortext

e) Steve

Zilles,

Adobe

原勧告は,W3C の XSL 作業グループ(WG)によって開発され,公開が承認された。原勧告の WG 承認は,

作業グループメンバ全員がその承認を投票したことを必ずしも意味するわけではない。XSL 作業グループ

の現メンバを次に示す。

Sharon Adler, IBM (Co-Chair); Anders Berglund, IBM; Perin Blanchard, Novell; Scott Boag, Lotus; Larry Cable,

Sun; Jeff Caruso, Bitstream; James Clark; Peter Danielsen, Bell Labs; Don Day, IBM; Stephen Deach, Adobe;

Dwayne Dicks, SoftQuad; Andrew Greene, Bitstream; Paul Grosso, Arbortext; Eduardo Gutentag, Sun; Juliane

Harbarth, Software AG; Mickey Kimchi, Enigma; Chris Lilley, W3C; Chris Maden, Exemplary Technologies;

Jonathan Marsh, Microsoft; Alex Milowski, Lexica; Boris Moore, RivCom; Steve Muench, Oracle; Scott Parnell,

Xerox; Vincent Quint, W3C; Dan Rapp, Novell; Gregg Reynolds, Datalogics; Jonathan Robie, Software AG; Mark

Scardina, Oracle; Henry Thompson, University of Edinburgh; Philip Wadler, Bell Labs; Norman Walsh, Arbortext;

Sanjiva Weerawarana, IBM; Steve Zilles, Adobe (Co-Chair)


90

X 4169

:2007

附属書 F

参考)

W3C

勧告案からの変更点

序文

この附属書は,W3C 勧告案からの変更点について記載するものであって,規定の一部ではない。

W3C

勧告案からの変更点を次に示す。

a) xsl:version

属性は,スタイルシートとして使用されるリテラル結果要素において必す(須)とする(2.3

参照)

b) xsl:sort

の data-type 属性は,XSLT が定義しないデータ型を指定するために,接頭辞付きの名前を使用

できる(箇条 10 参照)


91

X 4169

:2007

附属書 G 

参考)

XSLT

の将来版検討における機能

序文

この附属書は,XSLT の将来版検討における機能について記載するものであって,規定の一部ではない。

XSLT 1.0

の後の XSLT の版について,次の機能が検討されている。

a)

条件式

b) XML

スキーマのデータ型及びアーチ型の取込み

c)

元の XSL 提案におけるスタイル規則などに対する機能の取込み

d) XSLT

属性に現れる名前に関するデフォルト名前空間を制御する属性

e)

実体参照のサポート

f)

データモデルにおける DTD の取込み

g)

データモデルにおける記法の取込み

h)

ある要素からそれを参照する要素に戻る方法(例えば,IDREF 属性による)

i)

別文書の中の ID 又はキーを取得する容易な方法

j)

テキストノード,属性値,属性名,要素型名のどれか又はすべてに対するマッチングのための正規表

現の取込み

k)

大文字・小文字を区別しない比較

l)

互換文字などに関する比較前の文字列の正規化

m)

引数の値を相対 URI として扱い,ノードの基底 URI を用いてそれを絶対 URI に変える関数 string

resolve(node-set)

n)

複数の結果文書

o) xsl:value-of

の select 属性の現ノードへのデフォルト化

p)

属性値を正規化する方法を制御するための xsl:attribute の属性

q)

スクリプトの相対順序などの,ソートをさらに制御するための xsl:sort の追加属性

r) URI

が識別する資源のテキストを結果木に入れる方法

s)

[foo/(bar|baz)など]steps の和集合の許容

t)

ノード集合に関して許容されるすべての操作を,結果木の素片に関して許容すること

u)

重複した下位要素又は属性をもつ連続ノードをまとめてグループ化する方法

v) HTML

の style 属性の扱いをもっと便利にする機能