X 4169:2007
(1)
2019年7月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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ページ
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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
まえがき
この規格は,工業標準化法第12条第1項の規定に基づき,財団法人日本規格協会(JSA)から,工業標準
原案を具して日本工業規格を制定すべきとの申出があり,日本工業標準調査会の審議を経て,経済産業大
臣が制定した日本工業規格である。
この規格は,著作権法で保護対象となっている著作物である。
この規格の一部が,特許権,出願公開後の特許出願,実用新案権又は出願公開後の実用新案登録出願に
抵触する可能性があることに注意を喚起する。経済産業大臣及び日本工業標準調査会は,このような特許
権,出願公開後の特許出願,実用新案権又は出願公開後の実用新案登録出願に係る確認について,責任は
もたない。
原勧告の標題及びまえがきの翻訳
XSL変換(XSLT)1.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)
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
い(彙)を使用する別の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のスタイル作業の一部として作成された。
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
日本工業規格 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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ロセサが[XML スタイルシート]で記述される機構を利用可能にすることを推奨する。この機構又はそ
の他の機構が複数のXSLTスタイルシートのシーケンスを提供し,一つのXML文書に同時に適用される
場合,その効果は,そのシーケンスの各メンバを順にインポートする単一のスタイルシートを適用する場
合と同じであることが望ましい(2.6.2参照)。
注記 原勧告では,外部文書への参照は,[XMLスタイルシート]などといった記述から参照箇所に
リンクされている。ただし,この規格では参照箇所へのリンクは記載しない。代わりに,この
記法によって,附属書Aの対応する項目を参照する。
スタイルシートは,テンプレート規則の集合を含む。テンプレート規則は,次の二つの部分から成る。
一つはソース木のノードとマッチされるパターンであり,もう一つはインスタンス化できて,結果木の部
分を形成するテンプレートである。これによって,一つのスタイルシートを類似のソース木構造をもつ文
書の広いクラスに適用可能にする。
テンプレートは,特定のソース要素に関してインスタンス化され,結果木の部分を生成する。テンプレ
ートは,リテラル結果要素の構造を指定する要素を含むことができる。テンプレートは,結果木素片を生
成するための命令である,XSLT名前空間からの要素も含むことができる。テンプレートがインスタンス
化されると,各命令が実行され,それが生成する結果木素片によって置換される。命令は子孫ソース要素
を選択し,処理することができる。子孫要素の処理は,適用可能なテンプレート規則を見つけて,そのテ
ンプレートをインスタンス化することによって結果木素片を生成する。要素は,命令の実行によって選択
されたときにだけ処理されることに注意する。結果木は,ルートに関するテンプレート規則を見つけて,
そのテンプレートをインスタンス化することによって作成される。
適用可能なテンプレート規則を見つける処理において,複数のテンプレート規則が,与えられた要素に
マッチするパターンをもっていてもよい。しかし,一つだけのテンプレート規則が適用される。適用する
テンプレート規則を決定する方法は,5.5に示す。
テンプレートは一つだけでかなりの能力をもつ。それは,任意の複雑さをもつ構造を生成でき,ソース
木の任意の位置から文字列の値を引き出すことができ,ソース木における要素の出現に応じて繰り返され
る構造を生成できる。結果木の構造がソース木の構造とは独立である単純な変換については,スタイルシ
ートは,単一のテンプレートだけから構成されることも可能であり,それは,完全な結果木のためのテン
プレートとして機能する。データを表現するXML文書の変換は,この種のものであることが多い(D.2
参照)。XSLTは,これらのスタイルシートに対し単純化した構文を適用することを可能にする(2.3参照)。
テンプレートは,インスタンス化されると,常に現ノード及び現ノードリストに関してインスタンス化
される。現ノードは,常に現ノードリストのメンバである。XSLTの多くの操作は,現ノードに対応する。
わずかな命令だけが,現ノードリスト又は現ノードを変更する(箇条5及び箇条8参照)。これらの命令の
一つをインスタンス化する間に,現ノードリストはノードの新リストに変わり,この新リストの各メンバ
が順に現ノードになる。命令のインスタンス化の完了後は,現ノード及び現ノードリストは,命令がイン
スタンス化される前の状態に戻る。
XSLTは,XPath (JIS X 4160)で定義された式言語を利用して,処理,条件付き処理及びテキスト生成の
ための要素の選択を行う。
XSLTは,その言語を拡張するために二つの“フック”を提供する。つまり,テンプレートで使用する
命令要素の集合を拡張するためのフック,及びXPathの式で使用する関数の集合を拡張するためのフック
を提供する。これらのフックは,どちらもXML名前空間に基づく。XSLTのこの版は,フックを実装する
機構を定義していない(箇条14参照)。
3
X 4169:2007
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
注記 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で定義される要素の完全リストは,附属書Bに規定されている。ベンダ
は,要素又は属性を追加してXSLT名前空間を拡張してはならない。そうではなくて,どんな拡張も,別
の名前空間の中になければならない。追加の命令要素に使用されるどの名前空間も,14.1の中で指定され
る拡張要素の機構によって識別されなければならない。
この規格は,XSLT名前空間の要素を参照するために,接頭辞xsl:を使用する。しかし,XSLTスタイル
シートは,接頭辞をXSLT名前空間のURIに結合する名前空間宣言があれば,どんな接頭辞も自由に使え
る。
XSLT名前空間の要素は,属性の展開名(JIS X 4160の箇条5参照)が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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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オブジェクトの名前,特に名前付きテンプレート(箇条6参照),モード (5.7参照),属性
集合(7.1.4参照),キー(12.2参照),10進フォーマット(12.3参照),変数又はパラメタ(箇条11参照)
は,QNameとして指定される。接頭辞があると,名前が現れる属性に実際に名前空間宣言を用いて,接頭
7
X 4169:2007
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
辞がURI参照に展開される。展開名(JIS X 4160の箇条5参照)は,名前の局所部分,及び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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ルシートは,それより前の版の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') < 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>
前方互換モードで処理される属性に式(箇条4参照)が現れる場合,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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
して,一つのインポートの子をもつ。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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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が使用するデータモデルに箇条3で示すものを付加したものと
同じとする。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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
属性ノード又は名前空間ノードに対する基底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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
リストを選択する命令を含んでいる。マッチング,インスタンス化及び選択という過程は,新しいソース
ノードが処理のために選択されなくなるまで再帰的に繰り返される。
実装は,この処理モデルを用いて処理された場合と同じ結果となる方法であれば,いかなる方法でも,
ソース文書を自由に処理できる。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
る。パターン内の述部には,位置パス内の述部と同様に任意の式を使用できる。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
が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属性が,
要求される(箇条6参照)。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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
次の例は,二つの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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<!-- 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に示す。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
注記 スタイルシートが,ソース木をアドレスするためだけに名前空間宣言を使用する場合,
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
そうでないとき,文字列は,生成される要素の展開名の名前空間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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
ない。次にそれを例示する。
<xsl:attribute name="a">x
y</xsl:attribute>
この記述は,次の出力を与える。
a="x
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
することは,要素の既存の属性を同じ名前で置き換えるため,これは,属性集合において指定される属性
が,リテラル結果要素自体に指定される属性によって上書きされ得ることを意味する。
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で規定されるとおり,空白を削除した後で残
るテンプレートの中の各テキストノードは,結果木に同一の文字列値をもつテキストノードを生成するこ
とになる。結果木において隣接するテキストノードは,自動的に併合される。
テキストは,木レベルで処理されることに注意されたい。したがって,テンプレートの中の<のマー
ク付けは,<という文字を含むテキストノードによって,スタイルシート木に表示されることになる。こ
れは,<という文字を含む結果木のテキストノードを生成し,それが,XML文書として結果木が表現され
27
X 4169:2007
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
るときに,<のマーク付け(又は等価な文字参照)によって表示される。ただしこれは,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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
にスペースを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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
</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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
できる(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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
属性値テンプレートとして解釈されない。さらに,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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
軸及び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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
トークンで始まる番号付けシーケンスをサポートしないときは,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="ア"は,片仮名の番号付けを指定する。
b) format="イ"は,“イロハ”順での片仮名の番号付けを指定する。
c) format="๑"は,タイ数字を使用した番号付けを指定する。
d) format="א" letter-value="traditional"は,“伝統的な”ヘブライ語の番号付けを指定する。
e) format="ა" letter-value="traditional"は,グルジア語の番号付けを指定する。
f)
format="α" letter-value="traditional"は,“古代”ギリシャ語の番号付けを指定する。
g) format="а" letter-value="traditional"は,“古代”スラブ語の番号付けを指定する。
36
X 4169:2007
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
</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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
</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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
</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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
してもよい。結果木素片は,結果木の素片を表現する。結果木素片は,単一のルートだけを含むノード集
合と等価に扱われる。しかし,結果木素片に関して許可される演算は,ノード集合に関して許可される演
算の部分集合とする。演算が文字列に関して許可される場合に限り,結果木素片でその演算が許可される。
ただし,文字列に関する演算は,最初に文字列から数値又は論理値への変換処理を含んでもよい。特に,
結果木素片では,演算子/,//及び[]の使用は許可されない。許可された演算が結果木素片に関して実行さ
れると,等価なノード集合に関して演算が実行されたのと全く同じに実行される。
結果木素片が結果木にコピーされる場合(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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
注記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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
意する。
ある束縛が,他の束縛が見えている位置で出現し,両方の束縛が同じ名前をもつ場合,前者の束縛は,
他の束縛を隠ぺいする。テンプレート内で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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
タは単に無視される。
次の例では,数値のフォーマットを制御するために,引数をもつ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(object, node-set?)
document関数を使用することによって,主ソース文書以外のXML文書にアクセスすることができる。
document関数が引数を一つだけもち,その引数がノード集合(node-set)である場合,引数のノード集合に
おける各ノードについて,そのノードの文字列値を1番目の引数とし,そのノードを唯一のメンバとして
もつノード集合を2番目の引数としてdocument関数を呼び出して結果を求め,最後にそれらの結果の和集
合をとったものをこの関数の結果とする。document関数が二つの引数をもち,最初の引数がノード集合で
ある場合,そのノード集合における各ノードについて,ノードの文字列値を1番目の引数とし,元の
document関数に渡される2番目の引数を2番目の引数としてdocument関数を呼び出して結果を求め,最
後にそれらの結果の和集合をとったものをこの関数の結果とする。
document関数に対する最初の引数がノード集合ではない場合,最初の引数は,string関数に対する呼出
しによるものとして,文字列に変換される。この文字列は,URI参照として取り扱われる。すなわち,URI
が識別する資源が検索される。検索動作の結果得られたデータは,XML文書として構文解析され,データ
モデルに従って木が構成される(箇条3参照)。資源の検索中に誤りが発生した場合は,XSLTプロセサが
誤りを通知してもよい。誤りを通知しない場合は,空のノード集合を返すことによって誤りから回復しな
ければならない。検索誤りとして考えられるものには,XSLTプロセサがURIによって使用されるURI方
式をサポートしない場合がある。 XSLTプロセサは,特定のURI方式をサポートすることを要求されない。
XSLTプロセサ用の文書化において,XSLTプロセサがどのURI方式をサポートするかを指定するのが望
ましい。
URI参照が素片識別子を含まない場合,文書のルートだけを含むノード集合が返される。URI参照が素
46
X 4169:2007
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
片識別子を含む場合,関数は,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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
集合を読む場合に限られる。しかし,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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
の値がノード集合におけるノードの文字列値である指定された名前のキーをもつ。それ以外の場合は,結
果は,文字列に変換され,パターンにマッチするノードは,その文字列と等しい値をもつ指定された名前
のキーをもつ。したがって,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(string, object)
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
</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(number, string, string?)
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<!-- 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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
する。デフォルト値は,セミコロン文字(;)とする。
次の属性は,数字をフォーマット化した結果に現れてもよい文字又は文字列を指定する。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
る場合,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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
るか,又は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文書であることが望ましい。さらに,その出力は,次のとおりであることが望
ましい。つまり,箇条3において指定されたXML文書としてラッパを構文解析し,次に文書要素を削除
して,その子要素を代わりにルートの子とすることによって,新しい木が構成されたとき,新しい木は,
結果木と同じになる。ここで,次の可能な例外がある。
a) 二つの木における属性及び名前空間ノードの順序は,異なってもよい。
b) 新しい木は,結果木に存在しなかった名前空間ノードを含んでもよい。
注記 XSLTプロセサは,XMLとして結果木を出力する過程において,名前空間宣言を追加すること
を必要としてよい。
57
X 4169:2007
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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><foo></example>
として,又は
<example><![CDATA[<foo>]]></example>
としてスタイルシートに書かれたリテラル結果要素の出力は,次のとおりとなる。
58
X 4169:2007
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<example><![CDATA[<foo>]]></example>
テキストノードが文字]]>のシーケンスを含む場合,現在開いているCDATAセクションを]]の後で閉じ,
>の前で新しいCDATAセクションを開くのが望ましい。例えば,スタイルシートに次のとおり書かれたリ
テラル結果要素を考える。
<example>]]></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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
って,要素を出力しないのが望ましい。展開名が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 < 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='&{{randomrbg}};'>
これは,次のとおり出力される。
<BODY bgcolor='&{randomrbg};'>
encoding属性は,使用が望まれる符号化を指定する。HEAD要素がある場合,html出力メソッドは,HEAD
要素の開始タグの直後にMETA要素を追加して,実際に使用される文字符号化を指定するのが望ましい。
次に例を示す。
60
X 4169:2007
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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"><</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"><</xsl:text>
</xsl:variable>
<xsl:copy-of select="$x"/>
これは<ではなく,<を出力する。
61
X 4169:2007
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
要素の前には,それがinstruction分類,top-level-element分類,又はその両方に属するかどうかを示すコ
メントを記述する。要素の分類は,template又はtop-level-elementsを許容する要素の内容に,それが許容
されるかどうかだけに影響する。
63
X 4169:2007
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
附属書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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
附属書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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<!-- 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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<!-- 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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<!-- 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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<!-- 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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
附属書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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
| 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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<!-- 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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
'>
<!-- 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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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; "‰"
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<!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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<!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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<!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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
附属書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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
</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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
次の入力文書を用いる。
<!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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
タの三つの異なる表現,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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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 < 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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
<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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
</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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
}
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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
附属書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
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
附属書F
(参考)
W3C勧告案からの変更点
序文
この附属書は,W3C勧告案からの変更点について記載するものであって,規定の一部ではない。
W3C勧告案からの変更点を次に示す。
a) xsl:version属性は,スタイルシートとして使用されるリテラル結果要素において必す(須)とする(2.3
参照)。
b) xsl:sortのdata-type属性は,XSLTが定義しないデータ型を指定するために,接頭辞付きの名前を使用
できる(箇条10参照)。
91
X 4169:2007
2019年7月1日の法改正により名称が変わりました。まえがきを除き,本規格中の「日本工業規格」を「日本産業規格」に読み替えてください。
附属書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属性の扱いをもっと便利にする機能