標準 API に定義されている Source, Result インターフェースの実装には、public static final な String フィールド「FEATURE」が定義されています。 これは TransformerFactory#getFeature() メソッドによって、各タイプの Source, Result をサポートしているかどうかを確認するのに使います。
使い方
デフォルトの TransformerFactory の実装が SAXSource をサポートしているかどうかを確認するためには、以下のようにします:
TransformerFactory factory = TransformerFactory.newInstance(); System.out.println(factory.getFeature(SAXSource.FEATURE));
SAXSource がサポートされているなら「true」が、サポートされていないなら「false」が標準出力に表示されます。
Sun の JDK
Sun Microsystems の JDK (1.6.0_01) にデフォルトで組み込まれている TransformerFactory の実装について、各タイプの Source, Result がサポートされているかどうか調べてみました。 実装クラスは
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
Xalan かそれを修正したような実装のようですね。
TransformerFactory#getFeature() の実行結果は下表の通り:
Source | サポート | Result | サポート | |
---|---|---|---|---|
Stream | StreamSource | true | StreamResult | true |
SAX | SAXSource | true | SAXResult | true |
StAX | StAXSource | false | StAXResult | false |
DOM | DOMSource | true | DOMResult | true |
JAXB | JAXBSource | true | JAXBResult | true |
StAX ってサポートされてないことになってるんですけど。 ソースコードを細かく追いかけたわけではありませんが、内部的には StAX イベントから SAX イベント (?) に変換しているようです。
JDOM, dom4j
JDOMSource, DocumentSource は SAXSource を、JDOMResult, DocumentResult は SAXResult をそれぞれ拡張しているので、これらの FEATURE フィールドは SAXSource.FEATURE, SAXResult.FEATURE と同じです。
これらのフィールドの他に、JDOM や dom4j を native にサポートしているかどうかを確認するための public static final な String フィールドも定義されています:
- JDOMSource.JDOM_FEATURE
- JDOMResult.JDOM_FEATURE
- DocumentSource.DOM4J_FEATURE
DocumentResult にはこの手のフィールドは定義されていません。