Freelance software grandad
software created
extended or repaired
Follow me on Mastodon
Applications, Libraries, Code
Talks & Presentations
Got a groovy application that uses loads of XSLT stylesheets? Want to stash those stylesheets in your Jar file? Well, go right ahead, because this simple URIResolver will take care of hooking them out when you need them.
package uk.co.jezuk.xcrete; import javax.xml.transform.URIResolver; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.stream.StreamSource; import java.io.InputStream; public class ResourceResolver implements URIResolver { public Source resolve(String href, String base) throws TransformerException { if(!href.startsWith("resource://")) return null; // will make Oracle XSLT processor explode, // even though it's correct try { String resource = href.substring(11); // chop off the resource:// ClassLoader loader = getClass().getClassLoader(); InputStream is = loader.getResourceAsStream(resource); return new StreamSource(is, resource); } // try catch(Exception ex) { throw new TransformerException(ex); } // catch } // resolve } // ResourceResolver
Use it something like this -
TransformerFactory transformerFactory_; transformerFactory_ = TransformerFactory.newInstance(); transformerFactory_.setURIResolver(new ResourceResolver());Your TransformerFactory (and any Transformers you create with it) will now be able to resolve URIs in the form
resource://my/package/name/stylesheet.xsl
, whether you are loading, importing or including them.
And yes, the Oracle XSLT processor will explode if you give it a null. If you are saddled with it though, don't return null, do something like this instead
try {
URL thing = new URL(new URL(base), href);
return new StreamSource(thing.toString());
} // try
catch(MalformedURLException ex) {
throw new TransformerException(ex);
} // catch
Freelance software grandad
software created
extended or repaired
Follow me on Mastodon
Applications, Libraries, Code
Talks & Presentations