20.13.2 | Das Transformer-API |
Das Paket javax.xml.transform enthält ein High-Level-API zum Zugriff auf beliebige XSLT-Prozessoren. In J2SDK 1.4 ist der Prozessor Xalan vom Apache-Projekt integriert. Die Homepage von Xalan ist: http://xml.apache.org/xalan-j/
Prinzipiell werden zwei Klassen zur Umsetzung eines Stylesheets zur Verfügung gestellt:Beiden Klassen ist gemeinsam, dass Exemplare nicht direkt, sondern über die TransformerFactory erzeugt werden. Diese Klasse verfügt über die Methoden getTransformer() und getTemplates(), mit denen die entsprechenden Exemplare erzeugt werden können. Bei beiden Methoden wird das Stylesheet als Implementierung des Interface Source übergeben. Dieses Interface ist ebenfalls javax.xml.transform definiert. In den Unterpaketen dom, sax und stream stehen Implementierungen bereit, die das Stylesheet als DOM-Baum, aus einem Stream oder über SAX liefern.
Transformer Diese Klasse interpretiert ein XSLT-Stylesheet zur Laufzeit. Sie sollte vorwiegend für einen einmaligen Gebrauch verwendet werden. Templates Diese Klasse führt gewissermaßen eine Vorkompilierung des Stylesheets durch und kann daher bei mehrfacher Anwendung eines Stylesheets schneller sein. Allerdings erfordert die Vorkompilierung einen gewissen Rechenaufwand, weshalb bei einmaliger Verwendung ein Transformer vorzuziehen ist. In der Praxis unterstützen nur sehr wenige Prozessoren kompilierte Stylesheets (beispielsweise Apaches Xalan), wobei meist die Implementierung des Templates-Mechanismus in der Entwicklung der interpretierten Variante hinterherhinkt.
Das folgende Beispiel erzeugt einen Transformer, der das Stylesheet aus einer Datei ausliest, deren Name als Kommandozeilen-Parameter übergeben wird:// Exemplar der Factory holen TransformerFactory fac = TransformerFactory.newInstance(); Source src = new StreamSource(args[0]); // Transformer erzeugen Transformer trans = fac.newTransformer(src);Mit dem entsprechenden Transformer-Exemplar kann dann ein gegebenes XML-Dokument transformiert werden. Das Ergebnis, eine Implementierung des Interface Result, kann dabei wiederum SAX-, DOM- oder Stream-orientiert sein.// Transformation durchführen trans.transform(new StreamSource(args[1]), new StreamResult(args[2]));