TrAX: Aumentare le prestazioni delle trasformazioni XSLT in Java
Impariamo a ottimizzare le prestazioni di una trasformazione XSLT di frequente utilizzo “compilandola” con le Java Transformation API for XML (TrAX).
E’ sempre più frequente (e consigliabile) l’uso di XSL (eXtensible Stylesheet Language) per trasformare dati XML in HTML, WML, xHTML o qualsiasi altro formato XML. Sicuramente però la facilità con cui si effettua questa trasformazione viene ripagata con una perdita di prestazioni.
XSL infatti è un linguaggio interpretato, come tale, quindi, poco performante e rischia di fare da collo di bottiglia alle nostre web application. Di qui la necessità di accelerare il tutto, “compilando” in una classe java le trasformazioni frequenti.Di contro ad ogni modifica, anche marginale, della trasformazione, saremo costretti alla ricompilazione dei sorgenti. Ma questo è sicuramente un prezzo che siamo disposti a pagare. Per compilare i nostri stylesheet, dobbiamo utilizzare gli oggetti Templates che TrAX ci fornisce.
Ci preoccuperemo poi di salvare in una cache l’oggetto Template, per eventuali riutilizzi. In questo modo, tenendo in memoria la trasformazione, il tutto risulterà molto più prestante.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
import javax.xml.transform.*; import javax.xml.transform.stream.*; import java.util.*; public class XslTransformer { private static Map CACHE = new Hashtable(); // map of Templates objects private String xslFileName; // the filename of stylesheet and key to map private Transformer transformer; public XslTransformer (String theXslFileName) throws TransformerConfigurationException { xslFileName = theXslFileName; Templates templates = (Templates)CACHE.get(theXslFileName); if (templates == null) { TransformerFactory factory = TransformerFactory.newInstance(); templates = factory.newTemplates (new StreamSource(xslFileName)); CACHE.put(theXslFileName, templates); } transformer = templates.newTransformer(); } public void transform(Source xmlSource, Result result) throws TransformerException { transformer.transform(xmlSource, result); } public static void main(String[] args) throws Exception { if (args.length != 3) { System.out.println("usage: XslTransformer <xmlFile> <xslFile> <outFile>"); return; } String xmlFile = args[0]; String xslFile = args[1]; String outFile = args[2]; XslTransformer xform = new XslTransformer(xslFile); xform.transform( new StreamSource(xmlFile) , new StreamResult(outFile) ); } } |
La trasformazione viene caricata da file e passata al costruttore Templates solo una volta, le successive verrà presa dalla memoria. Per approfondimenti su questa tecnica vi rimando a questo articolo (in inglese).