随意動作とは、『XSL Transformations (XSLT) Version 1.0 Recommendation』に示されている動作です。この勧告では、1 つの問題に対処する方法として、実装プロバイダが複数の有効なオプションから 1 つ選択することが随意動作として説明されています。たとえば、W3C Recommendation は、セクション 7.3 「Creating Processing Instructions」で、xsl:processing-instruction の内容をインスタンス化したときに、テキスト ノード以外のノードが作成されるのはエラーであるとしています。いくつかの問題に関しては、プロセッサがエラー状態から回復するときにどのような対処をするべきかを、W3C が規定しています。セクション 7.3 に記述されている問題に関しては、W3C では、作成されたノードとその内容を無視することで、このエラーから回復できるとしています。
W3C で許可されている各随意動作に関して、XslTransform クラスの .NET 実装での動作と、それぞれの問題について言及している『XSL Transformations (XSLT) Version 1.0 Recommendation』 (http://www.w3.org/TR/xslt) のセクションを次の表に示します。
| 問題 | 動作 | セクション |
|---|---|---|
テキスト ノードが xsl:strip-space と xsl:preserve-space の両方に適合している。 |
復元 | 3.4 |
| ソース ノードが複数のテンプレート規則に適合している。 | 復元 | 5.5 |
| 1 つの名前空間 URI が同じインポート優先順位を持つ複数の名前空間 URI のエイリアスとして宣言されている。 | 復元 | 7.1.1 |
属性値テンプレートから生成された xsl:attribute と xsl:element 内の名前属性が有効な QName ではない。 |
例外をスロー | 7.1.2 および 7.1.3 |
| 要素ノードに子ノードが既に追加されているにもかかわらず、その要素に属性が追加される。 | 復元 | 7.1.3 |
| 要素ノード以外のノードに属性が追加される。 | 復元 | 7.1.3 |
xsl:attribute 要素の内容をインスタンス化してもテキスト ノードが作成されない。 |
復元 | 7.1.3 |
| 同じインポート優先順位および展開名を持つ 2 つの属性セットに同じ属性が含まれており、これらの属性セット以外に、同じ名前で優先順位の高い共通属性を含む属性セットがない。 | 復元 | 7.1.4 |
xsl:processing-instruction 名前属性が NCName と処理命令ターゲットのどちらも生成しない。 |
復元 | 7.3 |
xsl:processing-instruction の内容をインスタンス化すると、テキスト ノード以外のノードが作成される。 |
復元 | 7.3 |
xsl:processing-instruction の内容をインスタンス化した結果に文字列 "?>" が含まれている。 |
復元 | 7.3 |
xsl:comment の内容をインスタンス化した結果に文字列 "--" が含まれているか、結果が "-" で終了している。 |
復元 | 7.4 |
xsl:comment の内容をインスタンス化した結果、テキスト ノード以外のノードが作成される。 |
復元 | 7.4 |
| 変数バインディング要素内のテンプレートが属性ノードまたは名前空間ノードを返す。 | 復元 | 11.2 |
| document 関数に渡された URI からのリソースの取得時にエラーが発生する。 | 例外をスロー | 12.1 |
| document 関数内の URI 参照にフラグメント ID が含まれており、その ID を処理するとエラーが発生する。 | 例外をスロー | 12.1 |
同じ名前 (xls:output の cdata-section-elements 以外) を持つ複数の属性があり、これらの属性が同じインポート優先順位を持つ。 |
復元 | 16 |
プロセッサが xsl:output 要素の encoding 属性で指定されている文字エンコーディング値をサポートしない。 |
復元 | 16.1 |
disable-output-escaping がテキスト ノードに使用されており、そのテキスト ノードを使用して、結果ツリーにテキスト ノード以外のものが作成されている。 |
disable-output-escaping 属性を無視 |
16.4 |
| 出力エスケープが有効に設定されているテキスト ノードが結果ツリー フラグメントに含まれている場合に、そのフラグメントが数値や文字列に変換される。 | 無視 | 16.4 |
| XSLT プロセッサが出力に使用しているエンコーディングで表すことができない文字に対して、出力エスケープが無効に設定される。 | 無視 | 16.4 |
| 要素に子または属性が追加された後で、その要素に名前空間ノードが追加される。 | 復元 | 正誤表 e25 |
xsl:number が NaN、無限、または 0.5 未満である。 |
復元 | 正誤表 e24 |
| document 関数への 2 番目の引数ノード セットが空であり、URI 参照が相対 URI 参照である。 | 復元 | 正誤表 e14 |
正誤表は、『XSL Transformations (XSLT) Version 1.0 Specification Errata』 (http://www.w3.org/1999/11/REC-xslt-19991116-errata/) にあります。
カスタム定義の動作の実装
XslTransform クラス実装には固有の動作があります。ここでは、xsl:sort に対するプロバイダ固有の実装について説明し、XslTransform クラスでサポートされているオプション機能についても説明します。
xsl:sort
『XSL Transformations (XSLT) Version 1.0 Recommendation』では、変換を使用した並べ替えについて、考慮事項がいくつか示されています。その内容を次に示します。
- 2 つの XSLT プロセッサの両方が勧告に準拠している場合でも、それらの並べ替え動作は異なることがあります。
- すべての XSLT プロセッサが同じ言語をサポートするわけではありません。
- 言語によっては、プロセッサが異なると、
xsl:sortで指定されない限り、特定の言語に対する並べ替え動作が異なる場合があります。
XslTransform による変換の .NET Framework での実装について、各データ型に対して実装されている並べ替え動作を次の表に示します。
| データ型 | 並べ替え動作 |
|---|---|
| テキスト | データは、共通言語ランタイム (CLR: Common Language Runtime) の String.Compare メソッドとカルチャ ロケールを使用して並べ替えられます。データ型が "テキスト" である場合、XslTransform クラスによる並べ替え動作は、CLR の文字列比較動作と同様です。 |
| 数値 | 数値は、XPath 番号として処理され、『XML Path Language (XPath) Version 1.0 Recommendation』のセクション 3.5 (www.w3.org/TR/xpath.html#numbers) で概説されている詳細に従って並べ替えられます。 |
サポートされているオプション機能
XSLT プロセッサがオプションで実装する機能を次に示します。これらの機能は、XslTransform クラスに実装されます。
| 機能 | 参照先 | メモ |
|---|---|---|
<xsl:text...> タグと <xsl:value-of...> タグの disable-output-escaping 属性 |
『XSL Transformations (XSLT) Version 1.0 Recommendation』 (www.w3.org/TR/xslt)
セクション 16.4 |
xsl:text 要素または xsl:value-of 要素が xsl:comment、xsl:processing-instruction、または xsl:attribute のいずれかの要素で使用される場合、disable-output-escaping 属性は無視されます。
結果ツリー フラグメントがテキストを含み、そのテキストの出力がエスケープされた場合は、その結果ツリー フラグメントはサポートされません。 XmlReader オブジェクトまたは XmlWriter オブジェクトへの変換時には、disable-output-escaping 属性が無視されます。 |
参照
XslTransform クラスによる XSLT プロセッサの実装 | XslTransform クラスを使用した XSLT 変換 | 変換における XPathNavigator | 変換における XPathNodeIterator | XslTransform への XPathDocument の入力 | XslTransform への XmlDataDocument の入力 | XslTransform への XmlDocument の入力 | XslTransform クラス | XslTransform のメンバ