この標準情報(TR)は, 1999年11月にWorld Wide Web Consortium(W3C)から公表されたXSL Transformations (XSLT) Version 1.0勧告を翻訳し, 技術的内容を変更することなく作成した標準情報(TR)(タイプU)である。
この規定は, XML文書を他のXML文書に変換するための言語であるXSLTの構文及びセマンティクスを定義する。
XSLTは,XML用のスタイルシート言語であるXSLの部分としての使用のために設計されている。XSLTに加えて,XSLは, フォーマット化指定のためのXML語い(彙)を含む。XSLは,フォーマット化語い(彙)を使用する別のXML文書に文書を変換する方法を記述するためにXSLTを使用することによって,XML文書のスタイルを指定する。
XSLTは,XSLとは独立に使用する設計もなされている。しかし,XSLTは,完全に一般目的のXML変換言語として意図されたものではなく, その設計の主目的は,XSLTをXSLの部分として使用する場合に必要となる変換にある。
この標準情報(TR)は,XSLT言語の構文及びセマンティクスを定義する。XSLT言語の変換は, XML勧告の名前空間[XML Names]に適合する整形式のXML文書[XML]として表わされ,それは,XSLTが定義する要素もXSLTが定義しない要素も含んでよい。XSLT定義の要素は,固有のXML名前空間に属することによって識別され([2.1 XSLT名前空間]を参照), この標準情報(TR)では,これをXSLT名前空間と呼ぶ。したがって,この標準情報(TR)は,XSLT名前空間の構文及びセマンティクスを定義する。
XSLTで表される変換は,ソース木を結果木に変換するための規則を記述する。パタンをテンプレートに関連付けることによって,変換を達成する。パタンは, ソース木の要素と一致される。テンプレートはインスタンス化されて,結果木の部分を生成する。結果木は, ソース木から分離している。結果木の構造は, ソース木の構造とは全く異なり得る。結果木を構築する際には,ソース木からの要素をフィルタリングしたり,再順序化したりでき,任意の構造を追加することもできる。
XSLTで表される変換をスタイルシートと呼ぶ。これは,XSLTをXSLフォーマット化語い(彙)に変換する際に,その変換がスタイルシートとして機能することによる。
この標準情報(TR)は,XSLTスタイルシートがXML文書にどのように関連付けられるかは指定しない。XSLプロセサが[XML スタイルシート]で記述される機構をサポートすることを推奨する。この機構又はその他の機構が複数のXSLTスタイルシートの列を提供し,一つのXML文書に同時に適用される場合, その効果は,その列の各メンバを順にインポートする単一のスタイルシートを適用する場合と同じであることが望ましい([2.6.2 スタイルシートのインポート]を参照)。
スタイルシートは, テンプレート規則の集合を含む。テンプレート規則は, 次の二つの部分から成る。一つはソース木のノードに一致されるパタンであり,もう一つはインスタンス化できて,結果木の部分を形成するテンプレートとする。これによって,スタイルシートを類似のソース木構造をもつ文書の広いクラスに適用可能にする。
テンプレートは, 特定のソース要素に関してインスタンス化され,結果木の部分を生成する。テンプレートは, リテラル結果要素の構造を指定する要素を含むことができる。テンプレートは,結果木素片を生成するための命令であるXSLT名前空間からの要素も含むことができる。テンプレートがインスタンス化されると,各命令が実行され,それが生成する結果木素片によって置換される。命令は子孫ソース要素を選択し,処理することができる。 子孫要素の処理は,適用可能なテンプレート規則を見つけて,そのテンプレートをインスタンス化することによって結果木素片を生成する。要素は,命令の実行によって選択されたときだけに処理されることに注意すること。結果木は,根ノードに関するテンプレート規則を見つけて,そのテンプレートをインスタンス化することによって構成される。
適用可能なテンプレート規則を見つける処理において,複数のテンプレート規則が, 与えられた要素に一致するパタンをもってもよい。しかし,一つだけのテンプレート規則が適用される。適用するテンプレート規則を決定する方法は,[5.5 テンプレート規則の競合解決]に示す。
テンプレートは一つだけでかなりの能力をもつ。それは, 任意の複雑さをもつ構造を生成でき,ソース木の任意の位置から文字列の値を引き出すことができ,ソース木における要素の出現に応じて繰り返される構造を生成できる。 結果木の構造がソース木の構造とは独立である単純な変換については,スタイルシートは, 単一のテンプレートだけから構成されることも可能であり,それは,完全な結果木のためのテンプレートとして機能する。データを表現するXML文書の変換は,この種のものであることが多い([D.2 データの例]を参照)。 XSLTは,これらのスタイルシートに単純化した構文を適用することを可能にする( [2.3 スタイルシートとしてのリテラル結果要素]を参照)。
テンプレートは,インスタンス化されると,常に現ノード及び現ノードリストに関してインスタンス化される。現ノードは, 常に現ノードリストのメンバである。XSLTの多くのオペレーションは, 現ノードに対応する。わずかな命令だけが, 現ノードリスト又は現ノードを変更する([5 テンプレート規則]及び[8 繰返し]を参照)。これらの命令の一つをインスタンス化する間に,現ノードリストはノードの新リストに変わり,この新リストの各メンバが順に現ノードになる。命令のインスタンス化の完了後は,現ノード及び現ノードリストは,命令がインスタンス化される前の状態に戻る。
XSLTは,[XPath]で定義された式言語を利用して,処理, 条件付き処理及びテキスト生成のための要素の選択を行う。
XSLTは, 言語を拡張するために二つの"フック"を提供する。つまり, テンプレートで使用する命令要素の集合を拡張するためのフック,及びXPathの式で使用する関数の集合を拡張するためのフックを提供する。。これらのフックは, どちらもXML名前空間に基づく。XSLTのこの版は, フックを実装する機構を定義していない。 [14 拡張]を参照のこと。
備考 XSL作業グループは,この規定の今後の版又は別の規定で,この機構を定義する予定である。
XSLTで定義した要素の構文を記述するために用いる要素構文の記法の概要を,[18 記法]に示す。
XSLTスタイルシートには,MIMEメディア型text/xml
及びapplication/xml
[RFC2376]を使用することが望ましい。メディア型は,特にXSLTスタイルシート関して登録することができる。登録すれば,そのメディア型を使用してよい。
XSLT名前空間は, URI http://www.w3.org/1999/XSL/Transform
をもつ。
備考 URIの中の1999
は,W3CがURIを割り当てた年を示し,使用するXSLTの版を示してはいない。使用するXSLTの版は, 属性によって指定する([2.2 スタイルシート要素]及び[2.3 スタイルシートとしてのリテラル結果要素]を参照)。
XSLTプロセサは,この名前空間から要素及び属性を認識するために, XML名前空間の機構[XML Names]を使用しなければならない。XSLT名前空間からの要素は,ソース文書の中ではなく,スタイルシートの中だけで認識される。XSLT定義の要素の完全リストは, [B 要素構文のまとめ]の中で指定される。ベンダは, 追加の要素又は属性でXSLT名前空間を拡張してはならない。代わりに,どんな拡張も, 別の名前空間の中になければならない。追加の命令要素に使用されるどの名前空間も,[14.1 拡張要素 ]の中で指定される拡張要素の機構によって識別されなければならない。
この標準情報(TR)は,XSLT名前空間の要素を参照するために, 接頭辞xsl:
を使用する。しかし,XSLTスタイルシートは,接頭辞をXSLT名前空間のURIに結合する名前空間宣言があれば,どんな接頭辞も自由に使える。
XSLT名前空間の要素は,属性の拡張名が非nullの名前空間URIをもてば,XSLT名前空間からでないどんな属性をもってもよい。これらの属性の存在は,この文書の中で定義するXSLTの要素及び関数の振舞いを変更してはならない。したがって,XSLTプロセサは,これらの属性をいつでも自由に無視でき,それが名前空間URIを認識しなければ,エラーを与えることなく,それらの属性を無視しなければならない。それらの属性は,例えば,一意の識別子,最適化ヒント又はドキュメンテーションを提供できる。
XSLT名前空間からの要素が, この文書の中で要素に関して定義される属性以外の, null名前空間URIをもつ拡張名のついた属性(つまり, 接頭辞なしの名前をもつ属性)をもつことは,エラーとする。
備考 XSLTの要素,属性及び関数の名前に使用する規約は,次のとおりとする。つまり, 名前は, すべて小文字であり,ハイフンを用いて語を分離し,XML又はHTMLなどの関連する言語の構文の中に既に現れている場合だけ,短縮形を使用する。
<xsl:stylesheet
id =
id
extension-element-prefixes = tokens
exclude-result-prefixes = tokens
version = number>
<!--
Content: (xsl:import*,
top-level-elements) -->
</xsl:stylesheet>
<xsl:transform
id =
id
extension-element-prefixes = tokens
exclude-result-prefixes = tokens
version = number>
<!--
Content: (xsl:import*,
top-level-elements) -->
</xsl:transform>
スタイルシートは,XML文書におけるxsl:stylesheet
要素によって表現される。
xsl:transform
は, xsl:stylesheet
の同義語として使用できる。
xsl:stylesheet
要素は,スタイルシートが要求するXSLTの版を示すために, version
属性をもたなければならない。XSLTのこの版に関しては, その値は, 1.0
とする。値が1.0
に等しくないときは,前方互換処理モードが可能になる([2.5 前方互換処理]を参照)。
xsl:stylesheet
要素は, 次の型の要素を含んでよい。
xsl:import
xsl:include
xsl:strip-space
xsl:preserve-space
xsl:output
xsl:key
xsl:decimal-format
xsl:namespace-alias
xsl:attribute-set
xsl:variable
xsl:param
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="..."/> <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を認識しなければ,エラーを与えることなしに最上位要素を無視しなければならない。これらの要素は, 次に例示する情報を与えることができる。
拡張要素又は拡張関数が使用する情報([14 拡張]を参照。),
結果木の処理に関する情報,
ソース木の獲得方法に関する情報,
スタイルシートに関するメタデータ,
スタイルシートのための構造化ドキュメンテーション
根ノードに関して単一のテンプレートだけで構成されるスタイルシートには,簡素化した構文を使用できる。スタイルシートは,リテラル結果要素だけで構成してよい( [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> <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スタイルシートを送るとき,この状況が生じ得る。
内部XSLTオブジェクトの名前,特に名前付きテンプレート([6 名前付きテンプレート]を参照。), モード ([5.7 モード]を参照。), 属性集合([7.1.4 名前付き属性集合]を参照。), キー([12.2 キー]を参照。), 10進フォーマット([12.3 数字のフォーマット化]を参照。), 変数又はパラメタ([11 変数及びパラメタ]を参照。)は,QNameとして指定される。 接頭辞があると,名前が現れる属性に実際に名前空間宣言を使用して,接頭辞がURI参照に拡張される。拡張名は,名前の局所部分とたぶんnullのURI参照とから構成され,オブジェクトの名前として使用される。デフォルト名前空間は,接頭辞なしの名前には使用されない。
要素が, version
属性が1.0
に等しくないxsl:stylesheet
要素であるか, 値が1.0
に等しくないxsl:version
属性をもつリテラル結果要素であるか,xsl:version
属性をもたず, 簡素化された構文を用いるスタイルシートの文書要素であるリテラル結果要素であるか,のどれかである場合([2.3 スタイルシートとしてのリテラル結果要素]を参照。),要素は,要素自体,要素の属性,要素の子孫及びそれらの属性に関して前方互換モードを可能にする。値が1.0
に等しいxsl:version
属性をもつリテラル結果要素は,それ自体,その属性,その子孫及びそれらの属性に関して前方互換モードを不可能にする。
要素が前方互換モードで処理される場合, 次に示すとおりとなる。
要素が最上位要素であって,XSLT 1.0がその要素を最上位要素として許容できないとき,その要素はその内容とともに無視されなければならない。
要素がテンプレートの中の要素であって,XSLT 1.0がその要素をテンプレートの中に現れることを許容しないとき,要素がインスタンス化されなければ, エラーを通知してはならない。要素がインスタンス化されれば,XSLTは[15 フォールバック]に指定されるとおりに,その要素についてフォールバックを実行しなければならない。
要素が,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版の後のXSLが導入する最上位要素に強く依存する場合,そのスタイルシートは, それより前の版のXSLを実装している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>
前方互換モードで処理される属性に式が現れる場合,XSLTプロセサは, 式でのエラーから次のとおり回復しなければならない。
式が, XPath文法が許容する構文に一致しないとき,式が実際に評価されなければ,エラーを通知してはならない。
式が,XSLTライブラリの一部ではない接頭辞なしの名前をもつ関数を呼び出すとき,関数が実際に呼び出されなければ,エラーを通知してはならない。
XSLTが許容しない多くの引数をもつか, XSLTが許容しない型の引数をもつ関数を式が呼び出すとき,関数が実際に呼び出されなけば,エラーを通知してはならない。
XSLTには,スタイルシートを結合する機構が二つ存在する。
<!-- Category:
top-level-element -->
<xsl:include
href =
uri-reference />
XSLTスタイルシートは,xsl:include
要素を使用して,他のXSLTスタイルシートを取り込んでもよい。xsl:include
要素には,href
属性が存在する。この属性の値は,取り込まれるスタイルシートを識別するURI参照とする。相対URIは,xsl:include
要素の基底URIに対して相対的に解決される。([3.2 基底URI]を参照)。
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' を取り込むものとして変更すれば,エラーを回避することができる。
<xsl:import
href = uri-reference />
XSLTスタイルシートは,xsl:import
要素を使用して,他のXSLTスタイルシートをインポートしてもよい。スタイルシートのインポートは,スタイルシートの取込み([2.6.1 スタイルシートの取込み]を参照)と同様とするが,インポートする側のスタイルシートの定義及びテンプレート規則が,インポートされる側のスタイルシートの定義及びテンプレート規則よりも優先される点が異なる。これについては,以降でより詳細に示す。xsl:import
要素は,href
属性をもつ。この属性の値は,インポートされるスタイルシートを識別するURI参照とする。相対URIは,xsl:import
要素の基底URIに対して相対的に解決される([3.2 基底URI]を参照)。
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
要素に対して,一つのインポートの子をもつ。xsl:include
要素は,いずれも,インポート木を構成する前に解決される。インポート木の後順たどり(すなわち,あるxsl:stylesheet
要素をその要素のインポートの子よりも後に訪れるというインポート木のたどり)において,あるxsl:stylesheet
要素がそのインポート木における他のxsl:stylesheet
要素の前に出現した場合,そのxsl:stylesheet
要素は,他のxsl:stylesheet
要素よりも低いインポート優先順位をもつと定義される。各々の定義及びテンプレート規則は,その定義及びテンプレート規則を含むxsl:stylesheet
要素が決定するインポート優先順位をもつ。
例えば,次の例を考える
スタイルシート A は,スタイルシート B 及び C をこの順序でインポートする。
スタイルシート B は,スタイルシート D をインポートする。
スタイルシート C は,スタイルシート E をインポートする。
このときインポートの優先順位は,低い方から,D,B,E,C 及び A となる。
備考xsl:import
要素はいかなる定義又はテンプレート規則より前に出現することを要求されるので,xsl:import
要素に出会った時点でインポートされたスタイルシートを処理する実装は,インポート優先順位が高くなる順に定義及びテンプレート規則に出会うことになる。
一般に,インポート優先順位のより高い定義又はテンプレート規則は,優先順位のより低い定義又はテンプレート規則に優先する。これは,各種の定義及びテンプレート規則に対して詳細に定義される。
スタイルシートがそれ自体を直接的又は間接的にインポートする場合は,エラーとする。これとは別に,特定のURIをもつスタイルシートが複数の場所でインポートされる場合は,特別な扱いをしない。インポート木は,インポートされる場所ごとに別々のxsl:stylesheet
をもつことになる。
備考 xsl:apply-imports
が使用される場合([5.6 テンプレート規則の上書き]を参照),その振る舞いは,インポート優先順位が最も高い場所でだけスタイルシートがインポートされた場合に,異なってもよい。
通常,XSLTスタイルシートは,文書要素としてxsl:stylesheet
要素をもつ完全なXML文書とする。しかし,XSLTスタイルシートは,他の資源に埋め込まれることがあってもよい。次の二つの埋込み形式が,可能となる。
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" 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
要素を無視することを指定するテンプレート規則を含む必要がある。
XSLTが使用するデータモデルは,XPathが使用するデータモデルに3.で示すものを付加したものと同じとする。XSLTは,同じデータモデルを使用している,ソース文書,結果文書及びスタイルシート文書に関して処理を行う。同じ木をもつ二つのXML文書は,いずれも,XSLTによって同じに取り扱われる。
スタイルシートにおける処理命令及びコメントは無視される。すなわち,スタイルシートは,そのスタイルシートを表現する木に処理命令ノードもコメントノードも含まれないものとして取り扱われる。
根ノードの子供に関する通常の制限は,結果木では緩和される。結果木は,ノードの列を,一つの要素ノードに対して可能な子供としてもってよい。特に,結果木は,テキストノードの子供及びどのような数の要素ノードの子供をもってもよい。XML出力メソッド([16. 出力]を参照)を使用して書き出す場合,結果木が整形式のXML文書でない可能性もある。しかし,結果木は,常に整形式の外部一般解析実体となる。
整形式のXML文書を構文解析することによってソース木が生成される場合,ソース木の根ノードは,テキストノードの子供をもたず,要素の子をちょうど一つだけもつという通常の制限を自動的に満たすことになる。他の方法,例えば,DOMを使用して,ソース木が生成される場合には,通常の制約は,結果木の場合と同じようにソース木で緩和される。
どのノードにも基底URIと呼ばれる関連するURIが存在する。これは,相対URIを表現する属性値を絶対URIに変換するために使用される。要素又は処理命令が外部実体で出現する場合,その要素又は処理命令の基底URIは,その外部実体のURIとする。そうでない場合は,基底URIは,その文書の基底URIとする。文書ノードの基底URIは,その文書実体のURIとする。テキストノード,コメントノード,属性ノード又は名前空間ノードに対する基底URIは,そのノードの親の基底URIとする。
根ノードには,文書のDTDで宣言された解析対象外実体の各々に対してURIを与える対応付けが存在する。このURIは,実体宣言で指定されたシステム識別子及び公開識別子から生成される。XSLTプロセサは,公開識別子を使用して,システム識別子で指定されたURIの代わりに,実体に対応するURIを生成してもよい。XSLTプロセサが公開識別子を使用してURIを生成しない場合は,システム識別子を使用しなければならない。すなわち,システム識別子が相対URIである場合は,基底URIとしての実体宣言を含む資源のURIを使用して,絶対URIへと解決しなければならない[RFC2396]。
ソース文書又はスタイルシート文書の木が構成された後で,XSLTが他の処理を行う前に,削除されるテキストノードもある。テキストノードが空白文字だけを含む場合以外は,テキストノードは削除されない。テキストノードを削除することによって,木からテキストノードが取り除かれる。削除処理は,空白を保存しなければならない要素名(以降、空白保存要素名)の集合を入力として取る。削除処理は,スタイルシートにもソース文書にも適用されるが,空白保存要素名の集合は,スタイルシート及びソース文書に対して異なって決定される。
次のいずれかが適用される場合には,テキストノードは保存される。
テキストノードの親の要素名が,空白保存要素名の集合内に存在する。
テキストノードが,少なくとも一つの非空白文字を含む。XMLの場合は,空白文字は,#x20, #x9, #xD又は#xAとする。
テキストノードの先祖要素が,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
の最上位要素によって指定される。これらの要素には,それぞれelements
属性が存在し,その値は空白で区切られたNameTestのリストとする。最初の段階では,空白保存要素名の集合はすべての要素名を含む。要素名がxsl:strip-space
要素のNameTestに一致する場合,その要素名は,空白保存要素名の集合から取り除かれる。要素名がxsl:preserve-space
要素のNameTestに一致する場合,その要素名は,空白保存要素名の集合に追加される。NameTestがXPathのノードテストとしての要素に対して真の場合に限り,要素は,NameTestに一致する。xsl:strip-space
要素への一致とxsl:preserve-space
要素への一致との間で競合が発生した場合は,テンプレート規則間の競合と同じ方法で解決される([5.5 テンプレート規則の競合解決]を参照)。そこで,特定の要素名に適用できる一致は,次のとおりに決定される。
はじめに,インポート優先順位が他の一致よりも低い一致をすべて無視する。
次に,他の一致のNameTestのデフォルト優先順位よりも低いデフォルト優先順位をもつNameTestによる一致をすべて無視する。
二つ以上の一致が残る場合はエラーとする。XSLTプロセサは,このエラーを通知してもよい。エラーを通知しない場合は,残った一致の中から,スタイルシートで最後に出現するものを選択することによって,エラーから回復しなければならない。
XSLTは,XPath[XPath]が定義する式言語を使用する。XSLTでは,次を含む様々な目的に式を使用する。
式は,XPath生成規則のExprに一致しなければならない。
式は,XSLT定義の要素に関する特定の属性値として属性値テンプレートに波括弧で囲まれた形式で出現する。
XSLTでは,最も外側の式,すなわち,他の式の一部ではない式が,その文脈を取得する。その方法を次に示す。
文脈のノードは,現ノードとする。
文脈のサイズは,現ノードリストのサイズとする。
変数の束縛は,式が出現する属性をもつ要素の適用範囲内にある束縛とする([11 変数及びパラメタ]を参照)。
名前空間宣言の集合は,式が出現する属性をもつ要素の適用範囲内に含まれるものとする。これには,XML名前空間勧告[XML Names]が要求する接頭辞xml
の暗黙の宣言を含む。xmlns
よって宣言されるとおりのデフォルト名前空間は,この集合の一部ではない。
関数のライブラリは,コア関数ライブラリ,[12 追加関数]で定義される追加関数及び[14 拡張]で示されるとおりの拡張関数から構成される。式が他の関数への呼出しを含む場合はエラーとする。
ソースノードのリストを処理すると,結果木素片が生成される。結果木は,根ノードだけを含むリストを処理することによって構成される。ソースノードのリストは,リストの各メンバを順に処理することで生成される結果木構造を追加することによって処理される。ノードは,そのノードと一致するパタンをもつすべてのテンプレート規則を見い出し,その中で最適なものを選択することによって,処理される。選択された規則のテンプレートは,現ノードとしてのノード及び現ノードリストとしてのソースノードのリストを用いてインスタンス化される。テンプレートは,通常,処理対象となるソースノードの付加的なリストを選択する命令を含んでいる。一致化,インスタンス化及び選択という過程は,新しいソースノードが処理のために選択されなくなるまで再帰的に繰り返される。
実装は,この処理モデルを使用して処理された場合と同じ結果となる方法であれば,いかなる方法でも,ソース文書を自由に処理できる。
テンプレート規則は,パタンを使用することで,適用されるノードを識別する。テンプレート規則で使用されるのと同様に,パタンは,番号付け([7.7 番号付け]を参照)及びキーの宣言([12.2 キー]を参照)のために使用される。パタンは,ノードに関する条件の集合を指定する。条件を満たすノードは,パタンに一致する。条件を満たさないノードは,パタンに一致しない。パタンの構文は,式の構文の部分集合とする。特に,一定の制限を満たす位置決めバスは,パタンとして使用できる。パタンでもある式は,常にノード集合の型のオブジェクトと評価される。パタンを幾つかの可能な文脈に関して式として評価した結果のメンバにノードがなる場合,そのノードはそのパタンに一致する。ここで,可能な文脈とは,文脈のノードが一致判定の対象となっているノードであるか,又はその先祖のノードである文脈のこととする。
パタンの例を次に示す。
para
は,どのpara
要素とも一致する。
*
は,どの要素とも一致する。
chapter|appendix
は,どのchapter
要素及びどのappendix
要素とも一致する。
olist/item
は,親要素にolist
をもつどのitem
要素とも一致する。
appendix//para
は,先祖要素にappendix
をもつどのpara
要素とも一致する。
/
は,根ノードと一致する。
text()
は,どのテキストノードとも一致する。
processing-instruction()
は,どの処理命令とも一致する。
node()
は,属性ノード及び根ノード以外のどのノードとも一致する。
id("W11")
は,一意な識別子(ID)W11
をもつ要素と一致する。
para[1]
は,その親の最初のpara
子要素であるどのpara
要素とも一致する。
*[position()=1 and self::para]
は,その親の最初の子要素であるどのpara
要素とも一致する。
para[last()=1]
は,その親の唯一のpara
子要素であるどのpara
要素とも一致する。
items/item[position()>1]
は,items
要素の親をもち,その親の最初のitem
子要素ではないどのitem
要素とも一致する。
item[position() mod 2 = 1]
は,その親のitem
という子要素の中で奇数番目であるどのitem
要素に対しても真となる。
div[@class="appendix"]//p
は,class
属性をもち,その値がappendix
であるdiv
要素を先祖としてもつ,どのp
要素とも一致する。
@class
は,どのclass
属性とも一致する。class
属性をもつ要素のことではないことに注意。
@*
は,どの属性とも一致する。
パタンは,Patternの文法と一致しなければならない。Patternは,|
で区切られた位置決めパスのパタンの集合とする。位置決めパスのパタンとは,その段階がすべてchild
軸又はattribute
軸だけを使用する位置決めパスのこととする。パタンは,descendant-or-self
軸を使用してはならないが,演算子/
と同様に演算子//
を使用してもよい。位置決めパスのパタンを,リテラル引数をもつid関数又はkey関数の呼出しで始めることもできる。パタン内の述語には,位置決めパス内の述語と同様に任意の式を使用できる。
[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は,文脈ノードとして一致判定されるノード,及びその文脈ノードの兄弟であって文脈ノードリストとしてNodeTestに一致するものと一緒に評価される。ただし,一致判定されるノードは属性ノードではなく,その場合,文脈ノードリストは,一致判定される属性と同じ親をもちNameTestに一致するすべての属性とする。
次に例を示す。
appendix//ulist/item[position()=1]
この例は,次のすべての場合が真のときに限り,ノードと一致する。
NodeTest item
がノードに対して真であって,そのノードが属性ではない場合。言い換えると,ノードがitem
要素である場合。
文脈ノードとしてのノードと,そのノードの兄弟であって文脈ノードリストとしてのitem
要素であるものとを一緒にしてPredicateExpr position()=1
を評価すると,真となる場合。
ノードがappendix//ulist
に一致する親をもつ場合。これは,appendix
先祖要素をもつulist
要素が親となる場合に真となる。
<!-- 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を
含むことは, エラーとする。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
要素は, ソース要素の子供を
再帰的に処理する。
<!--
Category: instruction -->
<xsl:apply-templates
select =
node-set-expression
mode =
qname>
<!-- Content: (xsl:sort | xsl:with-param)*
-->
</xsl:apply-templates>
次の例は,chapter
要素に関してブロックを生成し,
その直接の子供を処理する。
<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
要素は, 簡単な再順序付けをするために, 単一のテンプレート内で使用できる。次の例は,二つの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>実装がこのループを検知できることがあるかもしれないが,実装が検知できない非終端ループにスタイルシートがはいる可能性がある。 これは,サービスセキュリティリスクの否定を示すものかもしれない。
一つのソースノードは, 複数のテンプレート規則に一致できる。 使用するテンプレート規則の決定方法を次に示す
最初に,最高のインポート優先順位をもつ一致するテンプレート規則(単数又は複数)より低いインポート優先順位をもつ, すべての一致するテンプレート規則を考慮から除外する。
次に, 最高の優先度をもつ一致するテンプレート規則(単数又は複数)より低い優先度をもつすべての一致するテンプレート規則を考慮から除外する。
テンプレート規則の優先度は,テンプレート規則のpriority
属性によって指定される。この値は,オプションとして先頭にマイナス記号(-
)が付く生成規則Numberに一致する, 正又は負の実数でなければならない。 デフォルト優先度は, 次のとおり計算される。
パタンが|
で区切られた複数の選択肢を含むとき,それは, 各選択肢に一つのテンプレート規則の集合と等価に扱われる。
パタンが, ChildOrAttributeAxisSpecifierで始まるQNameの形式をもつか,ChildOrAttributeAxisSpecifierで始まるprocessing-instruction(
Literal)
の形式をもつとき,優先度は0とする。
パタンが, ChildOrAttributeAxisSpecifierで始まるNCName:*
の形式をもつとき,優先度は-0.25とする。
それら以外の場合で, パタンが, ChildOrAttributeAxisSpecifierで始まるNodeTestだけから構成されているとき,優先度は-0.5とする。
それら以外の場合, 優先度は0.5とする。
したがって, 最も普通の種類のパタン(特定の型及び特定の拡張名をもつノードについてテストするパタン)は, 優先度0をもつ。次に固有性の低い種類のパタン(特定の型及び特定の名前空間URIの拡張名をもつノードについてテストするパタン)は, 優先度-0.25をもつ。それより固有性の低いパタン(特定の型をもつノードをテストするだけのパタン)は, 優先度-0.5をもつ。最も普通の種類のパタンよりも固有性の高いパタンは, 優先度0.5をもつ。
この処理が, 複数の一致するテンプレート規則を残すことは, エラーとする。 XSLTプロセサは, エラーを通知してもよい。エラーを通知しないとき,XSLTプロセサは, 残った一致するテンプレート規則の中から,スタイルシートの中に最後に現れる一つを選択することによって,回復しなければならない。
<!--
Category: instruction -->
<xsl:apply-imports />
インポートされるスタイルシートにおいてテンプレート規則を上書きするために使用されるテンプレート規則([5.5 テンプレート規則の競合解決]を参照)は,上書きされたテンプレート規則を呼び出すために, xsl:apply-imports
要素を使用できる。
スタイルシートの処理のどの点でも,現テンプレート規則が存在する。パタンを一致化することによってテンプレート規則が選択されるときは常に,そのテンプレート規則が, 規則のテンプレートのインスタンス化に関する現テンプレート規則となる。
xsl:for-each
要素をインスタンス化すると, 現テンプレート規則は, xsl:for-each
要素の内容のインスタンス化に関してnullとなる。
xsl:apply-imports
は,現テンプレート規則を含むスタイルシート要素の中にインポートされたテンプレート規則だけを使用して,現ノードを処理する。
ノードは, 現テンプレート規則のモードで処理される。現テンプレート規則がnullであるとき,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"> <xsl:apply-imports/> </div> </xsl:template>
組合せの効果は,example
を次の形式の要素に変換することになる。
<div style="border: solid red"><pre>...</pre></div>
モードは, 要素を複数回処理することを可能にし,毎回異なる結果を生成する。
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
要素からのテンプレート規則だけに適用する。
スタイルシートの明示的なテンプレート規則によって,パタンの一致に成功しない場合,再帰的処理を継続可能にするために,組込みテンプレート規則が存在する。 このテンプレート規則は, 要素ノード及び根ノードのどちらにも適用する。 組込みテンプレート規則と等価なものを次に示す。
<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()"/>
名前空間ノードの組込みテンプレート規則も,何もしない。 名前空間ノードと一致することができるパタンは存在しない。そこで,その組込みテンプレート規則は, 名前空間ノードに適用されるテンプレート規則だけとする。
組込みテンプレート規則は,スタイルシートの前に暗黙的にインポートされたかのように扱われるので,他のすべてのテンプレート規則より低いインポート優先順位をもつ。したがって,作成者は,明示的なテンプレート規則を含むことによって,組込みテンプレート規則を上書きできる。
<!--
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に示す。
テンプレートにおいては, 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
要素の子供によってインポートされる又は含まれるどんなスタイルシートをも含まない。
備考 スタイルシートが, ソース木をアドレスするためだけに名前空間宣言を使用する場合,exclude-result-prefixes
属性における接頭辞の指定は,結果木の不必要な名前空間宣言を回避することになる。
リテラル結果要素の属性値は,属性値テンプレートとして解釈される。このテンプレートは,波括弧({}
)の中にある式を含むことができる。
結果木において名前空間URIを指定するために用いられるスタイルシート木の名前空間URIを, リテラル名前空間URIと呼ぶ。 これは次に適用される。
スタイルシートにおけるリテラル結果要素の拡張名の名前空間URI
スタイルシートにおけるリテラル結果要素に指定される属性の拡張名の名前空間 URI
スタイルシートにおけるリテラル結果要素の名前空間ノードの文字列値
<!--
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> <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スタイルシートが, 一般用のセキュリティソフトウェアによって間違って扱われることを引き起こすことがある。 名前空間に関する別名の使用は,これらの間違った扱いの可能性を回避する。
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をもつ。そうでないとき,文字列は, 生成される要素の拡張名の名前空間URIとして使用される。name
属性が指定するQNameの局所部分は,生成される要素の拡張名の局所部分として使用される。
XSLTプロセサは,生成される要素をXMLとして出力するために使用される接頭辞を選択するとき,name
属性で指定されるQNameの接頭辞を利用してもよい。
しかし, それらは必須ではない。
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>
しかし,出力される名前空間宣言になることはない。
要素に属性を追加することは,その要素のどんな既存の属性をも, 同一の拡張名で置き換える。
次はすべてエラーとする。
子供を付加した後で要素に属性を追加すること。実装は, エラーを通知しても,属性を無視してもよい。
要素ではないノードに属性を追加すること。実装は, エラーを通知しても, 属性を無視してもよい。
xsl:attribute
要素の内容をインスタンス化している間に,テキストノード以外のノードを生成すること。実装は,エラーを通知しても,エラー原因のノードを無視してもよい。
備考xsl:attribute
が改行のあるテキストノードを 含む場合,XML出力は文字参照を含まなければならない。次にそれを例示する。<xsl:attribute name="a">x y</xsl:attribute>この記述は,次の出力を与える。a="x
y"(又は,同等のすべての文字参照を出力する結果となる。) XML出力は, 次のとおりではあり得ない。a="x y"これは,XML1.0が, 属性値における改行文字はスペースに正規化されることを要求するが, 改行文字への文字参照は正規化されないことを要求することに基づく。 データモデルの属性値は,正規化後の属性値を表す。 木の属性値に現れる改行が,文字参照としてではなく改行文字として出力された場合, XMLの再構文解析によって生成される木の属性値は,改行ではなくスペースを含むことになる。これは,木が正しく出力されなかったことを意味する。
<!--
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
要素が指定するすべての属性が追加される。
属性に要素を追加することは,要素の既存の属性を同じ名前で置き換えるため,これは,属性集合において指定される属性が, リテラル結果要素自体に指定される属性によって上書きされ得ることを意味する。
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プロセサは, エラーを通知してもよい。エラーを通知しない場合,最も高いインポート優先順位をもつ属性を指定する定義の中から,スタイルシートにおいて最後に指定されたものを選択することによって,エラーから回復しなければならない。属性集合の属性がどこで指定されたかは,属性を属性集合に併合することだけに関係する。属性集合が使用されるとき, それに区別はない。
テンプレートは, テキストノードを含むこともできる。 [3.4 空白の削除]で規定されるとおり,空白を削除した後で残るテンプレートの中の各テキストノードは,結果木に同一の文字列値をもつテキストノードを生成することになる。結果木において隣接するテキストノードは,自動的に併合される。
テキストは, 木レベルで処理されることに注意されたい。したがって,テンプレートの中の<
のマーク付けは,<
という文字を含むテキストノードによって,スタイルシート木に表示されることになる。これは,<
という文字を含む結果木のテキストノードを生成し,それが, XML文書として結果木が表現される際に,<
のマーク付け(又は等価な文字参照)によって表示されることになる。ただしこれは,[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
属性を特別には扱わない。特に次の点に注意すること。
結果木で必要とされる
xml:lang
属性又はxml:space
属性を生成することは,明らかにスタイルシートの作成者の責任とする。XSLT名前空間の要素に
xml:lang
属性又はxml:space
属性を指定することは,xml:lang
属性又はxml:space
属性が結果に現れる原因にはならない。
<!--
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プロセサは, エラーを通知してもよい。エラーを通知しない場合は,後に>
が付くすべての?
の発生の後にスペースを1個挿入することによって, エラーから回復しなければならない。
<!-- 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個挿入することによって, エラーから回復しなければならない。
<!-- 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> </xsl:template>
現ノードが属性である場合,現ノードと同じ名前をもつ属性を生成するために
xsl:attribute
を使用することがエラーとなると,xsl:copy
を使用することもエラーとする( [7.1.3
xsl:attribute
を用いた属性の生成]を参照)。
次の例は,どのように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>
このとき,次を簡単に実行できる。
<xsl:call-template name="apply-templates-copy-lang"/>
次の実行は行わない。
<xsl:apply-templates/>
テンプレート内では, xsl:value-of
要素は, 例えば, ソース木からテキストを抽出したり,変数の値を挿入することによって,生成されたテキストを計算するために利用できる。xsl:value-of
要素は,select
属性の値として指定される式を用いて,これを実行する。波括弧({}
)で式を囲むことによって,リテラル結果要素の属性値の中で式も使用できる。
xsl:value-of
によるテキストの生成<!-- Category:
instruction -->
<xsl:value-of
select =
string-expression
disable-output-escaping = "yes" |
"no" />
xsl:value-of
要素は, インスタンス化されて,結果木にテキストノードを生成する。必須のselect
属性は,式とする。この式は評価され,結果のオブジェクトは,string関数への呼出しによるかのように,文字列に変換される。文字列は,生成されるテキストノードの文字列値を指定する。文字列が空であると,テキストノードは生成されないことになる。生成されたテキストノードは,隣接するすべてのテキストノードと併合される。
xsl:copy-of
要素は, ノード集合を, それを文字列に変換することなく,結果木にコピーするために使用できる。[11.3 xsl:copy-of
による変数値及びパラメタ値の使用]を参照のこと。
例えば, 次は, 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>
リテラル結果要素の属性などの,
属性値テンプレートとして解釈される属性値においては,波括弧({}
)で式を囲むことによって,式を使用できる。
属性値テンプレートは,式とそれを囲む波括弧とを式の評価結果で置き換え,結果オブジェクトをstring関数への呼出しによってのように文字列に変換することによって, インスタンス化される。波括弧は,属性が属性値テンプレートとして解釈されるものとして特に明示されなければ,XSLTスタイルシートの属性値においては認識されない。要素構文のまとめでは,これらの属性の値は, 波括弧で囲まれる。
備考 すべての属性が, 属性値テンプレートとして解釈されるわけではない。その値が式又はパタンである属性,最上位要素の属性及び名前付けされたXSLTオブジェクトを参照する属性は,属性値テンプレートとして解釈されない。さらに, 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"/>
属性値テンプレートがインスタンス化されると,式の外側の2重の左又は右の波括弧は, 1重の波括弧に置換されることになる。右の波括弧が,二つ目の右波括弧が続くことなく,式の外側の属性値テンプレートの中に出現する場合,エラーとする。 式中のリテラル 内にある右波括弧は,式を終了するものとして認識されない。
波括弧は, 式の内部で再帰的に認識されない。次に例を示す。
<a href="#{id({@ref})/title}">
これは, 許容されない。代わりに, 簡単に次のとおりとする。
<a href="#{id(@ref)/title}">
<!-- 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関数への呼出しによるかのように,数値に変換される。
数値は整数に丸められ,[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
要素が, ソース木の現ノードの位置に基づいて番号を挿入する。次の属性は, 現ノードの番号付けの方法を制御する。
level
属性は,ソース木のどのレベルが考慮されるかを指定する。それは, single
, multiple
又はany
の値をもつ。デフォルト値は, single
とする。
count
属性は,どのノードがそのレベルでカウントされるのが望ましいかを指定するパタンとする。count
属性が指定されない場合, 現ノードと同じノード型をもつすべてのノードに一致するパタンがデフォルトとなり,現ノードが拡張名をもつ場合,現ノードと同じ拡張名をもつあらゆるノードに一致するパタンがデフォルトとなる。
from
属性は,カウントの開始位置を指定するパタンとする。
さらに, [7.7.1 数値から文字列への変換属性]で指定される属性は,value
属性が指定される場合と同様に, 数値から文字列への変換に使用する。
xsl:number
要素はまず,level
属性, count
属性及びfrom
属性を使用して,正の整数のリストを構成する。
level="single"
のとき, それは, count
パタンに一致するancester-or-self軸における最初のノードまで遡り,count
パタンに一致する先祖の前の兄弟の数に1を加えたものを含む, 長さ1のリストを構成する。これらの先祖がない場合は,それは空のリストを構成する。from
属性が指定されると,検索される先祖だけが, from
パタンに一致する最も近い先祖の子孫であるそれらとなる。前の兄弟は,ここではpreceding-sibling
軸をもつものと同じ意味をもつ。
level="multiple"
のとき, それは, 要素そのものが最後にくる文書順に並んだ現ノードのすべての先祖のリストを構成する。次に, リストから count
パタンに一致するそれらのノードを選択する。それから, count
パタンに一致するそのノードの前の兄弟の数に1を加えたものに, リストの中の各ノードをマッピングする。
from
属性が指定されない場合は,検索される先祖だけが,from
パタンに一致する最も近い先祖の子孫であるそれらとなる。前の兄弟は,ここではpreceding-sibling
軸をもつものと同じ意味をもつ。
level="any"
のとき, それは, count
パタンに一致し,次の集合に属するノードの数を含む, 長さ1のリストを構成する。その集合は,現ノードと, すべての名前空間ノード及び属性ノードを除いて文書順に現ノードの前ある文書のすべてのレベルのすべてのノードとを含む。(言い換えると,preceding
軸及び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
要素に番号付けを行う。
<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>
次の属性は,数値リストの文字列への変換を制御するために使用される。数値は0よりも大きい整数とする。属性は, すべてオプションとする。
主な属性は, format
とする。
format
属性のデフォルト値は, 1
とする。format
属性は, 各トークンが英数文字の最大シーケンス又は非英数文字の最大シーケンスである, トークンのシーケンスに分割される。英数文字とは,Nd, Nl, No, Lu, Ll, Lt, Lm又はLoのUnicode分類をもつどの文字をも意味する。
英数文字のトークン(フォーマットトークン)は,リストの各数値に使用されるフォーマットを指定する。最初のトークンが非英数文字のトークンであると,構成される文字列は, そのトークンで始まる。最後のトークンが非英数文字であると,構成される文字列は, そのトークンで終わる。二つのフォーマットトークンの間に現れる非英数文字のトークンは,リストの数値を結合するために使用される分離子のトークンとする。
n番目のフォーマットトークンは,リストのn番目の数値をフォーマットするために使用される。フォーマットトークンよりも多くの数値が存在すると,最後のフォーマットトークンが残りの数値をフォーマットするために使用される。フォーマットトークンがない場合,すべての数値をフォーマットするために, 1
のフォーマットトークンが使用される。フォーマットトークンは,数値1を表示するために使用される文字列を指定する。2番目以降の各数値は,その数値をフォーマットするために使用されるフォーマットトークンの前にある分離子のトークンによって,前の数値と分離される。又は,分離子のトークンがない場合,.
(ピリオド文字)によって分離される。
フォーマットトークンは,HTML4.0におけるOL
要素のtype
属性に許容される値のスーパセットとし, 次のとおり解釈される。
最後の文字が, (Unicode文字特性データベースの中で指定される)10進数の値1をもち,その前の文字のUnicodeの値が最後の文字のUnicodeの値よりも1だけ小さいどのトークンも,数値の10進数表現を生成する。そこでは,各数値は, 少なくともフォーマットトークンと同じ長さとする。したがってフォーマットトークン1
は,シーケンス1 2 ... 10 11 12 ...
を生成し,フォーマットトークン01
は,シーケンス01 02 ... 09 10 11 12 ... 99 100 101
を生成する。
フォーマットトークンA
は,シーケンスA B C ... Z AA AB AC...
を生成する。
フォーマットトークンa
は, シーケンスa b c ... z aa
ab ac...
を生成する。
フォーマットトークンi
は,シーケンスi ii iii iv v vi
vii viii ix x ...
を生成する。
フォーマットI
は,シーケンスI II III IV V VI
VII VIII IX X ...
を生成する。
他のどのフォーマットトークンも,そのトークンで開始する番号付けシーケンスを示す。実装がそのトークンで始まる番号付けシーケンスをサポートしないときは,1
のフォーマットトークンを使用しなければならない。
アルファベットのシーケンスで番号付けするとき,lang
属性が, どの言語のアルファベットを使用するかを指定する。それは, [XML]の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
属性の一つだけが指定されると, その指定は無視される。
変換規定の例を次に示す。
format="ア"
は,カタカナの番号付けを指定する。
format="イ"
は, "イロハ"順でのカタカナの番号付けを指定する。
format="๑"
は,タイ数字を使用した番号付けを指定する。
format="א" letter-value="traditional"
は, "伝統的な"ヘブライ語の番号付けを指定する。
format="ა" letter-value="traditional"
は,グルジア語の番号付けを指定する。
format="α" letter-value="traditional"
は,"古代"ギリシャ語の番号付けを指定する。
format="а" letter-value="traditional"
は古代スラブ語の番号付けを指定する。
<!-- 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> <xsl:for-each select="order"> <td> <xsl:apply-templates/> </td> </xsl:for-each> </tr> </xsl:for-each> </tbody> </table> </body> </html> </xsl:template>
XSLTには,テンプレートにおいて条件付き処理をサポートする二つの命令,
xsl:if
及びxsl:choose
がある。
xsl:if
命令は,単純なif-then条件を提供する。
xsl:choose
命令は,幾つもの可能性ある場合に,一つの選択肢を選ぶことをサポートする。
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> </xsl:template>
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:otherwise
要素が後続するxsl:when
要素のシーケンスから構成される。各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"/> </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>
<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
に関する次に示すオプションの属性は,ソートキーのリストをどのようにソートするかを制御する。これらの属性のすべての値は, 属性値テンプレートとして解釈される。
order
は,文字列を昇順にソートするのが望ましいか,降順でソートするのが望ましいかを指定する。ascending
は昇順を指定し,descending
は降順を指定する、デフォルト値はascending
とする。
lang
は, ソートキーの言語を指定する。それは, xml:lang
[XML]と同じ範囲の値をもつ。lang
値が指定されないとき,システム環境から言語を決定するのが望ましい。
data-type
は,文字列のデータ型を指定する。次の値を使用できる。
text
は, ソートキーが, lang
が指定する言語に関して文化的に正しい方式で, 辞書編集的にソートされることを指定する。
number
は, ソートキーが数値に変換され,数値に従ってソートされることを指定する。ソートキーはnumber関数への呼出しを行ったように, 数値に変換される。lang
属性は, 無視される。
接頭辞をもつQNameは,[2.4 修飾された名前]で記述されるとおり,拡張された名前に拡張される。拡張された名前は, データ型を識別する。この場合の振舞いは,この文書で規定されない。
デフォルト値は, text
とする。
備考 XSL作業グループは,XSLTの将来の版が,XMLスキーマを使ってこの属性にさらに値を定義することを計画している。
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
がソートされる。デフォルト値は, 言語に依存する。
備考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"/> </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>
<!-- 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 修飾された名前]で示されるとおりに拡張される。
これら変数束縛要素をどのように使用しても,束縛が見えているスタイルシート木の範囲が存在する。この範囲内では,変数束縛要素それ自体においては見えていた変数の束縛が隠蔽される。したがって,最も内側にある変数の束縛だけが見えることになる。式の有効範囲内にある変数の束縛の集合は,式がスタイルシートに出現する時点で見えている束縛から構成される。
変数は,付加的なデータ型を式言語に導入する。この付加的なデータ型を結果木素片と呼ぶ。四つの基本Xpathデータ型であるstring,number,boolean又はnode-setの一つの代わりに結果木素片に変数を束縛してもよい。結果木素片は,結果木の素片を表現する。結果木素片は,単一の根ノードだけを含むノード集合と等価に扱われる。しかし,結果木素片に関して許可される演算は,ノード集合に関して許可される演算の部分集合とする。演算が文字列に関して許可される場合に限り,結果木素片でその演算が許可される。ただし,文字列に関する演算は,最初に文字列から数値又は論理値への変換処理を含んでもよい。特に,結果木素片では,演算子/
,//
及び[]
の使用は許可されない。許可された演算が結果木素片に関して実行されると,等価なノード集合に関して演算が実行されたのと全く同じに実行される。
結果木素片が結果木にコピーされる場合([11.3 xsl:copy-of
による変数値及びパラメタ値の使用]を参照),等価なノード集合における根ノードの子供であるすべてノードが,順番どおりに結果木に追加される。
式は,結果木素片の変数を参照する,結果木素片を返す拡張関数を呼び出す,又は値が結果木素片であるシステム特性を獲得することによってだけ,結果木素片の型の値を返すことができる。
変数束縛要素は,次の三つのいずれかの方法で,変数の値を指定できる。
変数束縛要素がselect
属性をもつ場合,属性の値は,式でなければならず,変数の値は,式を評価した結果から得られるオブジェクトとなる。この場合,内容は空でなければならない。
変数束縛要素がselect
属性をもたず内容が空ではない場合,すなわち,変数束縛要素が一つ以上の子ノードをもつ場合は,変数束縛要素の内容が値を指定する。変数束縛要素の内容はテンプレートだが,インスタンス化されて変数の値を提供する。値は,テンプレートをインスタンス化することによって生成されるノードの列を子としてもつ単一の根ノードを含むノード集合と等価な結果木素片とする。結果木素片におけるノードの基底URIは,変数束縛要素の基底URIとする。
テンプレートをインスタンス化することによって生成されるノードの列のメンバが属性ノード又は名前空間ノードである場合は,エラーとする。これは,根ノードが,属性ノード又は名前空間ノードを子としてもつことができないことによる。XSLTプロセサはエラーを通知してもよい。エラーを通知しない場合は,その属性ノード又は名前空間ノードを追加しないことによって,エラーから回復しなければならない。
変数束縛要素が空の内容をもち,select
属性をもたない場合,変数の値は,空の文字列とする。そこで,
<xsl:variable name="x"/>
これは次と等価となる。
<xsl:variable name="x" select="''"/>
備考 位置によってノードを選択するために変数を使用する場合は,次をしないように注意すること。<xsl:variable name="n">2</xsl:variable> ... <xsl:value-of select="item[$n]"/>変数n
は数値ではなく結果木素片に束縛されるので,この記述では,最初のitem要素の値を出力することになる。この代わりに,次のとおりにするのがよい。<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]"/>
備考 空のノード集合をパラメタのデフォルト値として指定する便利な方法の一つを次に示す。<xsl:param name="x" select="/.."/>
xsl:copy-of
による変数値及びパラメタ値の使用<!-- Category:
instruction -->
<xsl:copy-of
select =
expression />
xsl:copy-of
要素を使用して,結果木に結果木素片を挿入することができる。この場合,xsl:value-of
のように,最初に文字列に変換する必要はない([7.6.1xsl:value-of
によるテキストの生成]を参照)。必須のselect
属性は,式を含む。式を評価した結果が結果木素片である場合は,完全な素片が,結果木にコピーされる。結果がノード集合である場合は,その集合におけるすべてのノードが,文書の順に結果木にコピーされる。要素ノードをコピーすると,要素ノードそれ自体だけでなく,その要素ノードの属性ノード,名前空間ノード及び子供もコピーされる。根ノードは,その子供をコピーすることによって,コピーされる。結果がノード集合でも結果木素片でもない場合は,xsl:value-of
を使用する場合と同様に,その結果は文字列に変換され,それから,結果木に挿入される。
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>
xsl:variable
及びxsl:param
は,最上位だけでなく,テンプレートでも使用できる。xsl:variable
は,命令が使用できるテンプレート内であれば場所を問わず使用できる。この場合,束縛は,それに続くすべての兄弟及びその子孫に対して見えている。束縛がxsl:variable
要素それ自体に対しては見えていない点に注意すること。xsl:param
は,xsl:template
要素の先頭で子として使用できる。この文脈では,束縛は,それに続くすべての兄弟及びその子孫に対して見えている。束縛がxsl:param
要素それ自体に対しては見えていない点に注意すること。
ある束縛が,他の束縛が見えている位置で出現し,両方の束縛が同じ名前をもつ場合,前者の束縛は,他の束縛を隠蔽する。テンプレート内で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";これは,この記述が存在すると,先頭から始めて最後まで続けるというバッチ的な方法以外で文書を処理する実装の生成が困難になってしまうことによる。
<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:variable
及びxsl:param
に対する場合と同じ方法で指定される。xsl:with-param
要素が指定する値の計算に使用される現ノード及び現ノードリストは,その要素が出現するxsl:apply-templates
要素又はxsl:call-template
要素に使用されるものと同じとする。パラメタ x を,x のためのxsl:param
要素をもたないテンプレートに渡すことは,エラーとはしない。この場合,パラメタは単に無視される。
次の例では,数値のフォーマットを制御するために,引数をもつ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.では,コアXPath関数ライブラリへのXSLT固有の追加を示す。これら追加関数の中には,スタイルシートの最上位要素が指定する情報を利用するものもある。12.では,これらの要素についても示す。
関数 node-set document(object, node-set?)
document関数を使用することによって,主ソース文書以外のXML文書にアクセスすることができる。
document関数が引数を一つだけもち,その引数がノード集合(node-set)である場合,その結果は,引数のノード集合における各ノードに対して,最初の引数をそのノードの文字列値とし,2番目の引数をそのノードを唯一のメンバとしてもつノード集合とするdocument関数を呼び出した結果の和集合をとったものとする。document関数が二つの引数をもち,最初の引数がノード集合である場合,その結果は,引数のノード集合における各ノードに対して,最初の引数をそのノードの文字列値とし,2番目の引数をdocument関数に渡される2番目の引数とするdocument関数を呼び出した結果の和集合をとったものとする。
document関数に対する最初の引数がノード集合ではない場合,最初の引数は,string関数に対する呼出しによるものとして,文字列に変換される。この文字列は,URI参照として取り扱われる。すなわち,URIが識別する資源が検索される。検索動作の結果得られたデータは,XML文書として構文解析され,データモデルに従って木が構成される([3 データモデル]を参照)。資源の検索中にエラーが発生した場合は,XSLTプロセサがエラーを通知してもよい。エラーを通知しない場合は,空のノード集合を返すことによってエラーから回復しなければならない。検索エラーとして考えられるものには,XSLTプロセサがURIによって使用されるURI方式をサポートしない場合がある。XSLTプロセサは,特定のURI方式をサポートすることを要求されない。XSLTプロセサ用の文書化において,XSLTプロセサがどのURI方式をサポートするかを指定するのが望ましい。
URI参照が素片識別子を含まない場合,文書の根ノードだけを含むノード集合が返される。URI参照が素片識別子を含む場合,関数は,URI参照の素片識別子が識別する木のノードを含むノード集合を返す。素片識別子のセマンティクスは,URIの検索結果のメディア型に依存する。素片識別子の処理中にエラーが発生した場合は,XSLTプロセサがエラーを通知してもよい。エラーを通知しない場合は,空のノード集合を返すことによって,エラーから回復しなければならない。考えられるエラーを次に示す。
素片識別子が,XSLTノード集合が表現できないものを識別する場合。例えば,テキストノード内の文字の範囲など。
XSLTプロセサが検索結果のメディア型に対する素片識別子をサポートしない場合。XSLTプロセサは,特定のメディア型のサポートを要求されない。XSLTプロセサ用の文書化において,XSLTプロセサがどのメディア型に対する素片識別子をサポートするかを指定するのが望ましい。
検索動作の結果得られたデータは,検索結果のメディア型に関係なく,XML文書として構文解析される。最上位メディア型がtext
の場合は,メディア型がtext/xml
である場合と同じ方法で構文解析される。それ以外の場合は,メディア型がapplication/xml
である場合と同じ方法で構文解析される。
備考 最上位のxml
メディア型は存在しないので,text/xml
又はapplication/xml
以外のメディア型をもつデータが,実際にはXMLであることもある。
URI参照は相対的であってもよい。2番目の引数のノード集合のうち,文書順で最初にあるノードの基底URI ([3.2 基底URI]を参照)は,相対URIを絶対URIへと解決するための基底URIとして使用される。2番目の引数が省略されている場合は,document関数への呼出しを取り込む式を含むスタイルシートのノードをデフォルトとして使用する。長さがゼロのURI参照は,URI参照がそれに対して相対的に解決されている文書の参照である点に注意すること。したがって,document("")
は,スタイルシートの根ノードを参照する。スタイルシートの木表現は,そのスタイルシートを含むXML文書が最初のソース文書であった場合と全く同じとする。
二つの文書が同じURIによって識別される場合,両者は同一の文書として取り扱われる。比較に使用されるURIは,相対URIが解決された結果の絶対URIであって,素片識別子を含まない。一つの根ノード及び他の根ノードが同じ文書からのものである場合は,両者は同じノードとして取り扱われる。したがって,次の式は常に真となる。
generate-id(document("foo.xml"))=generate-id(document("foo.xml"))
document関数,ノード集合が二つ以上の文書からのノードを含んでもよい可能性が生じさせる。このようなノード集合の場合は,同じ文書における二つのノードの相対的な文書順は,[XPath]が定義する通常の文書順とする。異なる文書における二つのノードの相対的な文書順は,二つのノードを含む文書の実装依存の順序付けによって決定される。実装が文書の順序付けを行う方法には,矛盾しない順序付けを行うこと以外に制約はない。すなわち,実装は,文書の同じ集合に対しては,常に同じ順序を使用しなければならない。
キーの使用によって,暗黙的な相互参照構造を含む文書を扱うことができる。XMLのID
,IDREF
及びIDREFS
の各属性型は,XML文書が相互参照を明示的に行える機構を提供する。XSLTは,XPath id関数を通じてこれをサポートする。しかし,この機構には多くの制限ある。それを次に示す。
ID属性は,DTDにおいてそれ自体のままに宣言されなければならない。ID属性が外部DTDの部分集合でだけID属性として宣言される場合,ID属性として認識されるのは,XMLプロセサが外部DTDの部分集合を読む場合に限られる。しかし,XMLは,XMLプロセサに外部DTDを読むことを要求しない。特に,文書がstandalone="yes"
と宣言されている場合には,XMLプロセサは外部DTDを読まないことを選択してよい。
文書は一意的なIDの集合をただ一つだけ含むことができる。一意的なIDの異なる独立な複数の集合は存在できない。
要素のIDは,属性でだけ指定できる。要素の内容又は子要素による指定はできない。
IDは,XMLの名前に制約される。例えば,スペースを含むことはできない。
要素がもつことができるIDは,最大で一つとする。
多くとも一つの要素が特定のIDをもつことができる。
これらの制限のために,XML文書は,ID/IDREF/IDREFS属性が明示的には宣言しない相互参照構造を含むことがある。
キーは,次の三つから成る。
キーをもつノード
キーの名前(拡張名)
キーの値(文字列)
スタイルシートは,xsl:key
要素を使用して,各文書に対してキーの集合を宣言する。このキーの集合が,ノード x,名前 y 及び値 z をもつメンバを含む場合,ノード x は,名前 y 及び値 z を伴ったキーをもつという。
したがって,キーは一種の一般化IDであって,XML IDと同じ制限には従わない。すなわち,次のとおりとなる。
キーは,xsl:key
要素を使用して,スタイルシートで宣言される。
一つのキーは,一つの値だけでなく一つの名前をもつ。各キーの名前は,識別子の分離し独立した空間を区別するものとして考えてよい。
例えば,属性,子要素又は内容といった,使いやすい場所のどこにでも,要素に対する名前付きキーの値を指定してよい。XPath式が,特定の名前付きキーに対する値を見つける場所を指定するために使用される。
キーの値は,任意の文字列とすることができる。名前とする制約はない。
同じノード及び同じキーの名前をもつが,異なるキーの値をもつ文書には,複数のキーが存在できる。
同じキーの名前及び同じキーの値をもつが,異なるノードをもつ文書には,複数のキーが存在できる。
<!-- 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
属性は,キーの値を指定する式とする。式は,パタンに一致する各ノードごとに一度評価される。結果がノード集合である場合,パタンに一致するノードは,ノード集合における各ノードに対して,その値がノード集合におけるノードの文字列値である指定された名前のキーをもつ。それ以外の場合は,結果は,文字列に変換され,パタンに一致するノードは,その文字列と等しい値をもつ指定された名前のキーをもつ。したがって,xsl:key
要素が次を満たす場合に限り,ノード x は,名前 y 及び値 z を伴ったキーをもつ。
x が,xsl:key
要素のmatch
属性で指定されるパタンに一致する。
xsl:key
要素のname
属性の値が,y に等しい。
xsl:key
要素のuse
属性で指定される式を,x を現ノードとし,x だけを含むノードリストをオブジェクト u を結果として生じる現ノードリストとして評価する場合には,z が,string関数への呼出しによるものとして u を文字列に変換した結果と等しくなるか,又は u がノード集合であって,z が u における一つ以上のノードの文字列値と等しくなるかのいずれかとする。
与えられたノードに一致するxsl:key
要素が二つ以上存在してもよい点に注意すること。同じインポート優先順位をもっていない場合でも,一致するxsl:key
要素すべてが使用される。
use
属性又はmatch
属性のいずれかの値がVariableReferenceを含むことはエラーとする。
関数 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
要素を使用して,関数を定義すると仮定する。
<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/> </a> </b> </xsl:template> <xsl:template match="prototype"> <p><a name="{generate-id()}"> <b>Function: </b> ... </a></p> </xsl:template>
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>
関数 string format-number(number, string, string?)
format-number関数は,2番目の引数によって指定されたフォーマットパタン文字列,及び3番目の引数で名前付けされた10進フォーマットを使用して,最初の引数を文字列に変換する。3番目の引数が存在しない場合は,デフォルトの10進フォーマットが使用される。フォーマットパタン文字列は,JDK 1.1のDecimalFormatクラスが指定する構文に従う。フォーマットパタン文字列は,現地化された記法で表現される。すなわち,その10進フォーマットは,パタンにおいてどの文字が特別な意味をもつかを決定する。ただし,引用文字は現地化されないので例外とする。フォーマットパタンは,通貨記号(#x00A4)を含んではならない。この機能に対するサポートは,JDK1.1の初期リリース後,追加された。10進フォーマット名は,QNameでなければならず,[2.4 修飾された名前]で示されるとおりに拡張される。指定された拡張名をもつ10進フォーマットの宣言をスタイルシートが含まない場合は,エラーとする。
備考 実装は,JDK 1.1の実装を使用することも,Javaで実装することも要求されない。
備考 スタイルシートは,Xpathにおける他の機能を使用して,数字の丸めを制御できる。
<!--
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回以上宣言することはエラーとする。
xsl:decimal-format
の他の属性は,JDK 1.1のDecimalFormatSymbolsクラスのメソッドに対応する。get
メソッド及びset
メソッドの各対に対して,xsl:decimal-format
要素のために定義された属性が一つ存在する。
次の属性は,フォーマットパタンにおける文字の解釈の制御,及び数字のフォーマット化の結果に現れてよい文字の指定の両方を行う。
decimal-separator
は,小数点記号に使用する文字を指定する。デフォルト値は,ピリオド文字(.
)とする。
grouping-separator
は,千単位などのグループ化分離子として使用する文字を指定する。デフォルト値は,コンマ文字(,
)とする。
percent
は,パーセント記号として使用する文字を指定する。デフォルト値は,パーセント文字(%
)とする。
per-mille
は,パーミル(千分率)記号として使用する文字を指定する。デフォルト値は,Unicodeのパーミル(千分率)文字(#x2030)とする。
zero-digit
は,数字のゼロとして使用する文字を指定する。デフォルト値は,数字のゼロ(0
)とする。
次の属性は,フォーマットパタンにおいて文字の解釈を制御する。
digit
は,フォーマットパタンにおいて数字のために使用する文字を指定する。デフォルト値は,番号記号文字(#
)とする。
pattern-separator
は,パタンにおいて正及び負の部分パタンを分離するために使用する文字を指定する。デフォルト値は,セミコロン文字(;
)とする。
次の属性は,数字をフォーマット化した結果に現れてもよい文字又は文字列を指定する。
infinity
は,無限大を表すために使用する文字列を指定する。デフォルト値は,文字列Infinity
とする。
NaN
は,NaN値を表すために使用する文字列を指定する。デフォルト値は,文字列NaN
とする。
minus-sign
は,デフォルトの負記号として使用される文字を指定する。デフォルト値は,ハイフンマイナス文字(-
, #x2D)とする。
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関数をpatternにおいて使用するのはエラーとする。
関数 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は,式の適用範囲にある名前空間宣言を使用して,名前に拡張
<!-- 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"/> <xsl:with-param name="name">problem</xsl:with-param> </xsl:call-template> </xsl:template>
XSLTは,拡張要素及び拡張関数という二種類の拡張を可能にする。
この版のXSLTは,拡張の実装を定義するための機構を提供していない。 したがって,XSLT実装間で移植可能でなければならないXSLTスタイルシートは,利用可能になる特定の拡張に依存できない。XSLTは,XSLTスタイルシートに対して,それを処理するXSLTプロセサが特定の利用可能な拡張の実装をもつかどうかを定義可能にして,それらの拡張が利用できなければ何がおきるかを指定可能にする機構を提供する。 XSLTスタイルシートが注意深くそれらの機構を利用すれば,それは, 拡張を活用し,どのようなXSLT実装でも動作することができる。
要素の拡張機構は,名前空間が拡張名前空間として指定されることを可能にする。名前空間が拡張名前空間として指定され,その名前空間からの名前をもつ要素がテンプレートに現れるとき,要素は,リテラル結果要素としてではなく,命令として扱われる。名前空間は, 命令のセマンティクスを決定する。
備考 xsl:stylesheet
要素の子である要素がテンプレートに現れていないため,非XSLT最上位要素は, ここで定義する拡張要素ではなく,この節の記述はそれには適用しない。
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関数は, その要素の名前に真を返さなければならない。
FunctionCall式の中のFunctionNameが, NCNameではない場合(つまり,それがコロンを含む場合),それは拡張関数への呼出しとして扱われる。FunctionNameは,評価内容からの名前空間宣言を用いて,名前に拡張される。
XSLTプロセサが, 利用可能な特定の名前の拡張関数の実装をもたない場合, function-available関数は, その名前に偽を返さなければならない。これらの拡張関数が式の中に現れ,拡張関数が実際に呼び出される場合,XSLTプロセサは, エラーを通知しなければならない。XSLTプロセサは,利用できる実装がない拡張関数を式が含むという理由だけで,エラーを通知してはならない。
XSLTプロセサが, 利用可能な特定の名前の拡張関数の実装をもつ場合,function-available関数は, その名前に真を返さなければならない。これらの拡張が呼び出される場合,XSLTプロセサは,関数呼出しの引数にそれを渡して, 実装を呼び出さなければならない。実装によって返される結果は,関数呼出しの結果として返される。
<!-- 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は,式の有効範囲にある名前空間宣言を使用して, 拡張名に拡張される。 element-available関数は,拡張名が命令の名前である場合及びその場合に限り,真を返す。拡張名がXSLT名前空間URIに等しい名前空間URIをもつ場合は,それは, XSLTが定義する要素を参照する。 そうでない場合は,それは, 拡張要素を参照する。拡張名がnullの名前空間URIをもつ場合, element-available関数は, 偽を返すことになる。
関数: boolean function-available(string)
引数は, QNameである文字列に評価しなければならない。QNameは,式の有効範囲にある名前空間宣言を使用して, 拡張名に拡張される。 function-available関数は,拡張名が関数ライブラリの中の関数の名前である場合及びその場合に限り,真を返す。拡張名が非nullの名前空間URIをもつ場合,それは, 拡張関数を参照する。そうでない場合は,それは, XPath又はXSLTが定義する関数を参照する。
<!-- 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
属性のデフォルトは, 次のとおり選択される。
結果木の根ノードが, 子要素をもつ。
結果木の根ノード(つまり, 文書要素)の最初の要素の子の拡張名が, (大文字及び小文字のすべての組合せにおける)ローカル部分html
及びnullの名前空間URIをもつ。
結果木の根ノードの最初の要素の子より前のどんなテキストノードも, 空白文字だけを含む。
これらの場合には,デフォルトの出力メソッドは,html
とする。そうでない場合は,デフォルトの出力メソッドはxml
とする。
xsl:output
要素が存在しない場合,又はxsl:output
要素がmethod
属性の値を指定しない場合,デフォルトの出力メソッドを使用するのが望ましい。
xsl:output
の他の属性は,出力メソッドのパラメタを提供する。
使用できる属性を次に示す。
version
は, 出力メソッドの版を指定する。
indent
は,結果木の出力時に,XSLTプロセサが追加の空白を加えてもよいかどうかを指定する。その値は, yes
又はno
でなければならない。
encoding
は,XSLTプロセサが文字のシーケンスをバイトのシーケンスとして符号化するために使用が望れる文字符号化を指定する。属性の値は,大文字及び小文字を区別しないで扱われるのが望ましい。値は, #x21から#x7Eまでの範囲(つまり, 印刷可能ASCII文字)の中の文字だけを含まなければならない。
値は,Internet Assigned Numbers Authority [IANA], [RFC2278]で登録されたcharset
であるか,又はX-
で始まるかのどちらかであることが望ましい。
media-type
は,結果木を出力することから得られるデータのメディア型(MIME内容型)を指定する。charset
パラメタは, 明示的に指定されないのが望ましい。その代わり,最上位メディア型がtext
である場合, 出力メソッドが実際に使用する文字符号化に従って,charset
パラメタが追加されるのが望ましい。
doctype-system
は,文書型宣言に用いられるシステム識別子を指定する。
doctype-public
は,文書型宣言に用いられる公開識別子を指定する。
omit-xml-declaration
は,XSLTプロセサがXML宣言を出力するのが望ましいかどうかを指定する。値は, yes
又はno
でなければならない。
standalone
は,XSLTプロセサがスタンドアロン文書宣言を出力するのが望ましいかどうかを指定する。値は, yes
又はno
でなければならない。
cdata-section-elements
は,そのテキストノードの子供が,CDATAセクションを使用して出力されるのが望ましい要素の名前のリストを指定する。
各属性の詳細なセマンティクスは,それが適用できる各出力メソッドについて,別々に記述される。属性のセマンティクスが出力メソッドに記述されないと,それはその出力メソッドに適用できない。
スタイルシートは, 複数のxsl:output
要素を含んでもよく,
xsl:output
要素をも含むスタイルシートを含んだりインポートしてよい。スタイルシートに現れるxsl:output
要素はすべて,単一の有効なxsl:output
要素に併合される。
cdata-section-elements
属性については,有効な値は,指定された値の和集合とする。他の属性については,有効な値は, 最高のインポート優先順位をもつ指定された値とする。
一つの属性に関して二つ以上のこれらの値があると, それはエラーとする。XSLTプロセサは, エラーを通知してもよい。それがエラーを通知しないとき,スタイルシートの最後に現れる値を使用することによって,エラーから回復するのが望ましい。属性の値は, xsl:output
要素が併合された後に,デフォルトとなる。異なる出力メソッドは,一つの属性に関して,異なるデフォルト値をもってもよい。
xml
出力メソッドは,整形式のXML外部一般解析実体として,結果木を出力する。結果木の根ノードが単一の要素ノードの子をもち,テキストノードの子供をもたない場合,実体は,整形式のXML文書実体であってもよい。実体が, 次のとおり自明のXML文書ラッパーの中で参照される場合を考えよう。
<!DOCTYPE doc [ <!ENTITY e SYSTEM "entity-URI"> ]> <doc>&e;</doc>
ここで, entity-URI
は実体のURIとする。ラッパー文書は, 全体として, XML名前空間の勧告[XML Names]に適合した整形式のXML文書であることが望ましい。さらに,その出力は, 次のとおりであることが望ましい。つまり,[3 データモデル]において指定されたXML文書としてラッパーを構文解析し, 次に文書要素を削除して,その子供要素を代わりに根ノードの子供とすることによって, 新しい木が構成されたとき,新しい木は, 結果木と同じになる。ここで, 次の可能な例外がある。
二つの木における属性の順序は, 異なってもよい。
新しい木は, 結果木に存在しなかった名前空間ノードを含んでもよい。
備考 XSLTプロセサは,XMLとして結果木を出力する過程において,名前空間宣言を追加することを必要としてよい。
XSLTプロセサがdoctype-system
属性のために文書型宣言を生成した場合,前述の要件は,生成された文書型宣言を削除した実体に適用される。
version
属性は,結果木を出力するのに使用するXMLの版を指定する。
XSLTプロセサがXMLのこの版をサポートしないとき,XSLTプロセサがサポートするXMLの版を使用するのが望ましい。XML宣言に出力される版(XML宣言が出力されるとき)は,プロセサが結果木を出力するのに使用したXMLの版に対応するのが望ましい。version
属性の値は,
XML勧告[XML]の生成規則VersionNumに一致するのが望ましい。デフォルト値は1.0
とする。
encoding
属性は,結果木を出力するために用いる望ましい符号化を指定する。
XSLTプロセサは,UTF-8
及びUTF-16
の値を遵守する必要がある。
他の値については,XSLTプロセサが指定された符号化をサポートしない場合,それはエラーを通知してよい。それがエラーを通知しない場合は,代わりにUTF-8
又はUTF-16
を使用するのが望ましい。
XSLTプロセサは,名前がXML勧告[XML]の生成規則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>
としてスタイルシートに書かれたリテラル結果要素の出力は, 次のとおりとなる。
<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
とする。
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
出力メソッドとは異なって,要素を出力しないのが望ましい。
拡張名が非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
要素を追加して,実際に使用される文字符号化を指定するのが望ましい。次に例を示す。
<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
とする。
text
出力メソッドは,エスケープ処理を行うことなく,結果木の各テキストノードの文字列値を文書順に出力することによって,結果木を出力する。
media-type
属性は,text
出力メソッドに適用できる。
media-type
属性のデフォルト値は, text/plain
とする。
encoding
属性は, text
出力メソッドが文字のシーケンスをバイトのシーケンスに変換するために使用するのが望ましい符号化を識別する。デフォルト値は, システムに依存する。結果木が,XSLTプロセサが出力に使用している符号化において表現できない文字を含む場合,XSLTプロセサは, エラーを通知するのが望ましい。
通常, xml
出力メソッドは,テキストノードを出力する際に,&及び<(及び可能なその他の文字)をエスケープする。これは,出力が整形式のXMLであることを確実にする。しかし,ほとんどは整形式のXMLであるが,そうではない部分もある出力を生成できることが便利な場合もある。例えば, 出力が整形式でないセクションを含み,それを, 後続のXMLを知らない処理によって整形式のXMLに変換しようとする場合がある。
このため,XSLTは,出力エスケープを無効化する機構を提供する。xsl:value-of
要素又はxsl:text
要素は, disable-output-escaping
属性をもってもよい。使用できる値は, yes
又はno
とする。デフォルト値は, no
とする。その値がyes
である場合, xsl:value-of
要素又はxsl:text
要素のインスタンス化によって生成されたテキストノードは,エスケープ処理を行わずに出力されるのが望ましい。次に例を示す。
<xsl:text disable-output-escaping="yes"><</xsl:text>
これは,単一の文字<
を生成する。
結果木のテキストノード以外のものに使用されるテキストノードに関して,出力エスケープが無効化されることは, エラーとする。したがって, コメント,処理命令又は属性ノードの文字列値を生成するのに使用するxsl:value-of
要素又はxsl:text
要素に関して,出力エスケープを無効化することは, エラーとする。結果木の素片が, エスケープが無効化されたテキストノードを含む場合に,結果木の素片を数値又は文字列に変換することもエラーとする。どちらの場合も, XSLTプロセサは, エラーを通知してよい。エラーを通知しない場合は,disable-output-escaping
属性を無視することによって,エラーから回復しなければならない。
disable-output-escaping
属性は,xml
出力メソッドの場合と同様に, html
出力メソッドでも使用してよい。text
出力メソッドは,出力エスケープを実行しないため,disable-output-escaping
属性を無視する。
XSLTプロセサは,どのように結果木が出力されるかをそれが制御するとき, 出力エスケープを無効化できるだけとする。そうでない場合もある。例えば,出力する代わりに,別のXSLT変換のソース木として, 結果木を使用してもよい。XSLTプロセサは,出力エスケープの無効化をサポートすることは必須ではない。
xsl:value-of
又はxsl:text
が出力エスケープが無効化されることを指定し,XSLTプロセサがこれをサポートしていない場合は,XSLTプロセサはエラーを通知してもよい。エラーを通知しない場合は,出力エスケープを無効化しないことによって,エラーから回復しなければならない。
XSLTプロセサが出力に使用している符号化において表現できない文字に関して,出力エスケープが無効化される場合は,XSLTプロセサはエラーを通知してよい。エラーを通知しない場合は,それは, 出力エスケープを無効化しないことによってエラーから回復しなければならない。
出力エスケープの無効化は, すべてのXSLTプロセサでは動作しなくてもよく,結果が整形式ではないXMLとなり得るため,別の方法がない場合にそれを使用するのが望ましい。
適合するXSLTプロセサは,この規定で指定されるとおりに,ソース木を結果木に変換するために, スタイルシートを使用できなければならない。適合するXSLTプロセサは,結果をXML又はその他の形式で出力できる必要はない。
備考 XSLTプロセサのベンダは,結果木をXMLとして出力可能にすることによって,又はDOM又はSAXなどの標準的なAPIをとおしての結果木へのアクセスを提供することによって,そのプロセサが適合して振舞うことを検証する方法を提供することを強く推奨されている。
適合するXSLTプロセサは,この規定がXSLTプロセサに対してエラーを通知しないことを特に許容する場合以外は,どんなエラーをも通知しなければならない。適合するXSLTプロセサは,それが通知したエラーから回復してもよいが,必ずしも回復しなくてもよい。
適合するXSLTプロセサは,スタイルシートの処理によって消費される資源の処理に制限を与えてもよい。
XSLTが定義する各要素型の規定は,その要素型の要素に関するモデルの形式でその構文の要約によって前置される。構文要約記法の意味を次に示す。
属性は,その名前が太字である場合及びその場合に限り, 必須とする。
属性値の位置に現れる文字列は,その属性の許容された値を指定する。これが波括弧によって囲まれている場合は,属性値は属性値テンプレートとして扱われ,波括弧内に現れる文字列は, 属性値テンプレートをインスタンス化した結果の可能な値を指定する。別の可能な値は, |
によって分離される。引用符で囲まれた文字列は,その固有の文字列に等しい値を示す。
引用符で囲まれていないイタリックの名前は,値の特定の型を指定する。
要素が空でなくてもよい場合,要素は使用可能な内容を指定するコメントを含む。使用可能な内容は,XMLの要素型宣言に類似する方法で指定される。
templateは, テキストノード,リテラル結果要素,拡張要素及び instruction
分類に属するXSLT要素の混合が許容されることを意味する。
top-level-elementsは,top-level-element
分類に属するXSLT要素の混合が許容されることを意味する。
要素の前には, それが
instruction
分類, top-level-element
分類, 又はその両方に属するかどうかを示すコメントを記述する。要素の分類は,template又はtop-level-elementsを許容する要素の内容に,それが許容されるかどうかだけに影響する。