Hitachi

Cosminexus V11 アプリケーションサーバ Cosminexus XML Processor ユーザーズガイド


6.6 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オブジェクトはスレッドセーフではありません。したがって,各スレッドは排他的にこれらのオブジェクトにアクセスするようにしてください。

4

XSLTトランスフォーマとXSLTCトランスフォーマは同一の機能を提供しますが,エラー発生時に出力するメッセージは異なる場合があります。

5

xsl:attribute要素のnamespace属性に"http://www.w3.org/1999/XSL/Transform"を指定した場合,出力される属性の名前空間接頭辞がXSLTとXSLTCとで異なります。ただし,名前空間を有効に設定したパーサにとっては,名前空間接頭辞そのものは意味を持ちません。

6

xsl:attribute要素およびxsl:processing-instruction要素のname属性にQNameでない名前を指定した場合,XSLTではwarningイベントが発生しますが,XSLTCではerrorイベントが発生します。

7

name属性以外の属性値が異なるxsl:decimal-format要素が複数存在する場合に発生するエラーイベントは,XSLTではfatalErrorイベントが発生し,XSLTCではwarningイベントが発生します。

8

xsl:element要素またはxsl:attribute要素のname属性には,"xml"で始まる名前空間接頭辞を持つ名前を指定しないでください。

9

xsl:element要素,xsl:attribute要素,またはxsl:processing-instruction要素のname属性が,空文字列になる変数参照である場合,XSLTではwarningイベントが発生しますが,XSLTCではerrorイベントが発生します。

10

xsl:element要素のname属性がない場合,XSLTではerrorイベントが発生しますが,XSLTCではwarningイベントが発生します。

11

xsl:namespace-alias要素を使った場合,出力される属性の名前空間接頭辞がXSLTとXSLTCとで異なります。ただし,名前空間を有効に設定したパーサにとっては,名前空間接頭辞そのものは意味を持ちません。

12

xsl:number要素のformat属性に指定するフォーマットトークンには,"1"," 1の前に任意の個数の0が続いたもの","A","a","i","I"のどれかを指定してください。

13

xsl:number要素のlevel属性が"any"の場合,count属性に属性ノードを表すパターンを指定すると,XSLTとXSLTCとで動作が異なります。XSLTでは属性ノードがカウントされませんが,XSLTCでは属性ノードがカウントされます。

14

xsl:output要素のdoctype-system属性に空文字列を指定しないでください。同様に,TransformerクラスのsetOutputPropertyメソッドを用いてdoctype-systemプロパティに空文字列を指定しないでください。

15

xsl:output要素のmethod属性には"xml","html","text"のうちのどれか1つを指定してください。

16

xsl:processing-instruction要素のname属性に,評価結果が空文字列になるようなXPath式を記述すると,XSLTではwarningイベントが発生しますが,XSLTCではerrorイベントが発生します。

17

xsl:value-of要素のselect属性に変数参照を記述すると,TransformerExceptionが発生します。

18

XSLTとXSLTCでは"document(/)"の評価結果が異なります。XSLTではスタイルシートのルート要素として評価され,XSLTCでは空のノード集合として評価されます。

19

document関数の第一引数に文字列を指定するとき,その文字列に次に該当するXML文書を指定した場合,XSLTCはXSLTとエラーレベルが異なります。

  • 存在しないXML文書

  • 整形式でないXML文書

20

