XSLT in Perl benutzen

(Auszug aus "XSLT Kochbuch" von Sal Mangano)

Problem

Sie haben ein Problem, für das es in Perl eine passende Lösung gibt, die aber mit einer Prise XSLT noch leichter wäre.

Lösung

Es gibt mehrere Möglichkeiten, XSLT in Perl einzubetten. XML::LibXSLT und XML::LibXML sind Perl-Frontends zur Funktionalität der SAX- und XSLT-Prozessoren in der GNOME-Bibliothek. Das folgende Beispiel, das ich mir aus dem Buch Perl & XML von Erik T. Ray und Jason McIntosh (O'Reilly, 2002) geborgt habe, zeigt ein Perl-Programm, das mehrere XML-Dateien im Stapelbetrieb mit einem einmal kompilierten XSLT-Skript bearbeitet:

use XML::LibXSLT;
use XML::LibXML;

# die Argumente dieses Befehls sind Stylesheet- und Quelldateien
my( $style_file, @source_files ) = @ARGV;

# initialisiere den Parser und XSLT-Prozessor
my $parser = XML::LibXML->new( );
my $xslt = XML::LibXSLT->new( );
my $stylesheet = $xslt->parse_stylesheet_file( $style_file );

# für jede Quelldatei: Parse, transformiere, gib Ergebnis aus
foreach my $file ( @source_files ) {
  my $source_doc = $parser->parse_file( $source_file );
  my $result = $stylesheet->transform( $source_doc );
  print $stylesheet->output_string( $result );
}

Parameter an das Stylesheet können als Perl-Hash übergeben werden, wie es der folgende Code zeigt:

# Ähnlicher Code aus vorherigem Beispiel wurde weggelassen.

my %params = {
     param1 => 10,
    param2 => 'foo',
} ;
foreach my $file ( @source_files ) {
  my $source_doc = $parser->parse_file( $file );
  my $result = $stylesheet->transform($source_doc, %params);
  print $stylesheet->output_string( $result );
}

Die Übergabe von Parametern von Perl an das Stylesheet würde es Ihnen unter anderem ermöglichen, ein Perl-basiertes CGI-Programm zu schreiben, das seine Eingabe von einem HTML-Formular bekommt und eine XML-Datenbank mit Hilfe von XSLT abfragt (siehe das Rezept SOAP-Dokumentation aus WSDL anbieten, in dem wir ein wenig gemogelt haben, weil der XSLT-Prozessor geforkt und nicht eingebettet wurde).

XML::Xalan ist ein weiteres Perl-XSLT-Modul, mit dem Perl den Xalan-Prozessor aufrufen kann. Der Autor dieses Moduls, Edwin Pratomo, betrachtet es noch als Software im Alpha-Stadium.

Am einfachsten können Sie XML::Xalan über externe Dateien benutzen:

use XML::Xalan;

  # konstruiere den Transformer
  my $tr = new XML::Xalan::Transformer;

  # kompiliere das Stylesheet
  my $compiled = $tr->compile_stylesheet_file("my.xsl");

  # parse das Eingabequelldokument
  my $parsed = $tr->parse_file("my.xml");

  my $dest_file = "myresult.xml" ;

  # führe die Transformation aus, und speichere das Ergebnis
  $tr->transform_to_file($parsed, $compiled, $dest_file)
    or die $tr->errstr;

Eine nützlichere Verwendungsweise ergibt sich, wenn das Ergebnis in einer Variablen zurückgegeben wird, die Sie weiter bearbeiten können:

 

my $res = $tr->transform_to_data($parsed, $compiled);

Sie müssen weder die Eingabe vorab parsen noch das Stylesheet vorkompilieren, weil Sie beides in Form von Dateien oder Strings übergeben können:

 

my $res = $tr->transform_to_data($src_file, $xsl_file);

Das gibt das Ergebnis wörtlich als String zurück, d.h., diese Verwendungsweise macht vermutlich am meisten Sinn, wenn das Ausgabeformat Text ist, den Sie in Perl weiterbearbeiten möchten.

Alternativ dazu können Sie auch auf ereignisgesteuerte Weise an die Ergebnisse herankommen:

# erzeuge einen Handler sub
$out_handler = sub {
     my ($ctx, $mesg) = @_;
     print $ctx $mesg;
 };
# führe die Transformation über den Handler aus
$tr->transform_to_handler(
     $xmlfile, $xslfile,
     *STDERR, $out_handler);

Diskussion

Viele Perl-Entwickler haben XSLT deswegen nicht vollkommen akzeptiert, weil es sehr schwer für sie wird, etwas ohne Perl zu lösen, nachdem sie Perl einmal gemeistert haben. Fairerweise sei bemerkt, dass die meisten Perl-Entwickler sehr wohl einsehen, dass andere Sprachen ihre Daseinsberechtigung haben, und XSLT kann ganz sicher dabei helfen, eine komplexe XML-Transformation zu vereinfachen, auch wenn der größte Teil des umgebenden Programms weiterhin aus purem Perl besteht.

Siehe auch

Eine weitere Perl-XSLT-Lösung ist z.B. XML::GNOME::XSLT von T. J. Mather, ein Perl-Frontend zu libXSLT, einem C-basierten XSLT-Prozessor von GNOME. Sie können auch XML::XSLT, eine native Perl-XSLT-Implementierung von Jonathan Stowe, benutzen. Im Moment implementiert sie viele fortgeschrittenere Eigenschaften von XSLT 1.0 noch nicht, darunter xsl:sort, xsl:key und xsl:import, und einige weitere Bereiche unterstützt sie nur teilweise. Eine dritte Möglichkeit ist XML::Sablotron von Pavel Hlavnicka, ein Perl-Frontend zum C++-basierten XSLT-Produkt von Ginger Alliance. Weitere Information zu diesen Modulen finden Sie unter CPAN-org.

Und schließlich gibt es noch eine Lösung, die Perl mit XSLT koppelt, nämlich das Apache AxKit, ein XML-Applikationsserver für Apache. AxKit verwendet ein Pipeline-Verarbeitungsmodell, mit dem man Inhalte in mehreren Stufen bearbeiten kann. Die XSLT-Funktionalität wird dabei vom Sablotron-Prozessor erbracht.

  

<< 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