@@ -, +, @@ --- Koha/XSLT_Handler.pm | 16 +++++++++++++--- t/db_dependent/XSLT_Handler.t | 25 ++++++++++++++++++++++++- t/db_dependent/XSLT_Handler/test04.xsl | 18 ++++++++++++++++++ 3 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 t/db_dependent/XSLT_Handler/test04.xsl --- a/Koha/XSLT_Handler.pm +++ a/Koha/XSLT_Handler.pm @@ -132,8 +132,8 @@ __PACKAGE__->mk_accessors(qw( do_not_return_source print_warns )); my $output= $xslt_engine->transform( $xml, $xsltfilename ); #Alternatively: - #$output = $xslt_engine->transform({ xml => $xml, file => $file }); - #$output = $xslt_engine->transform({ xml => $xml, code => $code }); + #$output = $xslt_engine->transform({ xml => $xml, file => $file, [parameters => $parameters] }); + #$output = $xslt_engine->transform({ xml => $xml, code => $code, [parameters => $parameters] }); if( $xslt_engine->err ) { #decide what to do on failure.. } @@ -156,10 +156,12 @@ sub transform { # old style: $xml, $filename # new style: $hashref my ( $xml, $filename, $xsltcode ); + my $parameters = {}; if( ref $_[0] eq 'HASH' ) { $xml = $_[0]->{xml}; $xsltcode = $_[0]->{code}; $filename = $_[0]->{file} if !$xsltcode; #xsltcode gets priority + $parameters = $_[0]->{parameters} if ref $_[0]->{parameters} eq 'HASH'; } else { ( $xml, $filename ) = @_; } @@ -192,7 +194,15 @@ sub transform { return $retval; } my $str = eval { - my $result = $stsh->transform($source); + #$parameters is an optional hashref that contains + #key-value pairs to be sent to the XSLT. + #Numbers may be bare but strings must be double quoted + #(e.g. "'string'" or '"string"'). See XML::LibXSLT for + #more details. + + #NOTE: Parameters are not cached. They are provided for + #each different transform. + my $result = $stsh->transform($source, %$parameters); $stsh->output_as_chars($result); }; if ($@) { --- a/t/db_dependent/XSLT_Handler.t +++ a/t/db_dependent/XSLT_Handler.t @@ -21,7 +21,7 @@ use Modern::Perl; use FindBin; use File::Slurp; -use Test::More tests => 37; +use Test::More tests => 40; use Test::Warn; use Koha::XSLT_Handler; @@ -156,4 +156,27 @@ $output= $engine->transform( $xml_2, $xsltfile_3 ); is( $engine->err, undef, 'Unexpected error on transform with third xsl' ); is( $engine->refresh, 3, 'Final test on clearing cache' ); +my $xsltfile_4 = 'test04.xsl'; +is( -e $path.$xsltfile_4, 1, "Found my test stylesheet $xsltfile_4" ); +exit if !-e $path.$xsltfile_4; +$xsltfile_4 = $path.$xsltfile_4; + +my $parameters = { injected_variable => "'this is a test'",}; +$output = $engine->transform({ + xml => $xml_1, + file => $xsltfile_4, + parameters => $parameters, + }); +require XML::LibXML; +my $dom = XML::LibXML->load_xml(string => $output); +my $result = $dom->find( '/just_a_tagname' ); +is ( $result->to_literal(), 'this is a test', "Successfully injected string into XSLT parameter/variable"); + +$output = $engine->transform({ + xml => $xml_1, + file => $xsltfile_4, + }); +my $dom = XML::LibXML->load_xml(string => $output); +my $result = $dom->find( '/just_a_tagname' ); +is ( $result->to_literal(), '', "As expected, no XSLT parameters/variables were added"); #End of tests --- a/t/db_dependent/XSLT_Handler/test04.xsl +++ a/t/db_dependent/XSLT_Handler/test04.xsl @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + --