@@ -, +, @@ --- C4/Breeding.pm | 80 +++++++++++++++++--- .../prog/en/modules/acqui/z3950_search.tt | 17 +++-- .../prog/en/modules/cataloguing/z3950_search.tt | 14 ++-- 3 files changed, 86 insertions(+), 25 deletions(-) --- a/C4/Breeding.pm +++ a/C4/Breeding.pm @@ -23,11 +23,14 @@ use warnings; #use Encode; use MARC::File::USMARC; #use ZOOM; #has been loaded already in Context +use XML::LibXML; +use XML::LibXSLT; use C4::Biblio; use C4::Koha; use C4::Charset; use C4::ImportBatch; +use C4::Templates; use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); @@ -39,6 +42,8 @@ BEGIN { @EXPORT = qw(&ImportBreeding &BreedingSearch Z3950Search); } +my %xslthash; + =head1 NAME C4::Breeding : module to add biblios to import_records via @@ -230,10 +235,8 @@ sub Z3950Search { my ($pars, $template)= @_; my $server; + my @servers; my $marcdata; - my @encoding; - my @serverhost; - my @servername; my @sru; my @breeding_loop = (); my $numberpending; @@ -315,6 +318,8 @@ sub Z3950Search { my $sth = $dbh->prepare("SELECT * FROM z3950servers WHERE id=? ORDER BY rank, name"); $sth->execute($servid); while ( $server = $sth->fetchrow_hashref ) { + $servers[$s]= $server; + $servers[$s]->{encoding}= "iso-5426" if !$servers[$s]->{encoding}; if($server->{host}=~/^sru=/) { $sru[$s]= { srufields=>$server->{srufields}, @@ -339,9 +344,6 @@ sub Z3950Search { else { $oConnection[$s]->connect( $server->{host}, $server->{port} ); } - $serverhost[$s] = $server->{host}; - $servername[$s] = $server->{name}; - $encoding[$s] = ($server->{encoding}?$server->{encoding}:"iso-5426"); $s++; } ## while fetch } # foreach @@ -371,7 +373,7 @@ sub Z3950Search { $oConnection[$k]->error_x(); if ($error) { if ($error =~ m/^(10000|10007)$/ ) { - push(@errconn, {'server' => $serverhost[$k], 'error' => $error}); + push(@errconn, {'server' => $servers[$k]->{host}, 'error' => $error}); } } else { @@ -389,9 +391,14 @@ sub Z3950Search { $marcrecord= MARC::Record->new_from_xml($marcdata,'UTF-8',$sru[$k]->{syntax}); } else { #z3950 - ($marcrecord)= MarcToUTF8Record($marcdata, C4::Context->preference('marcflavour'), $encoding[$k]); + ($marcrecord)= MarcToUTF8Record($marcdata, C4::Context->preference('marcflavour'), $servers[$k]->{encoding}); } SetUTF8Flag($marcrecord); + $marcrecord= do_xslt_proc($marcrecord, $servers[$k]->{add_xslt}); + if(!$marcrecord) { + push @errconn, {'server' => $servers[$k]->{name}, 'error' => 'Additional XSLT failure on record '.$i}; #not a real connection error.. + next; + } my $oldbiblio = TransformMarcToKoha( $dbh, $marcrecord, "" ); $oldbiblio->{isbn} =~ s/ |-|\.//g if $oldbiblio->{isbn}; @@ -405,11 +412,11 @@ sub Z3950Search { $oldbiblio->{issn} =~ s/\(/ \(/g if $oldbiblio->{issn}; #call to ImportBreeding replaced by next two calls for optimization - my $batch_id = GetZ3950BatchId($servername[$k]); + my $batch_id = GetZ3950BatchId($servers[$k]->{name}); my $breedingid = AddBiblioToBatch($batch_id, 0, $marcrecord, 'UTF-8', $pars->{random}); my %row_data; - $row_data{server} = $servername[$k]; + $row_data{server} = $servers[$k]->{name}; $row_data{isbn} = $oldbiblio->{isbn}; $row_data{lccn} = $oldbiblio->{lccn}; $row_data{title} = $oldbiblio->{title}; @@ -421,7 +428,7 @@ sub Z3950Search { push( @breeding_loop, \%row_data ); } else { - push(@breeding_loop,{'server'=>$servername[$k],'title'=>join(': ',$oConnection[$k]->error_x()),'breedingid'=>-1,'biblionumber'=>-1}); + push(@breeding_loop,{'server'=>$servers[$k]->{name},'title'=>join(': ',$oConnection[$k]->error_x()),'breedingid'=>-1,'biblionumber'=>-1}); } # $rec } } #$numresults @@ -430,7 +437,7 @@ sub Z3950Search { $numberpending = $nremaining - 1; $template->param( breeding_loop => \@breeding_loop, - server => $servername[$k], + server => $servers[$k]->{name}, numberpending => $numberpending, biblionumber => $pars->{biblionumber}, errconn => \@errconn, @@ -493,5 +500,54 @@ sub tran_query { #translate to specific sru fields per server return $q; } +sub do_xslt_proc { + my ($marcrec, $xsltfile)= @_; + return $marcrec if !$xsltfile; + + my $stylesheet= _load_xslt_stylesheet($xsltfile); + return $marcrec if !$stylesheet; + + my $parser = XML::LibXML->new(); + my $doc= $parser->parse_string($marcrec->as_xml()); + return if !$doc; #undef: trouble + + my $result= $stylesheet->transform($doc); + my $xml= $stylesheet->output_as_chars($result); + return $xml? MARC::Record->new_from_xml($xml, 'UTF-8'): undef; +} + +sub _load_xslt_stylesheet { + my ($name)= @_; + if(exists $xslthash{$name}) { + return $xslthash{$name}{stylesheet}; + } + my $f=_full_xslt_path($name); + if($f && -e $f) { + my $parser = XML::LibXML->new(); + #my $style_doc = $parser->parse_file($f); + my $style_doc = $parser->load_xml(location=>$f); + my $xslt = XML::LibXSLT->new(); + $xslthash{$name}{stylesheet}= $xslt->parse_stylesheet($style_doc); + return $xslthash{$name}{stylesheet}; + } +} + +sub _full_xslt_path { + my $name=shift; + #absolute path? + if(substr($name,0,1) eq '/') { + return $name; + } + #a relative path: look in xslt subfolder of staff templates + my $dir= C4::Context->config('intrahtdocs').'/'. + C4::Context->preference('template'); + #try language folder first, otherwise english + my $lang=C4::Templates::_current_language() || 'en'; #null->english + my $ff= $dir.'/'.$lang.'/xslt/'.$name; + return $ff if -e $ff; + $ff=$dir.'/en/xslt/'.$name; + return $ff; +} + 1; __END__ --- a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/z3950_search.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/acqui/z3950_search.tt @@ -156,23 +156,26 @@ tr.selected { background-color : #FFFFCC; } tr.selected td { background-color : [% END %] [% ELSE %] - [% IF ( emptyserverlist ) %] +
Nothing found. Try another search.
+ [% END %] + [% IF ( emptyserverlist ) %]
You didn't select any Z39.50 target.
- [% ELSE %] - [% IF ( errconn ) %] + [% ELSE %] + [% IF ( errconn ) %] +

Problems

- [% END %] [% END %] -
Nothing found. Try another search.
[% END %] - [% END %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/z3950_search.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/cataloguing/z3950_search.tt @@ -160,21 +160,23 @@ tr.selected { background-color : #FFFFCC; } tr.selected td { background-color : [% END %] [% END %] -

[% ELSE %] - [% IF ( errconn ) %] +
Nothing found.
+ [% END %] + [% IF ( errconn ) %] +

Problems

- [% END %] -
Nothing found.
-

[% END %] +

[% END %] --