W3C勧告XSLTのバージョンXSLT 2.0の「Sorting / 並べ替え・ソート」
XSL Transformations (XSLT) Version 2.0 / W3C Recommendation 23 January 2007の目次に沿った日本語訳です。
当サイト管理人が2009年04月、意訳したものですが、構文解釈の違いや翻訳の違いが含まれるかもしれません。正式文書はW3C 各種仕様書(英語版)である事を予めご了承ください。
<< 19. 最終結果ツリー / Final Result Trees
20 シリアライゼーション / Serialization 20.1 文字マップ Character Maps 20.2 出力エスケープを利用不可能にする Disabling Output Escaping |
プロセッサは、オクテットのシーケンスとして最終結果ツリーを出力する場合がありますが、
そうする事が出来る事を要求されるわけではありません(参照:21 一致)。
スタイルシート作者は、結果ツリーをどのようにシリアライズしたいのかを明記する為の xsl:output
宣言の利用が可能です。
もし、プロセッサが、最終結果ツリーをシリアライズする場合には、それは、これらの宣言によって記述したようにそうしなければいけません。
シリアライザーの出力を管理する規則は、[XSLT と XQuery シリアライゼーション]で定義されます。
シリアライゼーションは、シリアライゼーションパラメータの番号を利用して操作されます。
これらのシリアライゼーションパラメータの値は、 xsl:output
、 xsl:result-document
、
xsl:character-map
宣言を利用してスタイルシート内で設定される場合があります。
<!-- カテゴリ:宣言
-->
<xsl:output
name? = qname
method? = "xml" | "html" | "xhtml" | "text" |
qname-but-not-ncname
byte-order-mark? = "yes" | "no"
cdata-section-elements? = qnames
doctype-public? = string
doctype-system? = string
encoding? = string
escape-uri-attributes? = "yes" | "no"
include-content-type? = "yes" | "no"
indent? = "yes" | "no"
media-type? = string
normalization-form? = "NFC" | "NFD" | "NFKC" |
"NFKD" | "fully-normalized" | "none" |
nmtoken
omit-xml-declaration? = "yes" | "no"
standalone? = "yes" | "no" | "omit"
undeclare-prefixes? = "yes" | "no"
use-character-maps? = qnames
version? =
nmtoken />
xsl:output
宣言は、オプションです;
もし、利用した場合には、それは、常にスタイルシートモジュール内で top-level 要素として現れなければいけません。
スタイルシートは、多種多様な xsl:output
宣言を含む場合、
そしてまた、 xsl:output
宣言をも含むスタイルシートモジュールを含むか、または、取り込む場合があります。
xsl:output
宣言の名前は、もしあれば、その name
属性の値です。
[定義:
スタイルシートにある全ての xsl:output
宣言は、名前付き出力定義にまとめられる同じ名前を共有します;
存在しない名前を持つそれらは、単独の名無し出力定義にまとめられます。
]
スタイルシートは、常に、名無し出力定義を含みます;
名無し xsl:output
宣言の欠如では、もし、スタイルシートが、
存在しない属性を持っている xsl:output
宣言を含んだ場合には、
名無し出力定義は、利用されるであろうそれと同等です。
名前付き出力定義は、
その名前が、 xsl:result-document
要素の中で利用した format
属性とマッチする際に利用されます。
名無し出力定義は、 xsl:result-document
要素が、 format
属性を省略する際に利用されます。
それはまた、暗黙の xsl:result-document
要素の欠如の中で暗黙のうちに作成される
最終結果ツリーをシリアライズする際に利用されます。
出力定義を作り上げる全ての xsl:output
要素は、有効にマージされます。
値が、 namespace-sensitive であるそれらの属性において、マージは、語彙的なQNameが、
拡張QNameに変換された後に行われます。
cdata-section-elements
属性においては、その出力定義は、
xsl:output
宣言を構成する全てから得られる値の結合を利用します。
use-character-maps
属性においては、その出力定義は、取り込み優先度、
または、 いくつかが同じ取り込み優先度を持つ場合には、宣言指定内で増加の命令にあるそれらを受け取っている
xsl:output
宣言を構成する全てから得られる拡張QName 値のシーケンスの結合を利用します。
他の属性においては、その出力定義は、
最も高い取り込み優先度を伴う xsl:output
宣言から得られる属性の値を利用します。
[ERR XTSE1560]
もし、出力定義にある2つの xsl:output
宣言が、
より高い取り込み優先度と同じ属性において明快な値を記述する同じ出力定義内に
その他の xsl:output
宣言がある場合を除き、
同等ではない属性の値を伴う( cdata-section-elements
と use-character-maps
ではない)同じ属性において明快な値を明記する場合には、
それは、静的エラーです。
もし、固有の属性における値を明記する 出力定義内に xsl:output
宣言がない場合には、
その一致しているシリアライゼーションパラメータは、既定値を受け取ります。
既定値は、選んだ出力メソッドに依存します。
いくつかのシリアライゼーションパラメータがあり、いくつかの出力メソッドに適用しますが、他には(適用)しません。
例えば、 indent
属性は、 text
出力メソッドにおいては効果がありません。
もし、値が、出力メソッドに適用できない属性を提供される場合には、その値は、シリアライザーを通過されません。
プロセッサは、このような属性の値を妥当性検証する場合がありますが、そうする事を要求されるわけではありません。
手法は、変換を操作するAPIを利用して、優先される xsl:output
宣言の属性、または、変更される既定値を許容する場合があります。
シリアライズされる最終結果ツリーへの位置(格納ファイル内、または、別の場所かどうか)は、
implementation-definedです。
(慣例においては、 implementation-defined APIを利用して操作されるという意味である場合があります)。
しかしながら、これらの位置は、2つの最終結果ツリーが、
両方が共に xsl:result-document
命令の href
属性にある相対URIを利用して
(暗黙のうちに、または、明示的に)作成される場合には、これらの相対URIは、その他の1つのツリーから参照を構築する為に利用される場合があり、
そしてまた、このような参照は、両方の結果ツリーがシリアライズされる際には、妥当なままでなければならないという制約を満たさなければいけません。
xsl:output
要素における method
属性は、
出力となる最終結果ツリーにおいて利用される為にある全般的なメソッドを識別します。
[ERR XTSE1570]
その値は、(もし、存在する場合には、)妥当なQNameにしなければいけません。
もし、そのQNameが、前置詞を持っていない場合には、
それは、[XSLT と XQuery シリアライゼーション]で記述したメソッドを識別し、そしてまた、
xml
、 html
、 xhtml
、または、 text
の1つにしなければいけません。
もし、QNameが前置詞を持つ場合には、QNameは、
5.1 適格な名前で記述したように、拡張QNameに拡張されます;
その拡張QNameは、出力メソッドを識別します;このケースにおける振る舞いはこの文書によって記述されるわけではありません。
method
属性における既定は、シリアライズされているツリーの内容に依存し、そしてまた、次に続くように選ばれます。
もし、最終結果ツリーの文書ノードが、子要素を持つ場合、そしてまた、
ホワイトスペース文字列だけを含む結果ツリーの文書ノードの最初の子要素に先行しているいくつかのテキストノードを持つ場合には、(以下列挙):
もし、この最初の子要素の拡張QNameが、(小文字においては、)ローカル部分 html
と
名前空間 URI http://www.w3.org/1999/xhtml
を持つ場合には、その既定出力メソッドは、普通は、 xhtml
です。
しかしながら、もし、主要なスタイルシートモジュールの
xsl:stylesheet
要素の version
属性が、値 1.0
を持つ場合、そしてまた、
もし、その結果ツリーが、( xsl:result-document
命令によって明快にではなく)暗黙のうちに生成される場合には、
このシチュエーションにある既定出力メソッドは、 xml
です。
もし、この最初の子要素の拡張QNameが、(大文字・小文字のいくつかの組み合わせでは、)
ローカル部分 html
とNullの名前空間 URIを持つ場合には、その既定出力メソッドは、 html
です。
他の全てのケースではその既定出力メソッドは、 xml
です。
もし、選択した出力定義が、 method
属性を含んでいない場合には、その既定出力メソッドが利用されます。
xsl:output
における他の属性は、出力メソッドにおけるパラメータを提供します。
次に続く属性は、(以下を)許容されます:
encoding
属性の値は、シリアライゼーションメソッドに encoding
パラメータの値を提供します。
その既定値は、implementation-definedですが、
xml
と xhtml
メソッドのケースでは、それは、 UTF-8
、または、 UTF-16
のいずれかにしなければいけません。
byte-order-mark
属性は、ファイルの開始位置で[ byte order mark ](バイトオーダーマーク)が書かれるかどうかを定義します。
もし、その値 yes
が記述される場合には、[ byte order mark ]が書かれます;
もし、 no
が記述される場合には、[ byte order mark ]が書かれません。
その既定値は、利用したエンコード方式に依存します。
もし、そのエンコード方式が UTF-16
である場合には、その既定は yes
です;
UTF-8
においては、それは、implementation-definedであり、そしてまた、
他の全てのエンコード方式においては、それは no
です。
[ byte order mark ]の値は、高い[ order byte ]が、低い[ order byte ]の前後いずれに書かれるかを示します;
実際に利用した[ byte order ]は、選択したエンコード方式によって定義される場合を除き、implementation-dependentです。
cdata-section-elements
属性は、QNameのホワイトスペースで区切られたリストです。
その既定値は、カラのリストです。
それらが現れる xsl:output
宣言におけるスコープ内名前空間宣言を利用してこれらの名前として拡張した後、
この名前のリストは、シリアライゼーションメソッドに cdata-section-elements
パラメータの値を提供します。
前置詞なしの名前のケースでは、( xmlns="uri"
を利用して宣言した名前空間である)その既定名前空間が利用されます。
注釈:
これは、スタイルシートの中で利用した他のほとんどのQNameにおける規則とは異なります。
その理由は、これらの名前が、結果文書にある要素を参照するということであり、それゆえに、次に続くリテラル結果要素の名前の時と同じ変換、または、
xsl:element
の name
属性の時と同じ変換であるからです。
doctype-system
属性の値は、シリアライゼーションメソッドに doctype-system
パラメータの値を提供します。
既定によって、そのパラメータが提供されるわけではありません。
doctype-public
属性の値は、シリアライゼーションメソッドに doctype-public
パラメータの値を提供します。
既定によって、そのパラメータが提供されるわけではありません。
escape-uri-attributes
属性の値は、シリアライゼーションメソッドに escape-uri-attributes
パラメータの値を提供します。
その既定値は、 yes
です。
include-content-type
属性の値は、シリアライゼーションメソッドに include-content-type
パラメータの値を提供します。
その既定値は、 yes
です。
indent
属性の値は、シリアライゼーションメソッドに indent
パラメータの値を提供します。
その既定値は、 html
と xhtml
出力メソッドのケースでは、 yes
であり、 xml
出力メソッドのケースでは、 no
です。
media-type
属性の値は、シリアライゼーションメソッドに media-type
パラメータの値を提供します。
その既定値は、 xml
出力メソッドのケースでは、 text/xml
、 html
と xhtml
出力メソッドのケースでは、 text/html
そして、 text
出力メソッドのケースでは、 text/plain
です。
normalization-form
属性の値は、シリアライゼーションメソッドに normalization-form
パラメータの値を提供します。
値が、[implementation-defined]標準形式を明記する normalization-form
属性において一つ一つ列挙されたそれらの内の1つではなく、 NMTOKEN
である;
このケースにおける振る舞いは、この文書によって記述されるわけではありません。
その既定値は、 none
です。
omit-xml-declaration
属性の値は、シリアライゼーションメソッドに omit-xml-declaration
パラメータの値を提供します。
その既定値は、 no
です。
standalone
属性の値は、シリアライゼーションメソッドに standalone
パラメータの値を提供します。
その既定値は、 omit
です; これが意味するところは、それは、存在しない standalone
属性が、XML 宣言に含まれるということです。
undeclare-prefixes
属性は、生成が、 method="xml"
と version="1.1"
(または、後者)を伴い出力される際に限り、関連します。
それは、子要素が、その親要素の名前空間ノードと同じ(名前空間前置詞の)名前を伴う存在しない名前空間ノードを持つ際に、
(形式 xmlns:foo=""
の)宣言していない名前空間が、出力されるべきかどうかを定義します。.
その既定値は、 no
です:これが意味するところは、その名前空間未宣言は、結果となるXMLが再度解析される際にその効果を持つそれは出力されず、
新しいツリーが、シリアライゼーション前のオリジナルツリーに存在していなかった子要素上に名前空間ノードを含む場合があるという事です。
use-character-maps
属性は、この出力定義を結合する中で利用される名前付き文字列マップのリストを提供します。
この属性が利用される方法は、20.1 文字列マップで記述されます。
その既定値は、カラのリストです。
version
属性の値は、シリアライゼーションメソッドに version
パラメータの値を提供します。
許容した値のセットと既定値は、implementation-definedです。
シリアライゼーションエラーは、もし、要求したバージョンが手法によってサポートされない場合に報告されるでしょう。
もし、プロセッサがシリアライゼーションを実行する場合には、それは、出現するいくつかの回復不能なシリアライゼーションエラーをシグナル出力しなければいけません。 これらは、回復されない動的エラーと同じ効果を持ちます: それは、プロセッサは、エラーを出力しなければならず、変換が成功していたかのように終了してはいけないという事です。
[定義: 文字マップ(character map)は、シリアライゼーションしている文字列として記述した文字列によって代用される最終結果ツリーにある テキスト、または、属性 ノードに現れている明記する文字を許容します。 ] 文字列マップの効果は、[XSLT と XQuery シリアライゼーション]の中で定義されます。
シリアライザーにパラメータとして提供した文字列マップは、選択した出力定義における
xsl:output
宣言から参照した xsl:character-map
要素から決められます。
その xsl:character-map
要素は、 xsl:stylesheet
要素の子として
出現する場合がある宣言です。
<!-- カテゴリ:宣言 -->
<xsl:character-map
name = qname
use-character-maps? =
qnames>
<!-- Content: (xsl:output-character*)
-->
</xsl:character-map>
その xsl:character-map
宣言は、名前と文字マッピングのセットを伴う文字マップを宣言します。
文字マッピングは、xsl:character-map
要素内で直接、または、更に先の use-character-maps
属性の中で参照した文字列マップ内の
いずれかに含んだ xsl:output-character
要素という意味で記述されます。
要求した name
属性は、文字マップにおける名前を提供します。
文字マップが、出力定義、または、その他の文字マップによって利用される際に、
最も高い取り込み優先度を伴う文字マップが利用されます。
[ERR XTSE1580] もし、スタイルシートが、2つ以上同じ名前と同じ取り込み優先度を含む場合には、 同じ名前とより高い取り込み優先度を伴うその他の文字マップをも含む場合を除き、それは、静的エラーです。
付加的な use-character-maps
属性は、この文字マップに含まれる更に先の文字列マップの名前を列挙します。
[ERR XTSE1590]
もし、 xsl:output
、または、 xsl:character-map
要素の
use-character-maps
属性にある名前が、スタイルシートにある
いくつかの xsl:character-map
の name
属性とマッチしない場合には、
それは、静的エラーです。
[ERR XTSE1600]
もし、文字マップがそれ自身を直接、または、 use-character-maps
属性にある名前経由で間接的に参照する場合には、それは、静的エラーです。
仮に、同じ文字マップが直接または、間接的に一回以上参照されるという場合は、エラーではありません。
出力定義は、
その use-character-maps
属性経由で参照した文字列マップの再帰的な拡張後、同じ文字においていくつかのマッピングを含む場合があります。
このシチュエーションでは、最後の文字マッピングが優先権を取得します。
命令の確立の為に、次に続く規則が利用されます:
単独の xsl:character-map
要素の中では、
use-character-maps
属性の中で参照した文字列マップ内に定義した文字は、
子 xsl:output-character
要素の中で定義した文字の前に考慮されます。
単独の use-character-maps
属性内で参照した文字列マップは、それらがその属性内で列挙されている命令の中で考慮されます。
文字マップを depth-first: ごとに参照される拡張は、次の1つが考慮される前に完全に拡張されます。
同じ xsl:character-map
要素の子として現れている
2つの xsl:output-character
要素は、文書命令の中で考慮されます。
xsl:output-character
要素は、次に続くように定義されます:
<xsl:output-character
character = char
string =
string />
シリアライザーへのパラメータとして通過される文字マップは、 string
属性で記述した文字列への character
属性で記述した文字列におけるマッピングを含みます。
文字マッピングは、20.2 出力エスケープを使用不可にするで明記したように利用不可となっている出力エスケープにおける文字列に適用するものではありません。
もし、文字がマップされる場合には、それは、エスケープしている XML 、または、 HTML に委ねられません。
文字マップは、フォーマットの中で生成が出力をシリアライズした時に有益となる事ができ、 HTML 、または、 XML に似ていますが、厳密には一致しません。 例えば、出力が、JSPページである場合には、それらは出力を生成する必要があるかもしれません:
<jsp:setProperty name="user" property="id" value='<%= "id" + idValue %>'/>
たとえ、この出力が整形式XML、または、 HTMLではないとしても、それは、 Java Server Pages (JSP) の中では妥当(有効)です。
これは、(いくつかの他の目的においては必要とされない)文字列 <%
、 %>
、 "
を表示する為に3つのUnicode文字を領域確保する事によって達成する事が可能です。
例えば、:
<xsl:character-map name="jsp"> <xsl:output-character character="≪" 文字列="<%"/> <xsl:output-character character="≫" 文字列="%>"/> <xsl:output-character character="§" 文字列='"'/> </xsl:character-map>
この文字マップが xsl:output
宣言の中で参照される際には、
その要求した出力は、スタイルシートの中で次に続けて書く事によって作成される事が可能です:
<jsp:setProperty name="user" property="id" value='≪= §id§ + idValue ≫'/>
この作業は、アポストロフィ、または、クォーテーションマークが、文字列マップの利用によって属性値の一部として生成される際に、 シリアライザーが属性値を囲むデリミタ(区切り)の(どこでも可能な)他の選択を利用するだろうという前提です。
次に続く例は、一般的な慣習に従うモジュール内で構築した各種の要素から成る文字マップを例示します:
<xsl:output name="htmlDoc" use-character-maps="htmlDoc" /> <xsl:character-map name="htmlDoc" use-character-maps="html-chars doc-entities windows-format" /> <xsl:character-map name="html-chars" use-character-maps="latin1 ..." /> <xsl:character-map name="latin1"> <xsl:output-character character=" " string="&nbsp;" /> <xsl:output-character character="¡" string="&iexcl;" /> ... </xsl:character-map> <xsl:character-map name="doc-entities"> <xsl:output-character character="" string="&t-and-c;" /> <xsl:output-character character="" string="&chap1;" /> <xsl:output-character character="" string="&chap2;" /> ... </xsl:character-map> <xsl:character-map name="windows-format"> <!-- newlines as CRLF --> <xsl:output-character character="
" string="
" /> <!-- tabs as three spaces --> <xsl:output-character character="	" string=" " /> <!-- images for special characters --> <xsl:output-character character="" 文字列="<img src='special1.gif' />" /> <xsl:output-character character="" 文字列="<img src='special2.gif' />" /> ... </xsl:character-map>
普通、 XML 、 HTML 、または、 XHTML 出力メソッドを利用する際には、シリアライザーは、テキストノードを出力する際、 &
と <
のような特殊文字をエスケープするでしょう。
これは、出力が整形式である事を保証します。
しかしながら、それは、時には、ほとんど出力を生成する事が可能な利便性がありますが、実際のところ整形式XMLではありません;
例えば、その出力は、順次的な非XML専用処理によって整形式XMLに変換される事を意図される状況において不都合な・有害な形式(ill-formed)断片を含む場合があります。
この根拠において、XSLT は、出力エスケープを使用不可にする為のメカニズムを定義します。
この特性は、非推奨(deprecated)です。
これは、付加的な特性です: それは、手法シリアライゼーションオプションが、出力エスケープをする事を使用不可能にする能力を要求するべきであり、 そしてまた、この特性を要求する存在しない一致レベルがあるというXSLTプロセッサを要求されません。
この特性は、[XSLT と XQuery シリアライゼーション]で記述したシリアライザーへの拡張を要求します。
概念は、最終結果ツリーは、テキストノードにある文字ごとに結び付けた付加的な boolean プロパティ disable-escaping
を提供します。
このプロパティが設定される場合には、 &
と <
のような特殊文字列をエスケープするシリアライザーの通常動作は、抑制されます。
xsl:value-of
、または、 xsl:text
要素は、 disable-output-escaping
属性を持つ場合があります;
その許容した値は、 yes
、または、 no
です。
既定は no
です;もし、その値が yes
である場合には、
xsl:value-of
、または、 xsl:text
要素を評価する事によって生成したテキストノードにあるそれぞれの文字は、
disable-output
プロパティセットを持つべきです。
もし、出力エスケープが、一時的な出力状態が、出力エスケープを利用不可とする要求が無視される効果の中にある際に評価した
xsl:value-of
、または、 xsl:text
命令において利用不可とされます。
もし、出力エスケープが、 cdata-section-elements
の中で要素が列挙される事から CDATA セクションを利用して出力されるのが通常である要素にあるテキストにおいて利用不可とされる場合には、
その関連するテキストは、 CDATA セクションに含まれないでしょう。
効果では、 CDATA は、エスケープメカニズムの代替手段として扱われ、それは、 disable-output-escaping
オプションによって利用不可とされます。
例えば、もし、
<xsl:output cdata-section-elements="title"/>
が記述される場合には、次に続く命令:
<title> <xsl:text disable-output-escaping="yes"> This is not <hr/> good coding practice </xsl:text> </title>
は、(以下の)出力を生成すべきです:
<title><![CDATA[This is not ]]><hr/><![CDATA[ good coding practice]]></title>
disable-output-escaping
属性は、 xml
出力メソッドを伴うのと同様に、 html
出力メソッドを伴って利用される場合があります。
text
出力メソッドは、いくつかの出力エスケープを実行しないことで disable-output-escaping
属性を無視します。
プロセッサは、最終結果ツリーが出力される方法を操作する場合には、単に出力エスケープを利用可能にするでしょう。 これは、常にそのケースにならない場合があります。 例えば、その結果ツリーは、出力されているその他の XSLT 変換の代わりにおいてソースツリーとして利用される場合があります。 出力エスケープを利用不可にする事がサポートされるかどうか(そして、どのような環境下で(サポートされるかどうか))は、 implementation-definedです。
[ERR XTRE1620]
もし、出力エスケープを明記する xsl:value-of
、または、 xsl:text
命令が、利用不可とされ、
手法がこれをサポートしない場合には、それは、回復可能な動的エラーです。
付加的な回復動作は、 disable-output-escaping
属性を無視する事です。
[ERR XTRE1630]
もし、出力エスケープを明記する xsl:value-of
、または、 xsl:text
命令が、
シリアライズされていない最終結果ツリーに書き込む際に利用不可とされる場合には、
それは、回復可能な動的エラーです。
付加的な回復動作は、 disable-output-escaping
属性を無視する事です。
もし、出力エスケープが、出力において利用されるプロセッサのエンコード方式にある表示ではない文字を利用不可とする場合には、 出力エスケープを利用不可とする要求は、その文字との関連が無視されます。
出力エスケープを使用不可にする事が、全ての手法と整形式ではないXMLにある可能な結果を伴う作業をしない場合がある事から、 それは、代替手段が存在しない時にのみ利用されるべきです。
注釈:
シリアライゼーション中の利用において文字列マップを定義する事の利便性は、20.1 文字マップで明記したように、 同様の難しさなく、出力エスケープを利用不可にする事が事前に要求されるという多くのシチュエーションで利用される事が可能な代替メカニズムとして生じています。 (=シリアライゼーション中の利用において文字列マップを定義する事は、多くのシチュエーションで利用される事が可能な代替メカニズムとして利便性を生み出しています。)