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..
}
# 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 ) = @_;
}
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 ($@) {
use FindBin;
use File::Slurp;
-use Test::More tests => 37;
+use Test::More tests => 40;
use Test::Warn;
use Koha::XSLT_Handler;
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
--- /dev/null
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:marc="http://www.loc.gov/MARC21/slim"
+>
+ <xsl:output method="xml" encoding="UTF-8" version="1.0" indent="yes"/>
+ <xsl:param name="injected_variable" />
+
+ <xsl:template match="/">
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="node()">
+ <xsl:copy>
+ <xsl:value-of select="$injected_variable"/>
+ </xsl:copy>
+ </xsl:template>
+
+</xsl:stylesheet>