付録A.5 XSLTの動作の差異

XSLTの動作の差異を次の表に示します。

表A-5 XSLTの動作の差異(バージョン06-00とバージョン07-00以降の比較)

項番条件XML Processorの動作
バージョン06-00の場合バージョン07-00以降の場合
1TransformクラスおよびTransformerFactoryクラスのデフォルトのエラーリスナーを使用する場合エラー時に例外をスローします。エラー時に例外をスローしません。
2TransformerFactoryクラスのnewTransformer(Source source)メソッド, newTemplatesメソッドを実行した場合バージョン間の差異はありません。
これらのメソッドの入力であるスタイルシートに誤りがあると,ErrorListenerのfatalErrorメソッドにエラーが報告されます。このとき,ErrorListenerのfatalErrorメソッドの実装がTransformerExceptionをスローしない場合は,newTransformer(Source source)メソッド,newTemplatesメソッドの戻り値がnullになることがありますのでご注意ください。
デフォルトの ErrorListenerは,TransformerExceptionをスローしません。したがって,回復できないエラー発生時の正常な動作を確保するため,ErrorListenerを登録してfatalErrorメソッドの中からTransformerException例外をスローすることを強くお勧めします。
3XMLをファイルに出力する際,xsl:output要素にindent="yes"が指定されていないか,または,TransformクラスのsetOutputProperty(OutputKeys.INDENT, "yes")メソッドが実行されていない場合XML宣言の直後に改行が出力されます。改行は出力されません。
4変換結果をHTML形式で出力した場合要素間の改行出力に差異がありますが,HTML文書では,要素間の改行は意味を持たないため,問題ありません。
5system-property('xsl:version')関数を実行した場合結果は"1"になります。結果は"1.0"になります。
6xsl:attribute要素の内容がタブを含む文字列の場合変換結果の属性値がタブ文字そのものになります。変換結果の属性値が文字参照(	)になります。
7xsl:number要素のvalue属性にgenerate-id()関数を使用した場合"0"が出力されます。"NaN"が出力されます。
8xsl:stylesheet要素の名前空間宣言で定義した接頭辞が,xsl:element要素によって作成された要素の中で使われない場合その名前空間宣言がxsl:element要素に出力されます。その名前空間宣言はxsl:element要素には出力されません。
9xsl:version属性に"1.1"を指定した簡略化スタイルシートの中にトップレベル要素を記述した場合前方互換処理で,トップレベル要素がインスタンス化されて変換が実行されます。トップレベル要素前方互換処理が無視されます。
10xsl:attribute-set要素のuse-attribute-sets属性に「存在しない属性セット名」を指定した場合エラーになりません。属性セットが存在しない旨のエラーになります。
11xsl:template要素にname属性,match属性のどちらも指定されていない場合エラーになりません。name属性かmatch属性のどちらかが必要な旨のエラーになります。
12exclude-result-prefixes属性で指定された「除外する名前空間の接頭辞」が,xsl:stylesheet要素の名前空間宣言で定義されていない場合エラーになりません。エラーになります。
13xsl:stylesheet要素のversion属性に数値以外を指定した場合エラーになりません。エラーになります。
14xsl:output要素のmethod属性に"xml"を指定し,かつ,xsl:output要素のversion属性に"1.0","1.1"以外を指定した場合警告は発生しません。"1.0"を仮定する旨の警告が発生します。
15テキスト出力で,出力時のエンコーディングでは表現できない文字を出力する場合文字化けとなります。標準エラー出力に警告が出力され,該当の文字は文字参照として出力されます。
16Transformクラスのtransform(Source xmlSource, Result outputTarget)メソッドの引数xmlSourceに空のSourceを指定した場合エラーになります。DocumentBuilderクラスのnewDocumentメソッドで生成された空のドキュメントが使われます。
17TransformerFactoryクラスのgetFeatureメソッドの引数にnullを指定した場合falseが戻ります。NullPointerException例外が発生します。
18名前空間宣言のない接頭辞がある場合TransformerException例外が発生します。XPathStylesheetDOM3Exception例外が発生することがあります。この例外はTransformerException例外のサブクラスなので,TransformerExceptionによってキャッチできます。
19StreamResultクラスのStreamResult(File f)コンストラクタ,および,setSystemId(File f) メソッドの引数fにnullを指定した場合NullPointerException例外が発生します。RuntimeException例外が発生します。
ただし,Java SE 6の場合はNullPointerException例外が発生します。
20xsl:call-template要素のname属性で指定した名前付きテンプレートが存在しない場合
(メッセージの詳細については,マニュアル「アプリケーションサーバ メッセージ(構築/運用/開発用)」の「11. KECX(XML Processorが出力するメッセージ)」を参照してください)
KECX02019-Eのエラーを通知します。KECX02019-EおよびKECX02015-Eのエラーを通知します。
21「namespace::局所名」を含むXPath式の評価結果局所名を接頭辞と見なして名前空間URIを解決し,その名前空間URIに一致する文字列値を持つ名前空間ノードが評価結果になります。指定した局所名を持つ名前空間ノードが評価結果になります。
22xsl:output要素のencoding属性に不当な値を指定した場合KECX02322-Wのワーニングを通知します。KECX04196-WおよびKECX02322-Wのワーニングを通知します。
23xsl:variable要素がselect属性と要素内容の両方を持っている場合KECX02288-Eのエラーを通知します。KECX02019-EおよびKECX02288-Eのエラーを通知します。
24xsl:stylesheet要素のversion属性の値が"1.1"以上で,かつスタイルシートに不当な属性を指定した場合エラーになります。エラーになりません。
25処理命令の生成でname属性に指定したノードが存在しない場合StringIndexOutOfBoundsException例外が発生します。例外が発生しません。
26transformメソッドのSource指定で,次に示すSourceを指定した場合
  1. DOMSource
    ・引数なしのコンストラクタで生成されたDOMSourceで,setNodeメソッドによるNodeの設定が行なわれていない場合。
    ・コンストラクタ引数に指定されたNodeがnullの場合。
  2. SAXSource
    ・引数なしのコンストラクタで生成されたSAXSourceで,setInputSourceメソッドによるInputSourceの設定が行なわれていない場合。
    ・コンストラクタ引数に指定されたInputSourceがnullの場合。
