Changeset 9957


Ignore:
Timestamp:
2005-05-25T17:30:23+12:00 (19 years ago)
Author:
davidb
Message:

Introduction of XSLT support to XML based plugins. This is done through
a minus option (-xslt) that allows the input XML to be transformed before it
is processed by the plugin.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gsdl/perllib/plugins/XMLPlug.pm

    r9853 r9957  
    4141    'type' => "regexp",
    4242    'deft' => &get_default_process_exp(),
     43    'reqd' => "no" },
     44      { 'name' => "xslt",
     45    'desc' => "{XMLPlug.xslt}",
     46    'type' => "string",
     47    'deft' => "",
    4348    'reqd' => "no" } ];
    4449
     
    6166    push( @{$option_list}, $options );
    6267   
     68    if (!parsargv::parse(\@_,
     69             q^xslt/.*/^, \$self->{'xslt'},
     70             "allow_extra_options")) {
     71
     72    print STDERR "\nIncorrect options passed to XSLTPlug, check your collect.cfg configuration file\n";
     73    $self->print_txt_usage("");  # Use default resource bundle
     74    die "\n";
     75    }
     76
     77
    6378    my $parser = new XML::Parser('Style' => 'Stream',
    6479                 'Handlers' => {'Char' => \&Char,
     
    7691}
    7792
     93sub apply_xslt
     94{
     95    my $self = shift @_;
     96    my ($xslt,$filename) = @_;
     97   
     98    my $outhandle = $self->{'outhandle'};
     99
     100    my $xslt_filename = $xslt;
     101
     102    if (! -e $xslt_filename) {
     103    # Look in main site directory
     104    my $gsdlhome = $ENV{'GSDLHOME'};
     105    $xslt_filename = &util::filename_cat($gsdlhome,$xslt);
     106    }
     107
     108    if (! -e $xslt_filename) {
     109    # Look in collection directory
     110    my $coldir = $ENV{'COLLECTDIR'};
     111    $xslt_filename = &util::filename_cat($coldir,$xslt);
     112    }
     113
     114    if (! -e $xslt_filename) {
     115    print $outhandle "Warning: Unable to find XSLT $xslt\n";
     116    if (open(XMLIN,"<$filename")) {
     117
     118        $untransformed_xml = "";
     119        while (defined (my $line = <XMLIN>)) {
     120
     121        $untransformed_xml .= $line;
     122        }
     123        close(XMLIN);
     124       
     125        return $untransformed_xml;
     126    }
     127    else {
     128        print $outhandle "Error: Unable to open file $filename\n";
     129        print $outhandle "       $!\n";
     130        return "";
     131    }
     132   
     133    }
     134
     135    my $bin_java = &util::filename_cat($ENV{'GSDLHOME'},"bin","java");
     136    my $jar_filename = &util::filename_cat($bin_java,"xalan.jar");
     137    my $xslt_base_cmd = "java -jar $jar_filename";
     138    my $xslt_cmd = "$xslt_base_cmd -IN \"$filename\" -XSL \"$xslt_filename\"";
     139
     140    my $transformed_xml = "";
     141
     142    if (open(XSLT_IN,"$xslt_cmd |")) {
     143    while (defined (my $line = <XSLT_IN>)) {
     144
     145        $transformed_xml .= $line;
     146    }
     147    close(XSLT_IN);
     148    }
     149    else {
     150    print $outhandle "Error: Unable to run command $xsl_cmd\n";
     151    print $outhandle "       $!\n";
     152    }
     153
     154    return $transformed_xml;
     155
     156}
     157
    78158
    79159sub read {
    80     # this must be global!
     160    # $self must be global to work with XML callback routines.
    81161    $self = shift (@_); 
    82162 
     
    93173    return undef;
    94174    }
     175
    95176    $file =~ s/^[\/\\]+//; # $file often begins with / so we'll tidy it up
    96177    $self->{'file'} = $file;
     
    99180    $self->{'metadata'} = $metadata;
    100181    $self->{'gli'} = $gli;
     182
    101183    eval {
    102     $self->{'parser'}->parsefile($filename);
     184    my $xslt = $self->{'xslt'};
     185    if (defined $xslt && ($xslt ne "")) {
     186        # perform xslt
     187        my $transformed_xml = $self->apply_xslt($xslt,$filename);
     188
     189        # feed transformed file (now in memory as string) into XML parser
     190        $self->{'parser'}->parse($transformed_xml);
     191    }
     192    else {
     193        $self->{'parser'}->parsefile($filename);
     194    }
    103195    };
    104196 
     
    126218    return -1; # error during processing
    127219    }
     220
    128221    return 1; # processed the file
    129222}
Note: See TracChangeset for help on using the changeset viewer.