XSLT in Java benutzen

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie möchten eine XSLT-Bearbeitung aus einer Java-Anwendung heraus aufrufen.

Lösung

Sie können eine XSLT-Funktionalität auf dreierlei Weise aus Java aufrufen, nämlich durch die Verwendung:

  • des nativen Interfaces Ihrer bevorzugten Java-basierten XSLT-Implementierung,
  • der portableren TrAX-API oder Schnittstellen API
  • von JAXP 1.2 oder 1.3 (einer Obermenge von TrAX).

Wenn Sie mit dem Innenleben einer bestimmten Java-basierten XSLT-Implementierung vertraut sind, könnten Sie versucht sein, direkt deren API zu benutzen. Diese Lösung ist aber deswegen nicht wünschenswert, weil Ihr Code dann nicht portabel sein wird.

Eine Alternative ist TrAX (Transformation API for XML), eine Initiative, die anfangs von Apache.org gesponsort wurde. Die Philosophie von TrAX erklärt sich am besten mit einem Zitat von der TrAX-Site:

"Die Mitglieder der Java-Community werden großen Nutzen von einem gemeinsamen API haben, das ihnen erlaubt, ein einzelnes Modell zu verstehen und anzuwenden, Code für konsistente Schnittstellen zu schreiben und Transformationen polymorph anzuwenden. TrAX versucht, ein Modell zu definieren, das sauber und generisch ist, aber dennoch die Anforderungen allgemeiner Anwendungen über viele Anwendungsbereiche hinweg erfüllt."

TrAX wurde in die Java-Spezifikation JAXP 1.1 (und neuerdings 1.2 und 1.3 für J2SE 5.0) aufgenommen. Das heißt, es gibt jetzt nur zwei Möglichkeiten für Schnittstellen zwischen Java und XSLT: portable und nicht-portable. Allerdings ist diese Wahl nicht einfach eine zwischen richtig und falsch. Jede Prozessor-Implementierung hat besondere Eigenschaften, die manchmal benötigt werden, und wenn die Portabilität keine Rolle spielt, dann können Sie eine bestimmte Eigenschaft, die Sie benötigen, zu Ihrem Vorteil verwenden. Nichtsdestotrotz behandelt dieser Abschnitt nur die portable JAXP 1.2-API.

Sie können einen einfachen XSLT-Kommandozeilen-Prozessor gemäß JAXP 1.1 implementieren, wie es im folgenden Beispiel gezeigt wird, das ich aus dem Buch Java und XSLT von Eric M. Burke (O'Reilly, 2002) geborgt habe:

public class Transform
{

  public static void main(String[  ] args) throws Exception
  {
    if (args.length != 2)
    {
      System.err.println(
        "Usage: java Transform [xmlfile] [xsltfile]");
      System.exit(1);
    }

    // Öffne Quell- und Stylesheet-Datei
    File xmlFile = new File(args[0]);
    File xsltFile = new File(args[1]);

    // JAXP benutzt eine Source-Schnittstelle, um Daten zu lesen
    Source xmlSource = new StreamSource(xmlFile);
    Source xsltSource = new StreamSource(xsltFile);
    // Factory-Klassen ermöglichen es, dass der genaue XSLT-Prozessor vor der Anwendung versteckt bleibt, indem eine Standard-Transformer-Schnittstelle zurückgegeben wird
    TransformerFactory transFact = TransformerFactory.newInstance( );
    Transformer trans = transFact.newTransformer(xsltSource);

    // Wende das Stylesheet auf das Quelldokument an
    trans.transform(xmlSource, new StreamResult(System.out));
  }
}

Zusätzlich zu einem StreamResult kann ein DOMResult das Ergebnis als DOM-Baum für eine weitere Bearbeitung festhalten, oder es kann ein SAXResult angegeben werden, um die Ergebnisse auf ereignisgesteuerte Weise zu erhalten.

Was DOM angeht, so kann der Benutzer das Ergebnis als DOM-Document, -DocumentFragment oder -Element erhalten, je nachdem, welche Art von Knoten im DOMResult-Konstruktor übergeben wird.

Im Falle von SAXResult wird ein benutzerdefinierter ContentHandler an den SaxResult-Konstruktor übergeben, der auch die eigentlichen SAX-Ereignisse empfängt. Erinnern Sie sich daran, dass ein SAX-ContentHandler Callback-Aufrufe für solche Ereignisse wie startDocument( ), startElement( ), characters( ), endElement( ) und endDocument( ) empfängt. Unter saxproject.org finden Sie für weiter gehende Informationen zu SAX.

Diskussion

Das Schöne beim Zugriff auf die XSLT-Transformationsfähigkeiten aus Java heraus ist nicht, dass Sie Ihr eigenes XSLT-Prozessor-Frontend schreiben können, wie Sie es im obigen Lösungsabschnitt gemacht haben, sondern dass Sie die schon beeindruckenden Fähigkeiten von Java um solche zur Transformation von XSLT erweitern können.

Stellen Sie sich einen in Java geschriebenen Serverprozess vor, der mit ständig wechselnden XML-Dateien umgehen muss, die aus einer XML-Datenbank kommen oder aus XML bestehen, das in Form von SOAP-Messages eintrifft. Vielleicht muss dieser Server mehrere Versionen von Dokumentschemata oder mehrere SOAP-Clients unterstützen, um rückwärtskompatibel zu sein. Das heißt, der Server muss mehrere Schemata auf transparente Weise behandeln können. Falls Daten in einem älteren Schema in neuere transformiert werden können, dann wird der Server-Code um ein Vielfaches einfacher.

Das Schöne beim Einsatz von XSLT über die JAXP-Schnittstelle ist, dass Transformerinstanzen wiederverwendet werden können, d.h., Sie müssen das Stylesheet nur einmal parsen, nämlich dann, wenn der Server es lädt. Falls Ihr Server allerdings multithreaded ist und alle Threads Transformationen ausführen können müssen, dann ist jeweils eine Instanz pro Thread nötig, damit die Thread-Sicherheit garantiert werden kann.

Siehe auch

Das Buch Java und XSLT von Eric M. Burke (O'Reilly, 2002) enthält eine umfassende Behandlung der Integration von Java und XSLT, besonders mit JAXP 1.1. Darunter sind mehrere vollständige Anwendungsbeispiele, z.B. in den Bereichen Diskussionsforen und WML-Anwendungen (Wireless Markup Language).

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2006 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT Kochbuch" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O'Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de