From f9e442dd50be8fb8f9067b04011b1e6a247af4fe Mon Sep 17 00:00:00 2001 From: Marcel de Rooy Date: Mon, 10 Mar 2014 10:57:33 +0100 Subject: [PATCH] Bug 11826: Using the XSLT handler in C4/XSLT module Content-Type: text/plain; charset=utf-8 Incorporate the new object into C4/XSLT module. The handler object needed one adjustment to allow for passing URLs. Removed the GetURI function; it is no longer needed. Added some documentation lines. Moved a file-level lexical upwards in the code for visibility. Removed some tabs (on two lines). Note: The handler could perhaps be moved up to the Context module, or be saved in a global ('our') variable. But I would rather not do that now, making testing not too complex at this moment. Test plan: Enable XSLT preferences for opac and intranet. Check result and detail pages. Check individual list display (virtual shelves). Force an XSLT error by editing one of your xsl files. Check the corresponding display. Put an URL in one the XSLT prefs (could just be to your own server). Check the display. Signed-off-by: Marcel de Rooy Running XSLTParse4Display in a loop showed no significant performance change. One pass cost me around 0.012 sec (except for the first pass). --- C4/XSLT.pm | 99 ++++++++++++++++++++++++-------------------------- Koha/XSLT_Handler.pm | 3 +- 2 files changed, 50 insertions(+), 52 deletions(-) diff --git a/C4/XSLT.pm b/C4/XSLT.pm index d85b048..ba255dc 100644 --- a/C4/XSLT.pm +++ b/C4/XSLT.pm @@ -1,4 +1,5 @@ package C4::XSLT; + # Copyright (C) 2006 LibLime # # Parts Copyright Katrin Fischer 2011 @@ -9,7 +10,7 @@ package C4::XSLT; # # Koha is free software; you can redistribute it and/or modify it under the # terms of the GNU General Public License as published by the Free Software -# Foundation; either version 2 of the License, or (at your option) any later +# Foundation; either version 3 of the License, or (at your option) any later # version. # # Koha is distributed in the hope that it will be useful, but WITHOUT ANY @@ -30,21 +31,25 @@ use C4::Koha; use C4::Biblio; use C4::Circulation; use C4::Reserves; +use Koha::XSLT_Handler; + use Encode; -use XML::LibXML; -use XML::LibXSLT; -use LWP::Simple; use vars qw($VERSION @ISA @EXPORT); +my $engine; #XSLT Handler object +my %authval_per_framework; + # Cache for tagfield-tagsubfield to decode per framework. + # Should be preferably be placed in Koha-core... + BEGIN { require Exporter; $VERSION = 3.07.00.049; @ISA = qw(Exporter); @EXPORT = qw( &XSLTParse4Display - &GetURI ); + $engine=Koha::XSLT_Handler->new( { do_not_return_source => 1 } ); } =head1 NAME @@ -53,22 +58,10 @@ C4::XSLT - Functions for displaying XSLT-generated content =head1 FUNCTIONS -=head2 GetURI - -GetURI file and returns the xslt as a string - -=cut - -sub GetURI { - my ($uri) = @_; - my $string; - $string = get $uri ; - return $string; -} - =head2 transformMARCXML4XSLT Replaces codes with authorized values in a MARC::Record object +Is only used in this module currently. =cut @@ -108,13 +101,10 @@ sub transformMARCXML4XSLT { =head2 getAuthorisedValues4MARCSubfields Returns a ref of hash of ref of hash for tag -> letter controled by authorised values +Is only used in this module currently. =cut -# Cache for tagfield-tagsubfield to decode per framework. -# Should be preferably be placed in Koha-core... -my %authval_per_framework; - sub getAuthorisedValues4MARCSubfields { my ($frameworkcode) = @_; unless ( $authval_per_framework{ $frameworkcode } ) { @@ -134,7 +124,17 @@ sub getAuthorisedValues4MARCSubfields { return $authval_per_framework{ $frameworkcode }; } -my $stylesheet; +=head2 XSLTParse4Display + +Returns xml for biblionumber and requested XSLT transformation. +Returns undef if the transform fails. + +Used in OPAC results and detail, intranet results and detail, list display. +(Depending on the settings of your XSLT preferences.) + +The helper function _get_best_default_xslt_filename is used in a unit test. + +=cut sub _get_best_default_xslt_filename { my ($htdocs, $theme, $lang, $base_xslfile) = @_; @@ -195,7 +195,6 @@ sub XSLTParse4Display { # grab the XML, run it through our stylesheet, push it out to the browser my $record = transformMARCXML4XSLT($biblionumber, $orig_record); - #return $record->as_formatted(); my $itemsxml = buildKohaItemsNamespace($biblionumber, $hidden_items); my $xmlrecord = $record->as_xml(C4::Context->preference('marcflavour')); my $sysxml = "\n"; @@ -221,27 +220,19 @@ sub XSLTParse4Display { $xmlrecord =~ s/\& /\&\; /; $xmlrecord =~ s/\&\;amp\; /\&\; /; - my $parser = XML::LibXML->new(); - # don't die when you find &, >, etc - $parser->recover_silently(0); - my $source = $parser->parse_string($xmlrecord); - unless ( $stylesheet->{$xslfilename} ) { - my $xslt = XML::LibXSLT->new(); - my $style_doc; - if ( $xslfilename =~ /^https?:\/\// ) { - my $xsltstring = GetURI($xslfilename); - $style_doc = $parser->parse_string($xsltstring); - } else { - use Cwd; - $style_doc = $parser->parse_file($xslfilename); - } - $stylesheet->{$xslfilename} = $xslt->parse_stylesheet($style_doc); - } - my $results = $stylesheet->{$xslfilename}->transform($source); - my $newxmlrecord = $stylesheet->{$xslfilename}->output_string($results); - return $newxmlrecord; + #If the xslt should fail, we will return undef (old behavior was + #raw MARC) + #Note that we did set do_not_return_source at object construction + return $engine->transform($xmlrecord, $xslfilename ); #file or URL } +=head2 buildKohaItemsNamespace + +Returns XML for items. +Is only used in this module currently. + +=cut + sub buildKohaItemsNamespace { my ($biblionumber, $hidden_items) = @_; @@ -304,26 +295,32 @@ sub buildKohaItemsNamespace { "$holdingbranch". "$location". "$ccode". - "$status". - "".$itemcallnumber."" - . ""; - + "$status". + "".$itemcallnumber."". + ""; } $xml = "".$xml.""; return $xml; } +=head2 engine +Returns reference to XSLT handler object. -1; -__END__ +=cut -=head1 NOTES +sub engine { + return $engine; +} -=cut +1; + +__END__ =head1 AUTHOR Joshua Ferraro +Koha Development Team + =cut diff --git a/Koha/XSLT_Handler.pm b/Koha/XSLT_Handler.pm index 26f9264..c406bdf 100644 --- a/Koha/XSLT_Handler.pm +++ b/Koha/XSLT_Handler.pm @@ -131,6 +131,7 @@ __PACKAGE__->mk_accessors(qw( do_not_return_source )); my $output2= $xslt_engine->transform( $xml2 ); Pass a xml string and a fully qualified path of a XSLT file. + Instead of a filename, you may also pass a URL. If you do not pass a filename, the last file used is assumed. Returns the transformed string. Check the error number in err to know if something went wrong. @@ -240,7 +241,7 @@ sub _init { sub _load { my ($self, $file)= @_; - if( !$file || !-e $file ) { + if( !$file || ( $file!~ /^https?:\/\// && !-e $file ) ) { $self->_set_error(2); return; } -- 1.7.7.6