遅ればせながらXSLTに夢中になってあれこれとやろうとしてみたりしているのですが、JavaのXSLT実装で腑に落ちないところがありました。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new FileInputStream(xsltFile));
DOMSource xsltSrc = new DOMSource(document);
Transformer transformer = tFactory.newTransformer(xsltSrc);
とかやればXSLTをDOMから読み込めそうですが、これはうまくいきません。たとえば、下のようなエラーが出ます。
ERROR: '<ファイル名>: 変数またはパラメータ'link'が未定義です。'
FATAL ERROR: 'スタイルシートをコンパイルできませんでした'
javax.xml.transform.TransformerConfigurationException: スタイルシートをコンパイルできませんでした
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTemplates(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl.newTransformer(Unknown Source)
at scrap.TransformerTest.transform(TransformerTest.java:45)
at scrap.TransformerTest.main(TransformerTest.java:74)
困ったらソースに当たれということで、Apache Xalan-J 2.7.1のソースを取り寄せて調べてみましょう。ポイントはスタックトレースに出ているメソッドなので、
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImplクラス
/**
* javax.xml.transform.sax.TransformerFactory implementation.
* Process the Source into a Templates object, which is a a compiled
* representation of the source.
*
* @param source The input stylesheet - DOMSource not supported!!!
* @return A Templates object that can be used to create Transformers.
* @throws TransformerConfigurationException
*/
public Templates newTemplates(Source source)
throws TransformerConfigurationException
{
:
}
ああ、これはダメです。ものすごく明確にサポートしないよ!!!と書かれています。ということで、DOMSourceは使えないとすっぱりあきらめることができました。