xsl を使用して xml ファイルを変換するコードがあります。コードの平和は次のとおりです。私の問題は、実行ポイントを実行すると、次のエラーが表示されることです。
StackTrace: javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: /home/app/myapp/bin/xhtml11-flat.dtd (No such file or directory)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:720)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)
at com.core.util.XmlUtils.transform(XmlUtils.java:151)
at com.core.util.XmlUtils.transform(XmlUtils.java:147)
簡単に言えば、アプリケーションを実行した場所から bin ディレクトリ内の dtd ファイルを見つけようとしています。
/home/app/myapp/bin/xhtml11-flat.dtd
このファイルをbinディレクトリにコピーすると、xhtml11-flat.dtdファイルがあり、binディレクトリの代わりにクラスパスからロードしたいのですが、最小限の変更でこれを達成するにはどうすればよいですか? パスを設定できるように、どこから .dtd コードをロードしているのかわかりません。
//Execution Point
function transform(){
Templates templates = getTemplates();
StringWriter result = new StringWriter();
XmlUtils.transform(templates.newTransformer(), input, new StreamResult(result));
...
}
private Templates getTemplates() throws Exception {
if (templates == null) {
templates = XmlUtils.createTemplates(XslRdcSourceDocTransformer.class.getResourceAsStream("/xsl/" + getXslFileName()));
}
return templates;
}
public static Templates createTemplates(InputStream stream) throws Exception {
TransformerFactory tfactory = TransformerFactory.newInstance();
return tfactory.newTemplates(new StreamSource(stream));
}