format-number関数のフォーマットパターン文字列に通貨記号(#x00A4)を含めてもエラーにならないことがあります。

21

system-property関数の引数には,"xsl:version","xsl:vendor","xsl:vendor-url"のうちのどれか1つを指定してください。

22

埋め込みスタイルシートを使った変換で,処理命令"xml-stylesheet"の擬似属性"href"で指定したIDに対応するスタイルシート要素が複数存在する場合,XSLTとXSLTCでは適用されるテンプレートが異なります。XSLTでは最後に現れたテンプレートが適用され,XSLTCでは最初に現れたテンプレートが適用されます。

23

トランスフォーマ機能で,出力プロパティに,未サポートのエンコーディングが指定されている場合,アプリケーションでトランスフォーマにエラーリスナーを登録しても,エラーメッセージ(KECX02322-W)は,エラーリスナーに報告されず,標準出力ストリームへ出力されます。なお,XSLTCの場合,上記エラーメッセージが標準出力ストリームへ出力されるのに加えて,エラーメッセージ(KECX07076-W)がエラーリスナーに報告されます。メッセージの詳細については,マニュアル「アプリケーションサーバ メッセージ(構築/運用/開発用)」の「11. KECX(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である。

31

次のすべての条件に該当する場合,TransformerFactoryクラスのnewTemplatesメソッドまたはnewTransformerメソッドを呼び出すときにfatalErrorイベントが発生します。メソッドの戻り値はnullとなります。

  1. トランスフォーマとして,XSLTCではなくXSLTを使っている。

  2. XMLInputFactoryクラスのcreateXMLStreamReaderメソッドまたはcreateXMLEventReaderメソッドの引数にシステム識別子を指定しないで呼び出して,XMLStreamReaderまたはXMLEventReaderを作成する。

  3. StAXSourceのコンストラクタ引数に2.で作成したXMLStreamReaderまたはXMLEventReaderを指定する。

  4. TransformerFactoryクラスのnewTemplatesメソッドまたはnewTransformerメソッドの引数に,3.で作成したStAXSourceを指定する。

次のどれかの方法で対策してください。

  • XSLTの代わりにXSLTCを使用する。

  • createXMLStreamReaderメソッドまたはcreateXMLEventReaderメソッドの引数に,システム識別子を指定する。

  • StAXSource以外のSourceを使用する。

32

次のすべての条件に該当する場合,トランスフォーマの出力結果のXML宣言にencoding擬似属性が出力されません。また,1.と2.の条件が重なる場合,standalone擬似属性が出力されません。

  1. トランスフォーマの出力にStAXResultを指定する。

  2. XSLTスタイルシートまたはトランスフォーマの出力プロパティの設定で,出力メソッドに「xml」を指定している。

  3. 1.のStAXResultにXMLStreamWriterまたはUTF-8以外の出力エンコーディングを指定したXMLEventWriterを指定する。

33

次のすべての条件に該当する場合,トランスフォーマの出力結果にXML宣言が出力されません。

  • トランスフォーマの出力にStAXResultを指定する。

  • XSLTスタイルシートまたはトランスフォーマの出力プロパティの設定で,出力メソッドに「xml」を指定する。

  • XSLTスタイルシートのテンプレートにマッチするノードが,入力XML文書内に存在しない。

34

次のすべての条件に該当する場合,トランスフォーマの出力結果の内容に関係なく,出力メソッドとして「xml」が仮定されます。

  • トランスフォーマの出力にStAXResultを指定する。

  • XSLTスタイルシートまたはトランスフォーマの出力プロパティの設定で,出力メソッドを指定していない。

35

トランスフォーマの出力にStAXResultを使った場合,XSLTスタイルシートまたはトランスフォーマの出力プロパティに指定した次のプロパティは無効になります。

  • omit-xml-declaration

  • doctype-system

  • doctype-public

  • cdata-section-elements

36

トランスフォーマの出力にStAXResultを使った場合,XSLTスタイルシートまたはトランスフォーマの出力プロパティで,次のプロパティに不当な値を指定してもエラーが通知されないで,指定は無効となります。

  • version

  • encoding

37

次のすべての条件に該当する場合,トランスフォーマの出力結果の中に,disable-output-escaping属性に「yes」を指定したxsl:text要素の内容が,エスケープされないで出力されます。

  • トランスフォーマの出力にStAXResultを指定する。

  • XSLTスタイルシート内のxsl:text要素のdisable-output-escaping属性に「yes」を指定する。

また,出力された文字列の前後に次の処理命令が付加されます。

(例)

<?javax.xml.transform.disable-output-escaping ?>&lt;<?javax.xml.transform.enable-output-escaping ?>

38

次のすべての条件に該当する場合,トランスフォーマの出力結果のXML宣言より前に文字を出力します。

  • トランスフォーマの出力にStAXResultを指定する。

  • XSLTスタイルシートまたはトランスフォーマの出力プロパティの設定で,出力メソッドに「xml」を指定する。

  • 出力ツリーのルート要素の前(プロローグ部分)に文字を出力する。