6.7 XSLT/XSLTC共通の注意事項

XSLT/XSLTC共通の注意事項を次の表に示します。

表6-10 XSLT/XSLTC共通の注意事項

項番注意事項
1マルチスレッドプログラミングをする場合,TransformerFactoryクラス,およびTransformerFactoryXSLTCクラスはスレッドセーフではありません。したがって,複数のスレッドが同時に同一のTransformerFactoryインスタンス,およびTransformerFactoryXSLTCインスタンスにアクセスしてはいけません。スレッド間の競合を避けるため,次のどちらかの方法を使用してください。
  • 各スレッドにTransformerFactoryインスタンス,およびTransformerFactoryXSLTCインスタンスを持つ。
  • 各スレッドが排他的にTransformerFactoryインスタンス,およびTransformerFactoryXSLTCインスタンスにアクセスする。
2マルチスレッドプログラミングをする場合,Transformerクラスはスレッドセーフではありません。したがって,複数のスレッドが同時に同一のTransformerインスタンスにアクセスしてはいけません。スレッド間の競合を避けるため,次の方法を使用してください。
  • 各スレッドにTransformerインスタンスを持つ。
3マルチスレッドプログラミングをする場合,SAXTransformerFactoryクラス,TemplatesHandlerオブジェクト,TransformerHandlerオブジェクトはスレッドセーフではありません。したがって,各スレッドは排他的にこれらのオブジェクトにアクセスするようにしてください。
4XSLTトランスフォーマとXSLTCトランスフォーマは同一の機能を提供しますが,エラー発生時に出力するメッセージは異なる場合があります。
5xsl:attribute要素のnamespace属性に"http://www.w3.org/1999/XSL/Transform"を指定した場合,出力される属性の名前空間接頭辞がXSLTとXSLTCとで異なります。ただし,名前空間を有効に設定したパーサにとっては,名前空間接頭辞そのものは意味を持ちません。
6xsl:attribute要素およびxsl:processing-instruction要素のname属性にQNameでない名前を指定した場合,XSLTではwarningイベントが発生しますが,XSLTCではerrorイベントが発生します。
7name属性以外の属性値が異なるxsl:decimal-format要素が複数存在する場合に発生するエラーイベントは,XSLTではfatalErrorイベントが発生し,XSLTCではwarningイベントが発生します。
8xsl:element要素またはxsl:attribute要素のname属性には,"xml"で始まる名前空間接頭辞を持つ名前を指定しないでください。
9xsl:element要素,xsl:attribute要素,またはxsl:processing-instruction要素のname属性が,空文字列になる変数参照である場合,XSLTではwarningイベントが発生しますが,XSLTCではerrorイベントが発生します。
10xsl:element要素のname属性がない場合,XSLTではerrorイベントが発生しますが,XSLTCではwarningイベントが発生します。
11xsl:namespace-alias要素を使った場合,出力される属性の名前空間接頭辞がXSLTとXSLTCとで異なります。ただし,名前空間を有効に設定したパーサにとっては,名前空間接頭辞そのものは意味を持ちません。
12xsl:number要素のformat属性に指定するフォーマットトークンには,"1"," 1の前に任意の個数の0が続いたもの","A","a","i","I"のどれかを指定してください。
13xsl:number要素のlevel属性が"any"の場合,count属性に属性ノードを表すパターンを指定すると,XSLTとXSLTCとで動作が異なります。XSLTでは属性ノードがカウントされませんが,XSLTCでは属性ノードがカウントされます。
14xsl:output要素のdoctype-system属性に空文字列を指定しないでください。同様に,TransformerクラスのsetOutputPropertyメソッドを用いてdoctype-systemプロパティに空文字列を指定しないでください。
15xsl:output要素のmethod属性には"xml","html","text"のうちのどれか一つを指定してください。
16xsl:processing-instruction要素のname属性に,評価結果が空文字列になるようなXPath式を記述すると,XSLTではwarningイベントが発生しますが,XSLTCではerrorイベントが発生します。
17xsl:value-of要素のselect属性に変数参照を記述すると,TransformerExceptionが発生します。
18XSLTとXSLTCでは"document(/)"の評価結果が異なります。XSLTではスタイルシートのルート要素として評価され,XSLTCでは空のノード集合として評価されます。
19document関数の第一引数に文字列を指定するとき,その文字列に次に該当するXML文書を指定した場合,XSLTCはXSLTとエラーレベルが異なります。
  • 存在しないXML文書
  • 整形式でないXML文書
20format-number関数のフォーマットパターン文字列に通貨記号(#x00A4)を含めてもエラーにならないことがあります。
21system-property関数の引数には,"xsl:version","xsl:vendor","xsl:vendor-url"のうちのどれか一つを指定してください。
22埋め込みスタイルシートを使った変換で,処理命令"xml-stylesheet"の擬似属性"href"で指定したIDに対応するスタイルシート要素が複数存在する場合,XSLTとXSLTCでは適用されるテンプレートが異なります。XSLTでは最後に現れたテンプレートが適用され,XSLTCでは最初に現れたテンプレートが適用されます。
23トランスフォーマ機能で,出力プロパティに,未サポートのエンコーディングが指定されている場合,アプリケーションでトランスフォーマにエラーリスナーを登録しても,エラーメッセージ(KECX02322-W)は,エラーリスナーに報告されず,標準出力ストリームへ出力されます。なお,XSLTCの場合,上記エラーメッセージが標準出力ストリームへ出力されるのに加えて,エラーメッセージ(KECX07076-W)がエラーリスナーに報告されます。メッセージの詳細については,マニュアル「Cosminexus アプリケーションサーバ メッセージ 3」の「2. KECX(Cosminexus XML Processorが出力するメッセージ)」を参照してください。
24変換結果をHTML形式で出力した場合,XSLTとXSLTCとでは要素間の改行出力に差異があります。ただし,HTML文書では,要素間の改行は意味を持たないため問題ありません。
25次の条件がすべて重なるとき,DOMResultオブジェクトのsetNode(Node node)メソッドを実行すると,IllegalStateException例外ではなく,IllegalArgumentException例外が発生します。
  • DOMResultオブジェクトのnextSiblingがnullではない。
  • nextSiblingが引数nodeの子でない。
この場合は,setNodeメソッドの例外を処理するcatch節で,IllegalStateException例外だけでなくIllegalArgumentException例外もキャッチしてください。
26スタイルシート内でQNameとして評価される場所(xsl:element要素のname属性,key関数の第一引数など)に,XML1.0規格で名前として使用することが許されていない文字(Unicode補助文字,全角数字など)が使用されても,エラーにならないで処理が続行される場合があります。このような場合,トランスフォーマに出力メソッドとして"xml"を指定し,出力バージョンとして"1.0"を指定しても,出力される文書はXML1.0規格に準拠しません。
27内部エンティティを定義する文字列中に,477文字以上の要素名が含まれていると, java.lang.IndexOutOfBoundsException例外が発生する場合があります。
28次に示すDOMResultのコンストラクタ引数にDocumentオブジェクトを指定する場合は,DocumentBuilderクラスのnewDocumentメソッドで作成した,新しいDocumentオブジェクトを指定してください。
  • DOMResult(Node node)
  • DOMResult(Node node, String systemId)
29値が重複したID型属性を含むXML文書に対して,id関数を使ったXSLTスタイルシートを適用した場合,id関数の結果が不正になることがあります。
30次の条件の両方に該当する場合,トランスフォーマの変換処理の実行速度が大幅に低下します。
  • 入力XML文書が大量の実体参照を含む。
  • トランスフォーマの出力先がDOMResultである。