NullPointerException例外が発生します。例外が発生しません。
27次のように,XSLT名前空間宣言が誤っているスタイルシートを入力した場合
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/2199/XSL/Transform">
KECX02009-Eのエラーを通知します。KECX02518-Eのエラーを通知します。
28次の両方の条件に該当する場合
  • TransformerクラスのsetOutputPropertyメソッドでOutputKeys.DOCTYPE_SYSTEMを指定
  • TransformerクラスのsetOutputPropertyメソッドでOutputKeys.METHODに"html"を指定
生成されるDOCTYPE宣言の"HTML"が大文字になります。生成されるDOCTYPE宣言の"HTML"が小文字になります。
29xsl:output要素のmethod属性が"xml"で,かつversion属性に"1.1"を指定した場合出力されるXML文書のXML宣言にversion="1.0"が出力されます。version="1.1"が出力されます。
30スタイルシート中に<xsl:namespace-alias stylesheet-prefix="axsl" result-prefix="#default">の定義があり,かつデフォルト名前空間の指定がない場合errorが呼ばれ,TransformerException例外の原因の例外としてNullPointerExceptionが発生します。errorおよびfatalErrorが呼ばれ,KECX02257-Eのエラーを通知します。

表A-6 XSLTの動作の差異(バージョン08-50とバージョン08-70以降の比較)

項番条件XML Processorの動作
バージョン08-50の場合バージョン08-70以降の場合
1XMLInputFactory.createXMLEventReader()メソッドで取得したXMLEventReaderをStAXSourceのコンストラクタ引数に指定して,Transformer.transform()メソッドの入力ソースとした場合入力XML文書のルート要素の外側にある処理命令は無視されます。入力XML文書のルート要素の外側にある処理命令も変換対象となります。
2次の両方の条件に該当する場合
  • トランスフォーマの入力XML文書内の要素がXSLT以外の名前空間に属している
  • XMLEventWriterから作成したStAXResultを使用して変換している
変換中にエラーが発生するか,変換結果が不正になります。正常に処理されます。
3次のすべての条件に該当する場合
  • トランスフォーマのスタイルシートでxsl:sortを使った変換を実施する
  • トランスフォーマのスタイルシートのソートキーに日本語が指定されている
J2SE 5.0とJava SE 6の場合とで,ソートの出力結果が異なります。
08-70までの場合
J2SE 5.0とJava SE 6の場合とで,ソートの出力結果が異なります。
09-00以降の場合
Java SE 6だけのため,差異はありません。
4出力メソッドがxmlで,かつ,指定した出力エンコーディングでは表現できない文字を出力する場合J2SE 5.0とJava SE 6とで出力結果が異なる場合があります。
08-70までの場合
J2SE 5.0とJava SE 6とで出力結果が異なる場合があります。
09-00以降の場合
Java SE 6だけのため,差異はありません。