V10.0以降のバージョンに同梱しているJDKでは、2つのJAXP実装を提供しています。
Apache Xalan 2.7.1、および Apache Xerces 2.9.1に基づくJAXP実装(以降、「Apache Xalanプロジェクトの提供するJAXP実装」と表記)
Oracle Corporationが配布するJDK/JREに含まれる実装と同等のJAXP実装(以降、「Oracle社の提供するJAXP実装」と表記)
JDKバージョン | V10.0.0より前 | V10.x | V11.x | V12.x | V13.x |
---|---|---|---|---|---|
5.0 | Oracle社の提供するJAXP実装 | ※1 | (-) | (-) | (-) |
6 | ※1 | (-) | (-) | ||
7 | (-) | (-) | ※1 | (-) | |
8 | (-) | (-) | (-) | Oracle社の提供するJAXP実装 | OpenJDKの提供するJAXP実装 |
Apache Xalanプロジェクトの提供するJAXP実装
インタプリタモードのトランスフォーマ(富士通製JDK/JREのデフォルトのトランスフォーマ)
プリコンパイルモードのトランスフォーマ
Oracle社の提供するJAXP実装
(-):同梱されていません。
OpenJDK 8ではApache Xalanプロジェクトの提供するJAXP実装は、提供しておりません。
JAXP実装のバージョン変更に伴い、以下の点で注意が必要です。
XSLTの処理中のエラーについて
XSLTの処理中にエラーが発生した場合に、例外をスローしなくなります。
javax.xml.transform.ErrorListenerの仕様では、XSLTの処理中にエラーが発生しても、例外をスローしないことになっています。
詳細は、javax.xml.transform.ErrorListenerのJavaDocを参照してください。
XSLTの処理中にエラーが発生した場合のエラーハンドリング詳細についてはjavax.xml.transform.ErrorListener の JavaDocを参照してください。
javax.xml.parsers.SAXParser#setProperty()メソッド使用時の注意
javax.xml.parsers.SAXParser#setProperty()メソッドを使用してFeatureを設定できません。
Oracle社の提供するJAXP実装では、FeatureをsetProperty()メソッドで設定することが可能でした。しかし、Apache Xalanプロジェクトの提供するJAXP実装では、PropertyとFeatureを明確に区別するように変更されたため、setProperty()メソッドでFeatureを設定することができません。
setProperty()メソッドでFeatureを設定しようとした場合、以下の例外が発生する場合があります。
org.xml.sax.SAXNotRecognizedException: Property 'XXXX' is not recognized.
※XXXX:設定しようとしたFeature名
その場合は、SAXParserを取得するSAXParserFactoryのsetFeature()メソッドを使用しFeatureを設定するように変更してください。
XML文書のエンコーディング指定の解釈について
XML文書のエンコーディング指定の解釈が厳格になります。
Apache Xalanプロジェクトの提供するJAXP実装では、XML文書のxml宣言に指定するencoding属性の値を解釈する際に、XMLの仕様に沿ったチェックを行うようになります。
そのため、IANA(Internet Assigned Numbers Authority)で規定されていないエンコード名をencoding属性の値として指定した場合、以下の例外が発生する場合があります。
org.xml.sax.SAXParseException: Invalid encoding name "XXXX".
※XXXXはencoding属性に指定したエンコーディング名
たとえば、IANAに規定されていない「Shift-JIS」というエンコーディング名をxml文書のencoding属性に指定している場合、Apache Xalanプロジェクトの提供するJAXP実装では、例外が発生するようになります。(IANAでは「Shift_JIS」と規定されています。)
その場合は、XML文書のxml宣言中にあるencoding属性の値をIANAで規定されている正しいエンコーディング名に変更してください。