[Patches] [PATCH] [SIGNED-OFF] 6536: Z3950 Enhancements (Functionality)

koha-patchbot at kohaaloha.com koha-patchbot at kohaaloha.com
Thu Dec 22 18:40:03 NZDT 2011


From: Marcel de Rooy <m.de.rooy at rijksmuseum.nl>
Date: Wed, 29 Jun 2011 14:17:20 +0200
Subject: [PATCH] [SIGNED-OFF] 6536: Z3950 Enhancements (Functionality)

Z3950 Enhancements: SRU search targets, MARC conversion and additional XSLT processing
Testplan: see http://wiki.koha-community.org/wiki/Z3950_RFC

Signed-off-by: Katrin Fischer <Katrin.Fischer.83 at web.de>
Comments on second patch.
---
 C4/Breeding.pm                                     |  439 +++++++-
 acqui/z3950_search.pl                              |  320 +-----
 admin/z3950servers.pl                              |   57 +-
 cataloguing/z3950_search.pl                        |  297 +-----
 .../prog/en/modules/admin/z3950servers.tt          |    2 +
 .../intranet-tmpl/prog/en/xslt/MARC21toUNIMARC.xsl | 1187 ++++++++++++++++++++
 .../intranet-tmpl/prog/en/xslt/UNIMARCtoMARC21.xsl |  523 +++++++++
 7 files changed, 2283 insertions(+), 542 deletions(-)
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21toUNIMARC.xsl
 create mode 100644 koha-tmpl/intranet-tmpl/prog/en/xslt/UNIMARCtoMARC21.xsl

diff --git a/C4/Breeding.pm b/C4/Breeding.pm
index 9003f9a..cb04e14 100644
--- a/C4/Breeding.pm
+++ b/C4/Breeding.pm
@@ -21,10 +21,14 @@ use strict;
 use warnings;
 
 use C4::Biblio;
-use C4::Koha;
 use C4::Charset;
-use MARC::File::USMARC;
 use C4::ImportBatch;
+use C4::Koha;
+
+use MARC::File::USMARC;
+use XML::LibXML;
+use XML::LibXSLT;
+use ZOOM;
 
 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
 
@@ -36,6 +40,21 @@ BEGIN {
 	@EXPORT = qw(&ImportBreeding &BreedingSearch);
 }
 
+#-------------------------------------------------------------------------------
+
+use constant MAX_RESULTS => 20;
+use constant TO_UNIMARC_XSLT => 'MARC21toUNIMARC.xsl';
+use constant TO_MARC21_XSLT => 'UNIMARCtoMARC21.xsl';
+
+my ($input, at oConnection, at oResult, at hServer,$zquery, $squery);
+#zquery in z3950 format; squery general sru, needs server translation
+my $xsltconv; #stylesheet for marc conversion
+my $flavour; #system marc flavour
+
+my $DEBUG=0;	#set to 1 for debug warnings
+
+#-------------------------------------------------------------------------------
+
 =head1 NAME
 
 C4::Breeding : module to add biblios to import_records via
@@ -154,7 +173,6 @@ sub ImportBreeding {
     return ($notmarcrecord,$alreadyindb,$alreadyinfarm,$imported,$breedingid);
 }
 
-
 =head2 BreedingSearch
 
 ($count, @results) = &BreedingSearch($title,$isbn,$random);
@@ -216,6 +234,421 @@ sub BreedingSearch {
     return($count, @results);
 } # sub breedingsearch
 
+=head2 z3950_search
+
+($breedingref, $error_ref)= C4::Breeding::z3950_search($input);
+C<$input> is a CGI object: all search parameters are passed via this object
+
+C<$breedingref> is an arrayref of search result hashes.
+C<$error_ref> is an arrayref of error messages per server.
+
+z3950_search does not call ImportBreeding anymore for performance reasons.
+
+=cut
+
+sub z3950_search {
+# This is a completely new Z3950 clients search using async ZOOM -TG 02/11/06
+# Did some refactoring, introduced SRU searching -MR 20110608
+# And incorporated Biblibre XSLT processing for MARC21/UNIMARC conversion
+  $input= shift; #CGI object passed
+  my (@errconn, @breeding_loop);
+
+  init_vars();
+  build_query();
+  my $s= create_connections();
+  load_xslt();
+  start_async_searches();
+
+  my $nremaining  = $s;
+  while($nremaining>0) {
+    my $k=loop_conn_events(); #returns finished connection number
+    handle_conn_results(\@breeding_loop, \@errconn, $k) unless $k<0;
+    --$nremaining;
+  }
+  $_->destroy() for @oConnection;
+
+  return (\@breeding_loop, \@errconn );
+}
+
+#-------------------------------------------------------------------------------
+# Some internal subroutines
+
+sub init_vars {
+  @oConnection=();
+  @oResult=();
+  @hServer=();
+  ($zquery,$squery,$xsltconv,$flavour)=('','',undef,'');
+}
+
+sub build_query {
+  my $nterms=0;
+  my $title         = $input->param('title')||'';
+  my $author        = $input->param('author')||'';
+  my $isbn          = $input->param('isbn')||'';
+  my $lccall        = $input->param('lccall')||'';
+  my $subject       = $input->param('subject')||'';
+  my $dewey         = $input->param('dewey')||'';
+  my $controlnumber = $input->param('controlnumber')||'';
+  my $stdid         = $input->param('stdid')||'';
+  my $srchany       = $input->param('srchany')||'';
+
+  if ($isbn) {
+        $zquery = "\@or \@attr 1=8 \"$isbn\" \@attr 1=7 \"$isbn\" ";
+	$squery = "([isbn]=\"$isbn\" or [issn]=\"$isbn\") and ";
+        $nterms++;
+  }
+  if ($title) {
+        utf8::decode($title);
+        $zquery .= "\@attr 1=4 \"$title\" ";
+	$squery .= "[title]=\"$title\" and ";
+        $nterms++;
+  }
+  if ($author) {
+        utf8::decode($author);
+        $zquery .= "\@attr 1=1003 \"$author\" ";
+	$squery .= "[author]=\"$author\" and ";
+        $nterms++;
+  }
+  if ($dewey) {
+        $zquery .= "\@attr 1=16 \"$dewey\" ";
+	$squery .= "[dewey]=\"$dewey\" and ";
+        $nterms++;
+  }
+  if ($subject) {
+        utf8::decode($subject);
+        $zquery .= "\@attr 1=21 \"$subject\" ";
+	$squery .= "[subject]=\"$subject\" and ";
+        $nterms++;
+  }
+  if ($lccall) {
+        $zquery .= "\@attr 1=16 \@attr 2=3 \@attr 3=1 \@attr 4=1 \@attr 5=1 \@attr 6=1 \"$lccall\" ";
+	$squery .= "[lccn]=\"$lccall\" and ";
+        $nterms++;
+  }
+  if ($controlnumber) {
+        $zquery .= "\@attr 1=12 \"$controlnumber\" ";
+	$squery .= "[controlnumber]=\"$controlnumber\" and ";
+        $nterms++;
+  }
+  if ($stdid) {
+        $zquery .= "\@attr 1=1007 \"$stdid\" ";
+	$squery .= "[stdid]=\"$stdid\" and ";
+        $nterms++;
+  }
+  if ($srchany) {
+        $zquery .= "\@attr 1=1016 \"$srchany\" ";
+	$squery .= "[any]=\"$srchany\" and ";
+        $nterms++;
+  }
+  for(1..$nterms-1) {
+      $zquery = "\@and " . $zquery;
+  }
+  $squery=~s/\sand\s$//; #remove last and in sru query
+  warn "zquery ".$zquery  if $DEBUG;
+  warn "squery ".$squery  if $DEBUG;
+}
+
+sub create_connections {
+  my $s=0;
+  my $dbh= C4::Context->dbh;
+
+  my @id= $input->param('id');
+  foreach my $servid (@id) {
+        my $sth = $dbh->prepare("select * from z3950servers where id=?");
+        $sth->execute($servid);
+        my $server = $sth->fetchrow_hashref;
+	next unless $server;
+        warn "serverinfo ".join(':',my @a=map($_||'',%$server)) if $DEBUG;
+
+        $server->{sru}= $server->{host}=~/^sru=/ ? 1: 0;
+	change_sru_host($server) if $server->{sru};
+
+	#set connection options
+        my $option1      = new ZOOM::Options();
+        $option1->option('async' => 1);
+        $option1->option('elementSetName', 'F');
+        $option1->option('databaseName', $server->{db}) unless $server->{sru};
+        $option1->option('user', $server->{userid}) if $server->{userid};
+        $option1->option('password',$server->{password}) if $server->{password};
+        $option1->option('preferredRecordSyntax', $server->{syntax});
+        $option1->option('maximumRecords', MAX_RESULTS) if $server->{sru};
+	  #MR: doubt if maximum makes difference when going through ZOOM
+	pass_sru_options($server,$option1) if $server->{sru};
+
+	#create connection object
+	my $conn;
+        $oConnection[$s]= create ZOOM::Connection($option1);
+
+	#now connect
+	if($server->{sru}) {
+          $oConnection[$s]->connect( 'http://'.$server->{host});
+        }
+        else {
+          $oConnection[$s]->connect( $server->{host}, $server->{port} );
+	}
+
+        $hServer[$s]= $server;
+        $s++;
+  }
+  return $s;
+}
+
+sub change_sru_host { #merge port and database into hostname
+  my $server= shift;
+  if($server->{port} ne '80') {
+    if($server->{host}=~/^([^\/]+)\/(.*)$/ ) {
+      $server->{host}= $1.':'.$server->{port}.'/'.$2;
+    }
+    else {
+      $server->{host}.= ':'.$server->{port};
+    }
+  }
+  #prevent double slash between host and db when concatenating
+  $server->{host}=~ s/\/$//g;
+  $server->{db}=~ s/^\///g;
+  $server->{host}.= '/'.$server->{db};
+}
+
+sub pass_sru_options {
+  my ($server, $option1)=@_;
+  my @parts= split /,/,$server->{host};
+  foreach(my $i=0; $i<@parts; $i++) {
+    if($i==@parts-1) {
+      $server->{host}=$parts[$i];
+    }
+    else {
+      if($parts[$i]=~/^([^=]+)=(.*)/) {
+        $option1->option( $1 => $2);
+      }
+    }
+  }
+}
+
+sub load_xslt { #load stylesheet for marc conversion IF needed
+  $flavour= C4::Context->preference('marcflavour');
+  my $loaded=0;
+  foreach (@hServer) { #load stylesheet once, set key for each server
+    $_->{marc_conv}=0;
+    if($flavour eq 'MARC21' && $_->{syntax}=~/UNIMARC/) {
+      $_->{marc_conv}=1;
+      _load_xslt_stylesheet(TO_MARC21_XSLT) unless $loaded;
+      $loaded=1;
+    }
+    elsif($flavour eq 'UNIMARC' && $_->{syntax}!~/UNIMARC/) {
+      $_->{marc_conv}=1;
+      _load_xslt_stylesheet(TO_UNIMARC_XSLT) unless $loaded;
+      $loaded=1;
+    }
+  }
+}
+
+sub _load_xslt_stylesheet {
+  my ($name)= @_;
+  my $f=full_xslt_path($name);
+  if($f) {
+    my $parser = XML::LibXML->new();
+    my $xslt = XML::LibXSLT->new();
+    my $style_doc = $parser->parse_file($f);
+    $xsltconv = $xslt->parse_stylesheet($style_doc);
+  }
+  else {
+    warn "z3950_search: XSLT problem with $name";
+  }
+}
+
+sub full_xslt_path {
+  my $name=shift;
+  #absolute path?
+  if(substr($name,0,1) eq '/') {
+    return -e $name?$name:undef;
+  }
+  #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=$input->cookie('KohaOpacLanguage')||'en'; #null->english
+  my $ff= $dir.'/'.$lang.'/xslt/'.$name;
+  return $ff if -e $ff;
+  $ff=$dir.'/en/xslt/'.$name;
+  return -e $ff? $ff: undef;
+}
+
+sub start_async_searches {
+  my $k=0;
+  foreach my $conn (@oConnection) {
+    warn 'Doing search '.($k+1) if $DEBUG;
+    if($hServer[$k]->{sru}) {
+      $oResult[$k] = $conn->search(new ZOOM::Query::CQL(tran_query($k)));
+    }
+    else {
+      $oResult[$k]=$conn->search_pqf($zquery);
+    }
+    $k++;
+  }
+}
+
+sub loop_conn_events {
+  my ($event, $k);
+  while ( ( $k = ZOOM::event( \@oConnection ) ) != 0 ) {
+        $event = $oConnection[ $k - 1 ]->last_event();
+        warn( "connection ", $k - 1, ": event $event (",
+            ZOOM::event_str($event), ")\n" )
+          if $DEBUG;
+        last if $event == ZOOM::Event::ZEND;
+  }
+  return $k-1;
+}
+
+sub handle_conn_results {
+  my ($breedingref, $errorref, $conn)= @_;
+
+  warn 'Handling results for '.$hServer[$conn]->{name} if $DEBUG;
+  my ($error, $errmsg, $addinfo, $diagset)= $oConnection[$conn]->error_x();
+  if ($error) {
+    if ($error =~ m/^(10000|10007)$/ ) {
+      push(@$errorref, {'server' => $hServer[$conn]->{host} });
+    }
+    warn "$conn ".$hServer[$conn]->{host}.
+	" error $zquery: $errmsg ($error) $addinfo\n";
+    return;
+  }
+
+  my $numresults = $oResult[$conn]->size();
+  warn "Number of hits: $numresults" if $DEBUG;
+  $numresults= MAX_RESULTS if $numresults>MAX_RESULTS;
+  for(my $i=0; $i<$numresults; $i++) {
+    my $rec = $oResult[$conn]->record($i);
+    if($rec) {
+      handle_one_result($rec, $breedingref, $conn);
+    }
+    else {
+      push(@$breedingref, {
+	'server' => $hServer[$conn]->{name},
+	'title' => join(': ',$oConnection[$conn]->error_x()),
+	'breedingid' => -1,
+	'biblionumber' => -1
+      });
+    }
+  }
+  $oResult[$conn]->destroy();
+}
+
+sub handle_one_result {
+  my ($rec, $breedingref, $conn)= @_;
+  my $marcrecord;
+
+  if($hServer[$conn]->{sru}) { #SRU
+    $marcrecord= MARC::Record->new_from_xml($rec->raw(),'UTF-8',
+	$hServer[$conn]->{syntax});
+  }
+  else { #z3950
+    ($marcrecord)= MarcToUTF8Record($rec->raw(),
+	marcflavour_from_syntax($conn), $hServer[$conn]->{encoding});
+  }
+  $marcrecord->encoding('UTF-8'); #force UTF-8
+  #convert to system marc flavour and/or additional xslt proc.
+  $marcrecord= do_xslt_processing($conn, $marcrecord);
+
+  #call to ImportBreeding replaced by next two calls for optimization
+  my $batch_id = GetZ3950BatchId($hServer[$conn]->{name});
+  my $random= $input->param('random') || rand(1000000000);
+  my $breedingid = AddBiblioToBatch($batch_id, 0, $marcrecord, 'UTF-8',$random);
+  #call to TransformMarcToKoha replaced by next call; we only need 6 fields
+  #save results
+  add_breeding($breedingref, $conn, $marcrecord, $breedingid);
+}
+
+sub marcflavour_from_syntax {
+#passing USMARC to MarcToUTF8Record doesn't work; only knows MARC21/UNIMARC
+  my $conn= shift;
+  return 'UNIMARC' if $hServer[$conn]->{syntax}=~/UNIMARC/;
+  return 'MARC21'; #otherwise
+}
+
+sub do_xslt_processing {
+#convert marc21<->unimarc and/or additional xslt; return MARC record
+  my ($conn, $marcrecord)= @_;
+  my ($res, $newmarcrec, $parser, $style_doc, $stylesheet);
+
+  if($hServer[$conn]->{marc_conv} && defined $xsltconv) {
+    $parser = XML::LibXML->new();
+    $res= $parser->parse_string($marcrecord->as_xml());
+    $res= $xsltconv->transform($res);
+    $res= $xsltconv->output_string($res);
+    $newmarcrec= MARC::Record->new_from_xml($res, 'UTF-8');
+  }
+
+  if($hServer[$conn]->{add_xslt}) { #server specific xslt proc
+    $res= $newmarcrec? $newmarcrec->as_xml(): $marcrecord->as_xml();
+    $parser = XML::LibXML->new() unless $parser;
+    $res= $parser->parse_string($res);
+    my $f= full_xslt_path($hServer[$conn]->{add_xslt});
+    $style_doc = $parser->parse_file($f) if $f;
+    my $xslt = XML::LibXSLT->new();
+    $stylesheet = $xslt->parse_stylesheet($style_doc) if $style_doc;
+    if($stylesheet) {
+      $res= $stylesheet->transform($res);
+      $res= $stylesheet->output_string($res);
+      $newmarcrec= MARC::Record->new_from_xml($res, 'UTF-8');
+    }
+    else {
+      warn "z3950_search: XSLT problem with ".$hServer[$conn]->{add_xslt};
+    }
+  }
+  return $newmarcrec // $marcrecord;
+}
+
+sub add_breeding {
+  my ($breedingref, $conn, $marcrecord, $breedingid)=@_;
+  my %row_data=();
+  $row_data{server}       = $hServer[$conn]->{name};
+  $row_data{breedingid}   = $breedingid;
+  $row_data{biblionumber} = $input->param('biblionumber')||0;
+  if($flavour ne 'UNIMARC') { #MARC21 system (not target!)
+    $row_data{isbn} = isbn_cleanup($marcrecord->subfield('020','a')||'');
+    $row_data{title}= $marcrecord->subfield('245','a')||'';
+    $row_data{author}= $marcrecord->subfield('100','a')||'';
+    $row_data{date}= $marcrecord->subfield('260','c')||'';
+    $row_data{edition}= $marcrecord->subfield('250','a')||'';
+    $row_data{lccn}= $marcrecord->subfield('050','a')||'';
+  }
+  else { #UNIMARC system (not target!)
+    $row_data{isbn}= isbn_cleanup($marcrecord->subfield('010','a')||'');
+    $row_data{title}= $marcrecord->subfield('200','a')||'';
+    $row_data{author}= $marcrecord->subfield('200','f')||'';
+    $row_data{date}= $marcrecord->subfield('210','d')||'';
+    $row_data{edition}= $marcrecord->subfield('205','a')||'';
+    $row_data{lccn}= '';
+  }
+  push( @$breedingref, \%row_data );
+}
+
+sub isbn_cleanup {
+  my $isbn= shift;
+  $isbn=~ s/ |-|\.//g;
+  $isbn=~ s/\|/ \| /g;
+  $isbn=~ s/\(/ \(/g;
+  return $isbn;
+}
+
+sub tran_query { #translate to specific sru fields per server
+  my ($s)= @_;
+  #srufields is in format title=field,isbn=field,...
+  #if a field doesn't exist, try anywhere or remove [field]=
+  my @parts= split(',', $hServer[$s]->{srufields});
+  my %trans= map { if(/=/){($`,$')}else{()} } @parts;
+
+  my $q=$squery; my $any= $trans{any}?$trans{any}.'=':'';
+  foreach my $key (keys %trans) {
+    my $f=$trans{$key};
+    if($f) {$q=~s/\[$key\]/$f/g; } else {$q=~s/\[$key\]=/$any/g; }
+  }
+  $q=~s/\[\w+\]=/$any/g; # remove remaining fields (not found in field list)
+  warn $hServer[$s]->{name}." sru query: $q" if $DEBUG;
+  return $q;
+}
+
 1;
+
 __END__
 
diff --git a/acqui/z3950_search.pl b/acqui/z3950_search.pl
index 47dbe52..39b7ffd 100755
--- a/acqui/z3950_search.pl
+++ b/acqui/z3950_search.pl
@@ -1,6 +1,5 @@
 #!/usr/bin/perl
 
-# This is a completely new Z3950 clients search using async ZOOM -TG 02/11/06
 # Copyright 2000-2002 Katipo Communications
 # Copyright 2010 Catalyst IT
 #
@@ -21,19 +20,19 @@
 
 use warnings;
 use strict;
+
 use CGI;
 
 use C4::Auth;
+use C4::Koha;
 use C4::Output;
-use C4::Biblio;
 use C4::Context;
 use C4::Breeding;
-use C4::Koha;
-use C4::Charset;
 use C4::Bookseller qw/ GetBookSellerFromId /;
-use ZOOM;
 
-my $input        = new CGI;
+#-------------------------------------------------------------------------------
+
+my $input= new CGI;
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
     {
         template_name   => "acqui/z3950_search.tmpl",
@@ -44,278 +43,77 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
         debug           => 1,
     }
 );
+my $frameworkcode = $input->param('frameworkcode')||'';
+my $vendor = GetBookSellerFromId($input->param('booksellerid')||0);
+$template->param(
+	frameworkcode => $frameworkcode,
+	frameworkcodeloop => get_framework_list(),
+	booksellerid => $input->param('booksellerid')||0,
+	basketno => $input->param('basketno'),
+	name => $vendor? $vendor->{'name'}: '',
+);
 
-
-my $dbh          = C4::Context->dbh;
-my $error        = $input->param('error');
-my $biblionumber = $input->param('biblionumber');
-$biblionumber = 0 unless $biblionumber;
-my $frameworkcode = $input->param('frameworkcode');
-my $title         = $input->param('title');
-my $author        = $input->param('author');
-my $isbn          = $input->param('isbn');
-my $issn          = $input->param('issn');
-my $lccn          = $input->param('lccn');
-my $lccall          = $input->param('lccall');
-my $subject= $input->param('subject');
-my $dewey = $input->param('dewey');
-my $controlnumber	= $input->param('controlnumber');
-my $op            = $input->param('op');
-my $booksellerid = $input->param('booksellerid');
-my $basketno = $input->param('basketno');
-my $noconnection;
-my $numberpending;
-my $attr = '';
-my $term;
-my $host;
-my $server;
-my $database;
-my $port;
-my $marcdata;
-my @encoding;
-my @results;
-my $count;
-my $toggle;
-my $record;
-my $oldbiblio;
-my $errmsg;
-my @serverhost;
-my @servername;
-my @breeding_loop = ();
-my $random        = $input->param('random');
-unless ($random)
-{    # this var is not useful anymore just kept to keep rel2_2 compatibility
-    $random = rand(1000000000);
+my $op= $input->param('op')||'';
+if($op ne "do_search") {
+    show_search_form();
+}
+else {
+    run_search();
 }
+output_html_with_http_headers $input, $cookie, $template->output;
 
-my $DEBUG = 0;    # if set to 1, many debug message are send on syslog.
+#-------------------------------------------------------------------------------
 
-# get framework list
-my $frameworks = getframeworks;
-my @frameworkcodeloop;
-foreach my $thisframeworkcode ( keys %$frameworks ) {
+sub get_framework_list {
+  my $frameworks = getframeworks();
+  my @frameworkcodeloop;
+  foreach my $thisframeworkcode ( keys %$frameworks ) {
     my %row = (
         value         => $thisframeworkcode,
         frameworktext => $frameworks->{$thisframeworkcode}->{'frameworktext'},
     );
-    if ( $row{'value'} eq $frameworkcode){
+    if ($row{'value'} eq $frameworkcode) {
         $row{'active'} = 'true';
     }
     push @frameworkcodeloop, \%row;
+  }
+  return \@frameworkcodeloop;
 }
 
-my $vendor = GetBookSellerFromId($booksellerid);
-$template->param( frameworkcode => $frameworkcode, 
-                                    frameworkcodeloop => \@frameworkcodeloop,
-                                    booksellerid => $booksellerid,
-                                    basketno => $basketno,
-                                    name => $vendor->{'name'}
-                                    );
-                                    
+#-------------------------------------------------------------------------------
 
-
-if ( $op ne "do_search" ) {
-    my $sth = $dbh->prepare("select id,host,name,checked from z3950servers  order by host");
-    $sth->execute();
-    my $serverloop = $sth->fetchall_arrayref( {} );
-    $template->param(
-        isbn         => $isbn,
-        issn         => $issn,
-        lccn         => $lccn,
-        lccall       => $lccall,
-        title        => $title,
-        author       => $author,
-        controlnumber=> $controlnumber,
+sub show_search_form {
+  my $dbh= C4::Context->dbh;
+  my $sth = $dbh->prepare("select id,host,name,checked from z3950servers order by host");
+  $sth->execute();
+  my $serverloop = $sth->fetchall_arrayref( {} );
+  $template->param(
+        biblionumber => $input->param('biblionumber') || 0,
         serverloop   => $serverloop,
         opsearch     => "search",
-        biblionumber => $biblionumber,
-    );
-    output_html_with_http_headers $input, $cookie, $template->output;
-}
-else {
-    my @id = $input->param('id');
-    my @oConnection;
-    my @oResult;
-    my $s = 0;
-    my $query;
-    my $nterms;
-    if ($isbn || $issn) {
-        $term=$isbn if ($isbn);
-        $term=$issn if ($issn);
-        $query .= " \@or \@attr 1=8 \"$term\" \@attr 1=7 \"$term\" ";
-        $nterms++;
-    }
-    if ($title) {
-        utf8::decode($title);
-        $query .= " \@attr 1=4 \"$title\" ";
-        $nterms++;
-    }
-    if ($author) {
-        utf8::decode($author);
-        $query .= " \@attr 1=1003 \"$author\" ";
-        $nterms++;
-    }
-    if ($dewey) {
-        $query .= " \@attr 1=16 \"$dewey\" ";
-        $nterms++;
-    }
-    if ($subject) {
-        utf8::decode($subject);
-        $query .= " \@attr 1=21 \"$subject\" ";
-        $nterms++;
-    }
-	if ($lccn) {	
-        $query .= " \@attr 1=9 $lccn ";
-        $nterms++;
-    }
-    if ($lccall) {
-        $query .= " \@attr 1=16 \@attr 2=3 \@attr 3=1 \@attr 4=1 \@attr 5=1 \@attr 6=1 \"$lccall\" ";
-        $nterms++;
-    }
-    if ($controlnumber) {
-        $query .= " \@attr 1=12 \"$controlnumber\" ";
-        $nterms++;
-    }
-for my $i (1..$nterms-1) {
-    $query = "\@and " . $query;
+        title        => $input->param('title')||'',
+        isbn         => $input->param('isbn')||'',
+        lccall       => $input->param('lccall')||'',
+        controlnumber=> $input->param('controlnumber')||'',
+        #srchany      => $input->param('srchany')||'',
+        author       => $input->param('author')||'',
+        subject      => $input->param('subject')||'',
+        dewey        => $input->param('dewey')||'',
+        #stdid        => $input->param('stdid')||'',
+  );
+  #acqui z3950 doesn't support srchany and stdid but cataloguing does
 }
-warn "query ".$query  if $DEBUG;
-
-    foreach my $servid (@id) {
-        my $sth = $dbh->prepare("select * from z3950servers where id=?");
-        $sth->execute($servid);
-        while ( $server = $sth->fetchrow_hashref ) {
-            warn "serverinfo ".join(':',%$server) if $DEBUG;
-            my $noconnection = 0;
-            my $option1      = new ZOOM::Options();
-            $option1->option( 'async' => 1 );
-            $option1->option( 'elementSetName', 'F' );
-            $option1->option( 'databaseName',   $server->{db} );
-            $option1->option( 'user', $server->{userid} ) if $server->{userid};
-            $option1->option( 'password', $server->{password} )
-              if $server->{password};
-            $option1->option( 'preferredRecordSyntax', $server->{syntax} );
-            $oConnection[$s] = create ZOOM::Connection($option1)
-              || $DEBUG
-              && warn( "" . $oConnection[$s]->errmsg() );
-            warn( "server data", $server->{name}, $server->{port} ) if $DEBUG;
-            $oConnection[$s]->connect( $server->{host}, $server->{port} )
-              || $DEBUG
-              && warn( "" . $oConnection[$s]->errmsg() );
-            $serverhost[$s] = $server->{host};
-            $servername[$s] = $server->{name};
-            $encoding[$s]   = ($server->{encoding}?$server->{encoding}:"iso-5426");
-            $s++;
-        }    ## while fetch
-    }    # foreach
-    my $nremaining  = $s;
-    my $firstresult = 1;
-
-    for ( my $z = 0 ; $z < $s ; $z++ ) {
-        warn "doing the search" if $DEBUG;
-        $oResult[$z] = $oConnection[$z]->search_pqf($query)
-          || $DEBUG
-          && warn( "somthing went wrong: " . $oConnection[$s]->errmsg() );
-
-        # $oResult[$z] = $oConnection[$z]->search_pqf($query);
-    }
 
-sub displayresults {
-    my $k;
-    my $event;
-    while ( ( $k = ZOOM::event( \@oConnection ) ) != 0 ) {
-        $event = $oConnection[ $k - 1 ]->last_event();
-        warn( "connection ", $k - 1, ": event $event (",
-            ZOOM::event_str($event), ")\n" )
-          if $DEBUG;
-        last if $event == ZOOM::Event::ZEND;
-    }
-
-    if ( $k != 0 ) {
-        $k--;
-        warn $serverhost[$k] if $DEBUG;
-        my ( $error, $errmsg, $addinfo, $diagset ) =
-          $oConnection[$k]->error_x();
-        if ($error) {
-            warn "$k $serverhost[$k] error $query: $errmsg ($error) $addinfo\n"
-              if $DEBUG;
-
-        }
-        else {
-            my $numresults = $oResult[$k]->size();
-            my $i;
-            my $result = '';
-            if ( $numresults > 0 ) {
-                for (
-                    $i = 0 ;
-                    $i < ( ( $numresults < 20 ) ? ($numresults) : (20) ) ;
-                    $i++
-                  )
-                {
-                    my $rec = $oResult[$k]->record($i);
-                    if ($rec) {
-                        my $marcrecord;
-                        $marcdata   = $rec->raw();
-
-                        my ($charset_result, $charset_errors);
-                        ($marcrecord, $charset_result, $charset_errors) = 
-                          MarcToUTF8Record($marcdata, C4::Context->preference('marcflavour'), $encoding[$k]);
-####WARNING records coming from Z3950 clients are in various character sets MARC8,UTF8,UNIMARC etc
-## In HEAD i change everything to UTF-8
-# In rel2_2 i am not sure what encoding is so no character conversion is done here
-##Add necessary encoding changes to here -TG
-                        my $oldbiblio = TransformMarcToKoha( $dbh, $marcrecord, "" );
-                        $oldbiblio->{isbn}   =~ s/ |-|\.//g if $oldbiblio->{isbn};
-                        # pad | and ( with spaces to allow line breaks in the HTML
-                        $oldbiblio->{isbn} =~ s/\|/ \| /g if $oldbiblio->{isbn};
-                        $oldbiblio->{isbn} =~ s/\(/ \(/g if $oldbiblio->{isbn};
+#-------------------------------------------------------------------------------
 
-                        $oldbiblio->{issn} =~ s/ |-|\.//g if $oldbiblio->{issn};
-                        # pad | and ( with spaces to allow line breaks in the HTML
-                        $oldbiblio->{issn} =~ s/\|/ \| /g if $oldbiblio->{issn};
-                        $oldbiblio->{issn} =~ s/\(/ \(/g if $oldbiblio->{issn};
-                          my (
-                            $notmarcrecord, $alreadyindb, $alreadyinfarm,
-                            $imported,      $breedingid
-                          )
-                          = ImportBreeding( $marcdata, 2, $serverhost[$k], $encoding[$k], $random, 'z3950' );
-                        my %row_data;
-                        if ( $i % 2 ) {
-                            $toggle = 1;
-                        }
-                        else {
-                            $toggle = 0;
-                        }
-                        $row_data{toggle}       = $toggle;
-                        $row_data{server}       = $servername[$k];
-                        $row_data{isbn}         = $oldbiblio->{isbn};
-                        $row_data{lccn}         = $oldbiblio->{lccn};
-                        $row_data{title}        = $oldbiblio->{title};
-                        $row_data{author}       = $oldbiblio->{author};
-                        $row_data{breedingid}   = $breedingid;
-                        $row_data{biblionumber} = $biblionumber;
-                        push( @breeding_loop, \%row_data );
-		            
-                    } else {
-                        push(@breeding_loop,{'toggle'=>($i % 2)?1:0,'server'=>$servername[$k],'title'=>join(': ',$oConnection[$k]->error_x()),'breedingid'=>-1,'biblionumber'=>-1});
-                    } # $rec
-                }    # upto 5 results
-            }    #$numresults
-        }
-    }    # if $k !=0
-    $numberpending = $nremaining - 1;
-    $template->param(
-        breeding_loop => \@breeding_loop,
-        server        => $servername[$k],
-        numberpending => $numberpending,
-    );
-    output_html_with_http_headers $input, $cookie, $template->output if $numberpending == 0;
-
-    #  	print  $template->output  if $firstresult !=1;
-    $firstresult++;
+sub run_search {
+  my ($breedingref)= C4::Breeding::z3950_search($input);
+    #Code for Z3950 searching moved to C4 module -MR 06/27/11
+    #second return value is ignored here (not in cataloguing)
+  $template->param(
+        breeding_loop => $breedingref,
+        biblionumber  => $input->param('biblionumber') || 0,
+  );
 }
-displayresults();
-while ( --$nremaining > 0 ) {
-        displayresults();
-    }
-}    ## if op=search
+
+#-------------------------------------------------------------------------------
diff --git a/admin/z3950servers.pl b/admin/z3950servers.pl
index 44b3967..6b5e2c9 100755
--- a/admin/z3950servers.pl
+++ b/admin/z3950servers.pl
@@ -32,7 +32,7 @@ sub StringSearch  {
 	$searchstring=~ s/\'/\\\'/g;
 	my @data=split(' ',$searchstring);
 	my $count=@data;
-	my $sth=$dbh->prepare("Select host,port,db,userid,password,name,id,checked,rank,syntax,encoding from z3950servers where (name like ?) order by rank,name");
+	my $sth=$dbh->prepare("Select host,port,db,userid,password,name,id,checked,rank,syntax,encoding,srufields,add_xslt from z3950servers where (name like ?) order by rank,name");
 	$sth->execute("$data[0]\%");
 	my @results;
 	while (my $data=$sth->fetchrow_hashref) {
@@ -74,15 +74,15 @@ if ($op eq 'add_form') {
 	my $data;
 	if ($searchfield) {
 		my $dbh = C4::Context->dbh;
-		my $sth=$dbh->prepare("select host,port,db,userid,password,name,id,checked,rank,syntax,encoding from z3950servers where (name = ?) order by rank,name");
+		my $sth=$dbh->prepare("select host,port,db,userid,password,name,id,checked,rank,syntax,encoding,srufields,add_xslt from z3950servers where (name = ?) order by rank,name");
 		$sth->execute($searchfield);
 		$data=$sth->fetchrow_hashref;
 		$sth->finish;
 	}
     $template->param( $_ => $data->{$_} ) 
-        for ( qw( host port db userid password checked rank ) );
+        for ( qw( host port db userid password checked rank srufields add_xslt) );
     $template->param( $_ . $data->{$_} => 1)
-        for ( qw( syntax encoding ) );
+        for ( qw( syntax encoding) );
 													# END $OP eq ADD_FORM
 ################## ADD_VALIDATE ##################################
 # called by add_form, used to insert/modify data in DB
@@ -92,7 +92,7 @@ if ($op eq 'add_form') {
 	my $sth=$dbh->prepare("select * from z3950servers where name=?");
 	$sth->execute($input->param('searchfield'));
 	if ($sth->rows) {
-		$sth=$dbh->prepare("update z3950servers set host=?, port=?, db=?, userid=?, password=?, name=?, checked=?, rank=?,syntax=?,encoding=? where name=?");
+		$sth=$dbh->prepare("update z3950servers set host=?, port=?, db=?, userid=?, password=?, name=?, checked=?, rank=?,syntax=?,encoding=?,srufields=?,add_xslt=? where name=?");
 		$sth->execute($input->param('host'),
 		      $input->param('port'),
 		      $input->param('db'),
@@ -101,27 +101,32 @@ if ($op eq 'add_form') {
 		      $input->param('searchfield'),
 		      $input->param('checked'),
 		      $input->param('rank'),
-			  $input->param('syntax'),
-              $input->param('encoding'),
+		      $input->param('syntax'),
+		      $input->param('encoding'),
+		      $input->param('srufields'),
+		      $input->param('add_xslt'),
 		      $input->param('searchfield'),
 		      );
 	} 
 	else {
 		$sth=$dbh->prepare(
 		  "INSERT INTO z3950servers " .
-		  "(host,port,db,userid,password,name,checked,rank,syntax,encoding) " .
-		  "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" );
-        $sth->execute(
-            $input->param( 'host' ),
-            $input->param( 'port' ),
-            $input->param( 'db' ),
-            $input->param( 'userid' ),
-            $input->param( 'password' ),
-            $input->param( 'searchfield' ),
-            $input->param( 'checked' ),
-            $input->param( 'rank' ),
-            $input->param( 'syntax' ),
-            $input->param( 'encoding' ) );
+		  "(host,port,db,userid,password,name,checked,rank,syntax,encoding,srufields,add_xslt) " .
+		  "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" );
+		$sth->execute(
+		  $input->param( 'host' ),
+		  $input->param( 'port' ),
+		  $input->param( 'db' ),
+		  $input->param( 'userid' ),
+		  $input->param( 'password' ),
+		  $input->param( 'searchfield' ),
+		  $input->param( 'checked' ),
+		  $input->param( 'rank' ),
+		  $input->param( 'syntax' ),
+		  $input->param( 'encoding' ),
+		  $input->param( 'srufields'),
+		  $input->param( 'add_xslt'),
+		);
 	}
 	$sth->finish;
 													# END $OP eq ADD_VALIDATE
@@ -131,7 +136,7 @@ if ($op eq 'add_form') {
 	$template->param(delete_confirm => 1);
 	my $dbh = C4::Context->dbh;
 
-	my $sth2=$dbh->prepare("select host,port,db,userid,password,name,id,checked,rank,syntax,encoding from z3950servers where (name = ?) order by rank,name");
+	my $sth2=$dbh->prepare("select host,port,db,userid,password,name,id,checked,rank,syntax,encoding,srufields,add_xslt from z3950servers where (name = ?) order by rank,name");
 	$sth2->execute($searchfield);
 	my $data=$sth2->fetchrow_hashref;
 	$sth2->finish;
@@ -144,7 +149,10 @@ if ($op eq 'add_form') {
                          checked => $data->{'checked'},
                          rank => $data->{'rank'},
                          syntax => $data->{'syntax'},
-                         encoding => $data->{'encoding'}            );
+                         encoding => $data->{'encoding'},
+			 srufields => $data->{srufields},
+			 add_xslt => $data->{add_xslt},
+	);
 
 													# END $OP eq DELETE_CONFIRM
 ################## DELETE_CONFIRMED ##################################
@@ -174,7 +182,10 @@ if ($op eq 'add_form') {
 			checked => $results->[$i]{'checked'},
 			rank => $results->[$i]{'rank'},
 			syntax => $results->[$i]{'syntax'},
-      encoding => $results->[$i]{'encoding'});
+			encoding => $results->[$i]{'encoding'},
+			srufields => $results->[$i]{srufields},
+			add_xslt => $results->[$i]{add_xslt},
+		);
 		push @loop, \%row;
 
 	}
diff --git a/cataloguing/z3950_search.pl b/cataloguing/z3950_search.pl
index b12a9c9..256cb05 100755
--- a/cataloguing/z3950_search.pl
+++ b/cataloguing/z3950_search.pl
@@ -1,6 +1,5 @@
 #!/usr/bin/perl
 
-# This is a completely new Z3950 clients search using async ZOOM -TG 02/11/06
 # Copyright 2000-2002 Katipo Communications
 #
 # This file is part of Koha.
@@ -19,58 +18,19 @@
 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
 use strict;
-#use warnings; FIXME - Bug 2505
+use warnings;
+
 use CGI;
 
 use C4::Auth;
 use C4::Output;
-use C4::Biblio;
 use C4::Context;
 use C4::Breeding;
-use C4::Koha;
-use C4::Charset;
-use ZOOM;
-
-my $input        = new CGI;
-my $dbh          = C4::Context->dbh;
-my $error         = $input->param('error');
-my $biblionumber  = $input->param('biblionumber') || 0;
-my $frameworkcode = $input->param('frameworkcode');
-my $title         = $input->param('title');
-my $author        = $input->param('author');
-my $isbn          = $input->param('isbn');
-my $issn          = $input->param('issn');
-my $lccn          = $input->param('lccn');
-my $lccall        = $input->param('lccall');
-my $subject       = $input->param('subject');
-my $dewey         = $input->param('dewey');
-my $controlnumber	= $input->param('controlnumber');
-my $stdid			= $input->param('stdid');
-my $srchany			= $input->param('srchany');
-my $random        = $input->param('random') || rand(1000000000); # this var is not useful anymore just kept for rel2_2 compatibility
-my $op            = $input->param('op');
-my $numberpending;
-my $attr = '';
-my $term;
-my $host;
-my $server;
-my $database;
-my $port;
-my $marcdata;
-my @encoding;
-my @results;
-my $count;
-my $record;
-my $oldbiblio;
-my $errmsg;
-my @serverloop = ();
-my @serverhost;
-my @servername;
-my @breeding_loop = ();
 
-my $DEBUG = 0;    # if set to 1, many debug message are send on syslog.
+#-------------------------------------------------------------------------------
 
-my ( $template, $loggedinuser, $cookie ) = get_template_and_user({
+my $input= new CGI;
+my ($template, $loggedinuser, $cookie ) = get_template_and_user({
         template_name   => "cataloguing/z3950_search.tmpl",
         query           => $input,
         type            => "intranet",
@@ -78,222 +38,49 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user({
         flagsrequired   => { catalogue => 1 },
         debug           => 1,
 });
+$template->param( frameworkcode => $input->param('frameworkcode')||'' );
 
-$template->param( frameworkcode => $frameworkcode, );
-
-if ( $op ne "do_search" ) {
-    my $sth = $dbh->prepare("select id,host,name,checked from z3950servers  order by host");
-    $sth->execute();
-    my $serverloop = $sth->fetchall_arrayref( {} );
-    $template->param(
-        isbn         => $isbn,
-        issn         => $issn,
-        lccn         => $lccn,
-        lccall       => $lccall,
-        title        => $title,
-        author       => $author,
-        controlnumber=> $controlnumber,
-        stdid			=> $stdid,
-        srchany		=> $srchany,
-        serverloop   => $serverloop,
-        opsearch     => "search",
-        biblionumber => $biblionumber,
-    );
-    output_html_with_http_headers $input, $cookie, $template->output;
+my $op= $input->param('op')||'';
+if($op ne "do_search") {
+    show_search_form();
 }
 else {
-    my @id = $input->param('id');
-
-    if ( not defined @id ) {
-        # empty server list -> report and exit
-        $template->param( emptyserverlist => 1 );
-        output_html_with_http_headers $input, $cookie, $template->output;
-        exit;
-    }
-
-    my @oConnection;
-    my @oResult;
-    my @errconn;
-    my $s = 0;
-    my $query;
-    my $nterms;
-    if ($isbn || $issn) {
-        $term=$isbn if ($isbn);
-        $term=$issn if ($issn);
-        $query .= " \@or \@attr 1=8 \"$term\" \@attr 1=7 \"$term\" ";
-        $nterms++;
-    }
-    if ($title) {
-        utf8::decode($title);
-        $query .= " \@attr 1=4 \"$title\" ";
-        $nterms++;
-    }
-    if ($author) {
-        utf8::decode($author);
-        $query .= " \@attr 1=1003 \"$author\" ";
-        $nterms++;
-    }
-    if ($dewey) {
-        $query .= " \@attr 1=16 \"$dewey\" ";
-        $nterms++;
-    }
-    if ($subject) {
-        utf8::decode($subject);
-        $query .= " \@attr 1=21 \"$subject\" ";
-        $nterms++;
-    }
-	if ($lccn) {	
-        $query .= " \@attr 1=9 $lccn ";
-        $nterms++;
-    }
-    if ($lccall) {
-        $query .= " \@attr 1=16 \@attr 2=3 \@attr 3=1 \@attr 4=1 \@attr 5=1 \@attr 6=1 \"$lccall\" ";
-        $nterms++;
-    }
-    if ($controlnumber) {
-        $query .= " \@attr 1=12 \"$controlnumber\" ";
-        $nterms++;
-    }
-    if ($stdid) {
-        $query .= " \@attr 1=1007 \"$stdid\" ";
-        $nterms++;
-    }
-    if ($srchany) {
-        $query .= " \@attr 1=1016 \"$srchany\" ";
-        $nterms++;
-    }
-for my $i (1..$nterms-1) {
-    $query = "\@and " . $query;
+    run_search();
 }
-warn "query ".$query  if $DEBUG;
-
-    foreach my $servid (@id) {
-        my $sth = $dbh->prepare("select * from z3950servers where id=?");
-        $sth->execute($servid);
-        while ( $server = $sth->fetchrow_hashref ) {
-            warn "serverinfo ".join(':',%$server) if $DEBUG;
-            my $option1      = new ZOOM::Options();
-            $option1->option('async' => 1);
-            $option1->option('elementSetName', 'F');
-            $option1->option('databaseName', $server->{db});
-            $option1->option('user',         $server->{userid}  ) if $server->{userid};
-            $option1->option('password',     $server->{password}) if $server->{password};
-            $option1->option('preferredRecordSyntax', $server->{syntax});
-            $oConnection[$s] = create ZOOM::Connection($option1)
-              || $DEBUG
-              && warn( "" . $oConnection[$s]->errmsg() );
-            warn( "server data", $server->{name}, $server->{port} ) if $DEBUG;
-            $oConnection[$s]->connect( $server->{host}, $server->{port} )
-              || $DEBUG
-              && warn( "" . $oConnection[$s]->errmsg() );
-            $serverhost[$s] = $server->{host};
-            $servername[$s] = $server->{name};
-            $encoding[$s]   = ($server->{encoding}?$server->{encoding}:"iso-5426");
-            $s++;
-        }    ## while fetch
-    }    # foreach
-    my $nremaining  = $s;
-    my $firstresult = 1;
+output_html_with_http_headers $input, $cookie, $template->output;
 
-    for ( my $z = 0 ; $z < $s ; $z++ ) {
-        warn "doing the search" if $DEBUG;
-        $oResult[$z] = $oConnection[$z]->search_pqf($query)
-          || $DEBUG
-          && warn( "somthing went wrong: " . $oConnection[$s]->errmsg() );
+#-------------------------------------------------------------------------------
 
-        # $oResult[$z] = $oConnection[$z]->search_pqf($query);
-    }
-
-  AGAIN:
-    my $k;
-    my $event;
-    while ( ( $k = ZOOM::event( \@oConnection ) ) != 0 ) {
-        $event = $oConnection[ $k - 1 ]->last_event();
-        warn( "connection ", $k - 1, ": event $event (",
-            ZOOM::event_str($event), ")\n" )
-          if $DEBUG;
-        last if $event == ZOOM::Event::ZEND;
-    }
-
-    if ( $k != 0 ) {
-        $k--;
-        warn $serverhost[$k] if $DEBUG;
-        my ( $error, $errmsg, $addinfo, $diagset ) =
-          $oConnection[$k]->error_x();
-        if ($error) {
-            if ($error =~ m/^(10000|10007)$/ ) {
-                push(@errconn, {'server' => $serverhost[$k]});
-            }
-            $DEBUG and warn "$k $serverhost[$k] error $query: $errmsg ($error) $addinfo\n";
-        }
-        else {
-            my $numresults = $oResult[$k]->size();
-            my $i;
-            my $result = '';
-            if ( $numresults > 0 ) {
-                for ($i = 0; $i < (($numresults < 20) ? $numresults : 20); $i++) {
-                    my $rec = $oResult[$k]->record($i);
-                    if ($rec) {
-                        my $marcrecord;
-                        $marcdata   = $rec->raw();
-
-                        my ($charset_result, $charset_errors);
-                        ($marcrecord, $charset_result, $charset_errors) = 
-                          MarcToUTF8Record($marcdata, C4::Context->preference('marcflavour'), $encoding[$k]);
-####WARNING records coming from Z3950 clients are in various character sets MARC8,UTF8,UNIMARC etc
-## In HEAD i change everything to UTF-8
-# In rel2_2 i am not sure what encoding is so no character conversion is done here
-##Add necessary encoding changes to here -TG
-                        my $oldbiblio = TransformMarcToKoha( $dbh, $marcrecord, "" );
-                        $oldbiblio->{isbn}   =~ s/ |-|\.//g if $oldbiblio->{isbn};
-                        # pad | and ( with spaces to allow line breaks in the HTML
-                        $oldbiblio->{isbn} =~ s/\|/ \| /g if $oldbiblio->{isbn};
-                        $oldbiblio->{isbn} =~ s/\(/ \(/g if $oldbiblio->{isbn};
+sub show_search_form {
+  my $dbh= C4::Context->dbh;
+  my $sth= $dbh->prepare("select id,host,name,checked from z3950servers order by host");
+  $sth->execute();
+  my $serverloop = $sth->fetchall_arrayref( {} );
+  $template->param(
+        biblionumber => $input->param('biblionumber') || 0,
+        serverloop   => $serverloop,
+        opsearch     => "search",
+        title        => $input->param('title')||'',
+        isbn         => $input->param('isbn')||'',
+        lccall       => $input->param('lccall')||'',
+        controlnumber=> $input->param('controlnumber')||'',
+        srchany      => $input->param('srchany')||'',
+        author       => $input->param('author')||'',
+        subject      => $input->param('subject')||'',
+        dewey        => $input->param('dewey')||'',
+        stdid        => $input->param('stdid')||'',
+  );
+}
 
-                        $oldbiblio->{issn} =~ s/ |-|\.//g if $oldbiblio->{issn};
-                        # pad | and ( with spaces to allow line breaks in the HTML
-                        $oldbiblio->{issn} =~ s/\|/ \| /g if $oldbiblio->{issn};
-                        $oldbiblio->{issn} =~ s/\(/ \(/g if $oldbiblio->{issn};
-                          my (
-                            $notmarcrecord, $alreadyindb, $alreadyinfarm,
-                            $imported,      $breedingid
-                          )
-                          = ImportBreeding( $marcdata, 2, $serverhost[$k], $encoding[$k], $random, 'z3950' );
-                        my %row_data;
-                        $row_data{server}       = $servername[$k];
-                        $row_data{isbn}         = $oldbiblio->{isbn};
-                        $row_data{lccn}         = $oldbiblio->{lccn};
-                        $row_data{title}        = $oldbiblio->{title};
-                        $row_data{author}       = $oldbiblio->{author};
-                        $row_data{date}         = $oldbiblio->{copyrightdate};
-                        $row_data{edition}      = $oldbiblio->{editionstatement};
-                        $row_data{breedingid}   = $breedingid;
-                        $row_data{biblionumber} = $biblionumber;
-                        push( @breeding_loop, \%row_data );
-		            
-                    } else {
-                        push(@breeding_loop,{'server'=>$servername[$k],'title'=>join(': ',$oConnection[$k]->error_x()),'breedingid'=>-1,'biblionumber'=>-1});
-                    } # $rec
-                }
-            }    #$numresults
-        }
-    }    # if $k !=0
-    $numberpending = $nremaining - 1;
-    $template->param(
-        breeding_loop => \@breeding_loop,
-        server        => $servername[$k],
-        numberpending => $numberpending,
-        biblionumber  => $biblionumber,
-        errconn       => \@errconn
-    );
-    
-    output_html_with_http_headers $input, $cookie, $template->output if $numberpending == 0;
+#-------------------------------------------------------------------------------
 
-    #  	print  $template->output  if $firstresult !=1;
-    $firstresult++;
+sub run_search {
+  my ($breedingref, $error_ref)= C4::Breeding::z3950_search($input);
+  $template->param(
+        breeding_loop => $breedingref,
+        biblionumber  => $input->param('biblionumber') || 0,
+        errconn       => $error_ref,
+  );
+}
 
-  MAYBE_AGAIN:
-    if ( --$nremaining > 0 ) {
-        goto AGAIN;
-    }
-}    ## if op=search
+#-------------------------------------------------------------------------------
diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/z3950servers.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/z3950servers.tt
index e565acf..c215115 100644
--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/z3950servers.tt
+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/z3950servers.tt
@@ -226,6 +226,8 @@
 [% END %]
 </select>
 </li>
+	<li><label for="srufields">SRU Fields: </label><input type="text" size="80" name="srufields" id="srufields" value="[% srufields %]"/></li>
+	<li><label for="add_xslt">Additional XSLT: </label><input type="text" size="40" name="add_xslt" id="add_xslt" value="[% add_xslt %]"/></li>
 </ol>
         </fieldset>
 		
diff --git a/koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21toUNIMARC.xsl b/koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21toUNIMARC.xsl
new file mode 100644
index 0000000..a5d4faa
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/xslt/MARC21toUNIMARC.xsl
@@ -0,0 +1,1187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2011 BibLibre.
+This file is part of Koha.
+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
+version.
+Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+You should have received a copy of the GNU General Public License along
+with Koha; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+-->
+<xsl:stylesheet xmlns:marc="http://www.loc.gov/MARC21/slim" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+	<xsl:template match="/">
+		<collection>
+            <xsl:for-each select="marc:record">
+			<record
+				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+				xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/ standards/marcxml/schema/MARC21slim.xsd"
+				xmlns="http://www.loc.gov/MARC21/slim">
+				<xsl:variable name="leader" select="leader" />
+				<leader>
+					<!-- A calculer, mais comment ? -->
+					<xsl:variable name="len">00000</xsl:variable>
+					<xsl:variable name="stat">
+						<xsl:choose>
+							<xsl:when test="substring(leader,6,1) = 'a'">p</xsl:when>
+							<xsl:otherwise><xsl:value-of select="substring(leader,6,1)" /></xsl:otherwise>
+						</xsl:choose>
+					</xsl:variable>
+					<xsl:variable name="type">
+						<xsl:choose>
+							<xsl:when test="substring(leader,7,1) = 'o'">m</xsl:when>
+							<xsl:when test="substring(leader,7,1) = 'r'">n</xsl:when>
+							<xsl:otherwise><xsl:value-of select="substring(leader,7,1)" /></xsl:otherwise>
+						</xsl:choose>
+					</xsl:variable>
+					<xsl:variable name="biblvl">
+						<xsl:choose>
+							<xsl:when test="substring(leader,8,1) = 'b'">m</xsl:when>
+							<xsl:when test="substring(leader,8,1) = 'd'">m</xsl:when>
+							<xsl:otherwise><xsl:value-of select="substring(leader,8,1)" /></xsl:otherwise>
+						</xsl:choose>
+					</xsl:variable>
+					<!-- A calculer, mais comment ? -->
+					<xsl:variable name="baod">00000</xsl:variable>
+					<xsl:variable name="enclvl">
+						<xsl:choose>
+							<xsl:when test="substring(leader,18,1) = '8'">2</xsl:when>
+							<xsl:when test="substring(leader,17,1) = '5'">3</xsl:when>
+							<xsl:when test="substring(leader,18,1) = '7'">3</xsl:when>
+							<xsl:otherwise><xsl:value-of select="substring(leader,18,1)" /></xsl:otherwise>
+						</xsl:choose>
+					</xsl:variable>
+					<xsl:variable name="dcf">
+						<xsl:choose>
+							<xsl:when test="substring(leader,19,1) = ' '">n</xsl:when>
+							<xsl:otherwise><xsl:value-of select="' '" /></xsl:otherwise>
+						</xsl:choose>
+					</xsl:variable>
+					<xsl:value-of select="concat($len,$stat,$type,$biblvl,'  22',$baod,$enclvl,$dcf,' 45  ')" />
+				</leader>
+				<xsl:for-each select="marc:controlfield[@tag='001']">
+					<controlfield tag="001"><xsl:value-of select="text()" /></controlfield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:controlfield[@tag='005']">
+					<controlfield tag="005"><xsl:value-of select="text()" /></controlfield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:controlfield[@tag='008']">
+					<!-- FIXME: Dummy indicators -->
+					<datafield tag="100">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<subfield code="a">
+						<xsl:variable name="deof">
+							<xsl:choose>
+								<xsl:when test="substring(text(),1,2) < 70">
+									<xsl:value-of select="concat('20',substring(text(),1,6))" />
+								</xsl:when>
+								<xsl:otherwise>
+									<xsl:value-of select="concat('19',substring(text(),1,6))" />
+								</xsl:otherwise>
+							</xsl:choose>
+						</xsl:variable>
+						<xsl:variable name="topd" select="substring(text(),7,1)" />
+						<xsl:variable name="d1" select="substring(text(),8,4)" />
+						<xsl:variable name="d2" select="substring(text(),12,4)" />
+						<xsl:variable name="il">
+							<xsl:choose>
+								<xsl:when test="substring(text(),23,1) = 'a'">b||</xsl:when>
+								<xsl:when test="substring(text(),23,1) = 'b'">c||</xsl:when>
+								<xsl:when test="substring(text(),23,1) = 'j'">a||</xsl:when>
+								<xsl:when test="substring(text(),23,1) = 'c'">d||</xsl:when>
+								<xsl:when test="substring(text(),23,1) = 'd'">e||</xsl:when>
+								<xsl:when test="substring(text(),23,1) = 'e'">k||</xsl:when>
+								<xsl:when test="substring(text(),23,1) = 'g'">m||</xsl:when>
+								<xsl:when test="substring(text(),23,1) = '|'">|||</xsl:when>
+								<xsl:when test="substring(text(),23,1) = ' '">u||</xsl:when>
+								<xsl:otherwise>u||</xsl:otherwise>
+							</xsl:choose>
+						</xsl:variable>
+						<xsl:variable name="gpc">
+							<xsl:choose>
+								<xsl:when test="substring(text(),29,1) = 'f'">a</xsl:when>
+								<xsl:when test="substring(text(),29,1) = 's'">b</xsl:when>
+								<xsl:when test="substring(text(),29,1) = 'l'">d</xsl:when>
+								<xsl:when test="substring(text(),29,1) = 'c'">e</xsl:when>
+								<xsl:when test="substring(text(),29,1) = 'i'">f</xsl:when>
+								<xsl:when test="substring(text(),29,1) = 'z'">g</xsl:when>
+								<xsl:when test="substring(text(),29,1) = 'o'">h</xsl:when>
+								<xsl:when test="substring(text(),29,1) = 'u'">u</xsl:when>
+								<xsl:when test="substring(text(),29,1) = ' '">y</xsl:when>
+								<xsl:when test="substring(text(),29,1) = 'z'">z</xsl:when>
+								<xsl:when test="substring(text(),29,1) = '|'">|</xsl:when>
+								<xsl:otherwise>y</xsl:otherwise>
+							</xsl:choose>
+						</xsl:variable>
+						<xsl:variable name="mrc">
+							<xsl:choose>
+								<xsl:when test="substring(text(),39,1) = ' '">0</xsl:when>
+								<xsl:otherwise>1</xsl:otherwise>
+							</xsl:choose>
+						</xsl:variable>
+						<xsl:variable name="loc">
+							<xsl:choose>
+								<xsl:when test="datafield[@tag='040']/subfield[@code='b']"><xsl:value-of select="marc:datafield[@tag='040']/subfield[@code='b']" /></xsl:when>
+								<xsl:otherwise><xsl:value-of select="'   '" /></xsl:otherwise>
+							</xsl:choose>
+						</xsl:variable>
+						<xsl:variable name="tc">
+							<xsl:choose>
+								<xsl:when test="substring(text(),39,1) = 'o'">b</xsl:when>
+								<xsl:otherwise>y</xsl:otherwise>
+							</xsl:choose>
+						</xsl:variable>
+						<!-- Demander à nicomo pour les 2 variables suivantes -->
+						<xsl:variable name="cs"><xsl:value-of select="'    '" /></xsl:variable>
+						<xsl:variable name="acs"><xsl:value-of select="'    '" /></xsl:variable>
+						<xsl:variable name="aot" select="substring(text(),34,1)" />
+						<xsl:value-of select="concat($deof,$topd,$d1,$d2,$il,$gpc,$mrc,$loc,$tc,$cs,$acs,$aot)" />
+						</subfield>
+					</datafield>
+					<datafield tag="105">
+						<!-- Difficile de faire un bel algo pour les deux variables suivantes -->
+						<subfield code="a">
+						<xsl:variable name="ic"><xsl:value-of select="'    '" /></xsl:variable>
+						<xsl:variable name="focc"><xsl:value-of select="'    '" /></xsl:variable>
+						<xsl:variable name="cc"><xsl:value-of select="substring(text(),30,1)" /></xsl:variable>
+						<xsl:variable name="fi"><xsl:value-of select="substring(text(),31,1)" /></xsl:variable>
+						<xsl:variable name="ii"><xsl:value-of select="substring(text(),32,1)" /></xsl:variable>
+						<xsl:variable name="lc">
+							<xsl:choose>
+								<xsl:when test="substring(text(),34,1) = '1'">a</xsl:when>
+								<xsl:otherwise>|</xsl:otherwise>
+							</xsl:choose>
+						</xsl:variable>
+						<xsl:variable name="bc">
+							<xsl:choose>
+								<xsl:when test="substring(text(),35,1) = ' '">y</xsl:when>
+								<xsl:otherwise><xsl:value-of select="substring(text(),35,1)" /></xsl:otherwise>
+							</xsl:choose>
+						</xsl:variable>
+						<xsl:value-of select="concat($ic,$focc,$cc,$fi,$ii,$lc,$bc)" />
+						</subfield>
+					</datafield>
+					<datafield tag="106">
+					    <subfield code="a">
+						<xsl:choose>
+							<xsl:when test="substring(text(),24,1) = ' '">y</xsl:when>
+							<xsl:otherwise><xsl:value-of select="substring(text(),24,1)" /></xsl:otherwise>
+						</xsl:choose>
+					    </subfield>
+					</datafield>
+					<datafield tag="110">
+					    <subfield code="a">
+						<xsl:variable name="tos">
+							<xsl:choose>
+								<xsl:when test="substring(text(),22,1) = 'p'">a</xsl:when>
+								<xsl:when test="substring(text(),22,1) = 'm'">b</xsl:when>
+								<xsl:when test="substring(text(),22,1) = 'n'">c</xsl:when>
+								<xsl:when test="substring(text(),22,1) = ' '">z</xsl:when>
+								<xsl:when test="substring(text(),22,1) = '|'">|</xsl:when>
+								<xsl:otherwise>z</xsl:otherwise>
+							</xsl:choose>
+						</xsl:variable>
+						<xsl:variable name="foi">
+							<xsl:choose>
+								<xsl:when test="substring(text(),19,1) = 'd'">a</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'c'">b</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'w'">c</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'e'">d</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 's'">e</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'm'">f</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'b'">g</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'q'">h</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 't'">i</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'f'">j</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'a'">k</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'g'">l</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'h'">m</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'i'">n</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'j'">o</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'u'">u</xsl:when>
+								<xsl:when test="substring(text(),19,1) = ' '">y</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'z'">z</xsl:when>
+								<xsl:when test="substring(text(),19,1) = '|'">|</xsl:when>
+								<xsl:when test="substring(text(),19,1) = 'n'">|</xsl:when>
+								<xsl:otherwise>y</xsl:otherwise>
+							</xsl:choose>
+						</xsl:variable>
+						<xsl:variable name="r">
+							<xsl:choose>
+								<xsl:when test="substring(text(),20,1) = 'r'">a</xsl:when>
+								<xsl:when test="substring(text(),20,1) = 'n'">b</xsl:when>
+								<xsl:when test="substring(text(),20,1) = 'u'">u</xsl:when>
+								<xsl:when test="substring(text(),20,1) = 'x'">y</xsl:when>
+								<xsl:when test="substring(text(),20,1) = '|'">|</xsl:when>
+								<xsl:when test="substring(text(),20,1) = ' '">|</xsl:when>
+								<xsl:otherwise>u</xsl:otherwise>
+							</xsl:choose>
+						</xsl:variable>
+						<xsl:variable name="tomc">
+							<xsl:choose>
+								<xsl:when test="substring(text(),25,1) = 'b'">a</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'c'">b</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'i'">c</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'a'">d</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'd'">e</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'e'">f</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'r'">g</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'y'">h</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 's'">i</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'p'">j</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'o'">k</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'l'">l</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'w'">m</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'g'">n</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'v'">o</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'h'">p</xsl:when>
+								<xsl:when test="substring(text(),25,1) = 'n'">r</xsl:when>
+								<xsl:when test="substring(text(),25,1) = ' '">z</xsl:when>
+								<xsl:when test="substring(text(),25,1) = '|'">|</xsl:when>
+								<xsl:otherwise>z</xsl:otherwise>
+							</xsl:choose>
+						</xsl:variable>
+						<xsl:variable name="nocc"><xsl:value-of select="substring(text(),26,3)" /></xsl:variable>
+						<xsl:variable name="ci"><xsl:value-of select="substring(text(),30,1)" /></xsl:variable>
+						<xsl:variable name="tpa">|</xsl:variable>
+						<xsl:variable name="iac">|</xsl:variable>
+						<xsl:variable name="cia">|</xsl:variable>
+						<xsl:value-of select="concat($tos,$foi,$r,$tomc,$nocc,$ci,$tpa,$iac,$cia)" />
+					    </subfield>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='020']">
+					<datafield tag="010">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='022']">
+					<datafield tag="011">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='?']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					<!--<xsl:for-each select="marc:subfield[@code='?']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+						<xsl:for-each select="marc:subfield[@code='y']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='z']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					</datafield>
+				</xsl:for-each>
+			<!--<xsl:for-each select="marc:datafield[@tag='024']">
+					<datafield tag="012">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>-->
+				<xsl:for-each select="marc:datafield[@tag='015']">
+					<datafield tag="020">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='2']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='a']">
+							<subfield code="b"><xsl:value-of select="text()" /></subfield>
+							<subfield code="z"><xsl:value-of select="text()" /></subfield>
+						</xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='017']">
+					<datafield tag="021">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='086']">
+					<datafield tag="22">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='2']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='030']">
+					<datafield tag="040">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='028']">
+					<datafield tag="071">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2">
+							<xsl:choose>
+								<xsl:when test="@ind2 = 0">0</xsl:when>
+								<xsl:otherwise>1</xsl:otherwise>
+							</xsl:choose>
+						</xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='041']">
+					<datafield tag="101">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='e']"><subfield code="h"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='f']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="i"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='h']"><subfield code="c"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='044']">
+					<datafield tag="102">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='b']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='245']">
+					<datafield tag="200">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']">
+							<subfield code="a"><xsl:value-of select="text()" /></subfield>
+							<xsl:if test="contains(text(),' = ')">
+								<subfield code="d"><xsl:value-of select="concat('=',substring-after(text(),' =' ))" /></subfield>
+							</xsl:if>
+						</xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']">
+							<xsl:choose>
+								<xsl:when test="contains(text(),' / ')">
+									<subfield code="f"><xsl:value-of select="substring-before(text(),' / ')" /></subfield>
+									<subfield code="g"><xsl:value-of select="substring-after(text(),' / ')" /></subfield>
+								</xsl:when>
+								<xsl:otherwise>
+									<subfield code="f"><xsl:value-of select="text()" /></subfield>
+								</xsl:otherwise>
+							</xsl:choose>
+						</xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="h"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='p']"><subfield code="i"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+					<!-- FIXME -->
+					<!--
+					<datafield tag="204">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='h']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+					-->
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='250']">
+					<datafield tag="205">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='254']">
+					<datafield tag="208">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='260']">
+					<datafield tag="210">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="c"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='e']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='f']"><subfield code="g"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="h"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='263']">
+					<datafield tag="211">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='300']">
+					<datafield tag="215">
+						<xsl:choose>
+							<xsl:when test="@ind = 1"><xsl:attribute name="ind1">0</xsl:attribute></xsl:when>
+							<xsl:otherwise><xsl:attribute name="ind1">1</xsl:attribute></xsl:otherwise>
+						</xsl:choose>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="c"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='e']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='490']">
+					<datafield tag="225">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='v']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='256']">
+					<datafield tag="230">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='500']">
+					<datafield tag="300">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='525']">
+					<datafield tag="300">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='555']">
+					<datafield tag="300">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='504']">
+					<datafield tag="320">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='505']">
+					<datafield tag="327">
+					    <!-- FIXME: Dummy indicators -->
+						<!--<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>-->
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<!--<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>-->
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<subfield code="a">bla</subfield>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='502']">
+					<datafield tag="328">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='520']">
+					<datafield tag="330">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='524']">
+					<datafield tag="332">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='521']">
+					<datafield tag="333">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='500']">
+					<datafield tag="336">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='538']">
+					<datafield tag="337">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='037']">
+					<datafield tag="345">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='f']"><subfield code="c"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='760']">
+					<datafield tag="410">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='762']">
+					<datafield tag="411">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='770']">
+					<datafield tag="421">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='772']">
+					<datafield tag="422">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='777']">
+					<datafield tag="423">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='780']">
+					<datafield tag="430">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='785']">
+					<datafield tag="440">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='775']">
+					<datafield tag="451">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='776']">
+					<datafield tag="452">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='767']">
+					<datafield tag="453">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='765']">
+					<datafield tag="454">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='787']">
+					<datafield>
+						<xsl:choose>
+							<xsl:when test="contains(subfield[@code='i'],'Reproduction of:')"><xsl:attribute name="tag" select="455" /></xsl:when>
+							<xsl:when test="contains(subfield[@code='i'],'Reproduced as:')"><xsl:attribute name="tag" select="456" /></xsl:when>
+							<xsl:when test="contains(subfield[@code='i'],'Item reviewed:')"><xsl:attribute name="tag" select="470" /></xsl:when>
+							<xsl:otherwise>
+								<xsl:attribute name="tag" select="488" />
+							</xsl:otherwise>
+						</xsl:choose>
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='774']">
+					<datafield>
+						<xsl:choose>
+							<xsl:when test="subfield[@code='i']">
+								<xsl:attribute name="tag" select="462" />
+							</xsl:when>
+							<xsl:otherwise>
+								<xsl:attribute name="tag" select="461" />
+							</xsl:otherwise>
+						</xsl:choose>
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='773']">
+					<datafield tag="463">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='774']">
+					<datafield tag="464">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='w']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='730']">
+					<datafield tag="500">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="n"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='f']"><subfield code="k"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="n"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='k']"><subfield code="j"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='l']"><subfield code="m"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='m']"><subfield code="r"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="h"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='o']"><subfield code="w"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='p']"><subfield code="i"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='r']"><subfield code="u"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='s']"><subfield code="q"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='243']">
+					<datafield tag="501">
+						<xsl:attribute name="ind1">1</xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='k']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='f']"><subfield code="k"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='l']"><subfield code="m"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='247']">
+					<datafield tag="520">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="h"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='p']"><subfield code="i"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="n"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='f']"><subfield code="j"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='222']">
+					<datafield tag="530">
+						<xsl:attribute name="ind1">0</xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='210']">
+					<datafield tag="531">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='246']">
+					<datafield tag="532">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2">0</xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='242']">
+					<datafield tag="541">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="h"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='p']"><subfield code="i"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='y']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='773']">
+					<datafield tag="545">
+						<xsl:attribute name="ind1">
+							<xsl:choose>
+								<xsl:when test="@ind1 = 0">1</xsl:when>
+								<xsl:otherwise>0</xsl:otherwise>
+							</xsl:choose>
+						</xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='610']">
+					<datafield tag="601">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']">
+							<subfield code="a"><xsl:value-of select="text()" /></subfield>
+							<subfield code="c"><xsl:value-of select="substring-before(substring-after(text(),'('),')')" /></subfield>
+						</xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="f"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='e']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='f']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					<!--<xsl:for-each select="marc:subfield[@code='g']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+						<xsl:for-each select="marc:subfield[@code='k']"><subfield code="j"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='l']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					<!--<xsl:for-each select="marc:subfield[@code='m']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='o']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					<!--<xsl:for-each select="marc:subfield[@code='p']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					<!--<xsl:for-each select="marc:subfield[@code='r']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					<!--<xsl:for-each select="marc:subfield[@code='s']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					<!--<xsl:for-each select="marc:subfield[@code='t']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					<!--<xsl:for-each select="marc:subfield[@code='u']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='y']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='?']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='611']">
+					<datafield tag="601">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']">
+							<subfield code="a"><xsl:value-of select="text()" /></subfield>
+							<subfield code="c"><xsl:value-of select="substring-before(substring-after(text(),'('),')')" /></subfield>
+						</xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="f"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='e']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='f']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					<!--<xsl:for-each select="marc:subfield[@code='g']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+						<xsl:for-each select="marc:subfield[@code='k']"><subfield code="j"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='l']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='p']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					<!--<xsl:for-each select="marc:subfield[@code='s']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='u']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='y']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='?']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='630']">
+					<datafield tag="605">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='d']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+						<xsl:for-each select="marc:subfield[@code='f']"><subfield code="k"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="n"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='k']"><subfield code="j"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='l']"><subfield code="m"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='m']"><subfield code="r"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="h"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='o']"><subfield code="w"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='p']"><subfield code="i"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='r']"><subfield code="u"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='s']"><subfield code="q"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='t']"><subfield code="?"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='y']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='?']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='600']">
+					<datafield tag="600">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2">
+							<xsl:choose>
+								<xsl:when test="@ind1 = 0">0</xsl:when>
+								<xsl:otherwise>1</xsl:otherwise>
+							</xsl:choose>
+						</xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']">
+							<subfield code="a"><xsl:value-of select="substring-before(text(),', ')" /></subfield>
+							<subfield code="b"><xsl:value-of select="substring-after(text(),', ')" /></subfield>
+						</xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="c"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="f"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='y']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='2']"><subfield code="2"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+					<datafield tag="602">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='t']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='y']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='2']"><subfield code="2"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='630']">
+					<datafield tag="605">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="h"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='p']"><subfield code="i"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='f']"><subfield code="k"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='k']"><subfield code="l"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='l']"><subfield code="m"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='g']"><subfield code="n"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='s']"><subfield code="q"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='r']"><subfield code="r"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="s"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='o']"><subfield code="t"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='r']"><subfield code="u"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='y']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='2']"><subfield code="2"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='650']">
+					<datafield tag="606">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='y']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='2']"><subfield code="2"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='651']">
+					<datafield tag="607">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']">
+							<subfield code="a"><xsl:value-of select="substring-before(text(),', ')" /></subfield>
+							<subfield code="b"><xsl:value-of select="substring-after(text(),', ')" /></subfield>
+						</xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='x']"><subfield code="x"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='z']"><subfield code="y"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='y']"><subfield code="z"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='2']"><subfield code="2"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='653']">
+					<datafield tag="610">
+						<xsl:attribute name="ind1">
+							<xsl:choose>
+								<xsl:when test="@ind1 = ' '">0</xsl:when>
+								<xsl:otherwise><xsl:value-of select="@ind1" /></xsl:otherwise>
+							</xsl:choose>
+						</xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='752']">
+					<datafield tag="620">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield"><subfield code="@code"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='753']">
+					<datafield tag="626">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield"><subfield code="@code"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='043']">
+					<datafield tag="660">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield"><subfield code="@code"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='045']">
+					<datafield tag="661">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='886']">
+					<datafield tag="670">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="c"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='2']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='080']">
+					<datafield tag="675">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='082']">
+					<datafield tag="676">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='2']"><subfield code="v"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='050']">
+					<datafield tag="680">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='084']">
+					<datafield tag="686">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='2']"><subfield code="2"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='100']">
+					<datafield tag="700">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']">
+							<subfield code="a"><xsl:value-of select="substring-before(text(),', ')" /></subfield>
+							<subfield code="b"><xsl:value-of select="substring-after(text(),', ')" /></subfield>
+						</xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="c"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="f"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='e']"><subfield code="4"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='q']"><subfield code="g"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='u']"><subfield code="p"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='?']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+						<xsl:for-each select="marc:subfield[@code='4']"><subfield code="4"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='700']">
+					<datafield tag="701">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']">
+							<subfield code="a"><xsl:value-of select="substring-before(text(),', ')" /></subfield>
+							<subfield code="b"><xsl:value-of select="substring-after(text(),', ')" /></subfield>
+						</xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="c"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="f"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='e']"><subfield code="4"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='q']"><subfield code="g"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='u']"><subfield code="p"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					<!--<xsl:for-each select="marc:subfield[@code='?']"><subfield code="3"><xsl:value-of select="text()" /></subfield></xsl:for-each>-->
+						<xsl:for-each select="marc:subfield[@code='4']"><subfield code="4"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='110']">
+					<datafield tag="710">
+						<xsl:attribute name="ind1">0</xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="f"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='u']"><subfield code="p"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='4']"><subfield code="4"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='111']">
+					<datafield tag="710">
+						<xsl:attribute name="ind1">1</xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='e']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="f"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='u']"><subfield code="p"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='4']"><subfield code="4"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='710']">
+					<datafield tag="711">
+						<xsl:attribute name="ind1">0</xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='b']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="f"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='u']"><subfield code="p"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='4']"><subfield code="4"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='711']">
+					<datafield tag="711">
+						<xsl:attribute name="ind1">1</xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='e']"><subfield code="b"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='n']"><subfield code="d"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='c']"><subfield code="e"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="f"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='u']"><subfield code="p"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='4']"><subfield code="4"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='100']">
+					<datafield tag="720">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="f"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='4']"><subfield code="4"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='700']">
+					<datafield tag="721">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='d']"><subfield code="f"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+						<xsl:for-each select="marc:subfield[@code='4']"><subfield code="4"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:controlfield[@tag='008']">
+					<datafield tag="802">
+						<xsl:attribute name="ind1"><xsl:value-of select="' '" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="' '" /></xsl:attribute>
+						<subfield code="a">
+							<xsl:choose>
+								<xsl:when test="substring(text(),21,1) = '0'">00</xsl:when>
+								<xsl:when test="substring(text(),21,1) = '1'">01</xsl:when>
+								<xsl:when test="substring(text(),21,1) = '4'">04</xsl:when>
+								<xsl:when test="substring(text(),21,1) = '#'">uu</xsl:when>
+								<xsl:when test="substring(text(),21,1) = 'z'">zz</xsl:when>
+								<xsl:otherwise>zz</xsl:otherwise>
+							</xsl:choose>
+						</subfield>
+					</datafield>
+				</xsl:for-each>
+				<xsl:for-each select="marc:datafield[@tag='590']">
+					<datafield tag="900">
+						<xsl:attribute name="ind1"><xsl:value-of select="@ind1" /></xsl:attribute>
+						<xsl:attribute name="ind2"><xsl:value-of select="@ind2" /></xsl:attribute>
+						<xsl:for-each select="marc:subfield[@code='a']"><subfield code="a"><xsl:value-of select="text()" /></subfield></xsl:for-each>
+					</datafield>
+				</xsl:for-each>
+			</record>
+		</xsl:for-each>
+		</collection>
+	</xsl:template>
+</xsl:stylesheet>
diff --git a/koha-tmpl/intranet-tmpl/prog/en/xslt/UNIMARCtoMARC21.xsl b/koha-tmpl/intranet-tmpl/prog/en/xslt/UNIMARCtoMARC21.xsl
new file mode 100644
index 0000000..8fcd420
--- /dev/null
+++ b/koha-tmpl/intranet-tmpl/prog/en/xslt/UNIMARCtoMARC21.xsl
@@ -0,0 +1,523 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright 2011 Rijksmuseum.
+This file is part of Koha.
+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
+version.
+Koha is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
+You should have received a copy of the GNU General Public License along
+with Koha; if not, write to the Free Software Foundation, Inc.,
+51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+-->
+<!--
+NOTE: This stylesheet converts UNIMARC to MARC21.
+IMPORTANT: Please note that MARC21 and UNIMARC are different in restrictions
+for tags and subfields to be repeatable. In this stylesheet this difference
+implies the careful use of if and value-of on one side and for-each and copy-of
+on the other side!!
+FIXME: Currently, it only converts the most important MARC fields. Add more!
+-->
+<xsl:stylesheet xmlns:marc="http://www.loc.gov/MARC21/slim" version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
+  <xsl:template match="/">
+    <collection>
+    <xsl:apply-templates/>
+    </collection>
+  </xsl:template>
+
+  <xsl:template match="marc:record">
+   <record>
+    <xsl:call-template name="leader"/>
+    <xsl:call-template name="copy_control">
+      <xsl:with-param name="tagno">001</xsl:with-param>
+    </xsl:call-template>
+    <xsl:call-template name="control005"/>
+    <xsl:call-template name="control008"/>
+
+    <xsl:call-template name="isbn_issn"/>
+    <xsl:call-template name="author"/>
+    <xsl:call-template name="author_corp"/>
+    <xsl:call-template name="title"/>
+    <xsl:call-template name="edition"/>
+    <xsl:call-template name="publication"/>
+    <xsl:call-template name="physicaldesc"/>
+    <xsl:call-template name="note_general"/>
+    <xsl:call-template name="subject_person"/>
+    <xsl:call-template name="subject_topic"/>
+    <xsl:call-template name="subject_geo"/>
+    <xsl:call-template name="subject_uncontrolled"/>
+    <xsl:call-template name="pers_name"/>
+    <xsl:call-template name="corp_name"/>
+   </record>
+  </xsl:template>
+
+  <!-- Named templates -->
+
+  <xsl:template name="leader">
+    <xsl:variable name="leader" select="marc:leader"/>
+    <leader>
+    <xsl:text>00000na</xsl:text>
+    <xsl:choose>
+      <xsl:when test="contains('cms',substring($leader,8,1))">
+        <xsl:value-of select="substring($leader,8,1)"/>
+      </xsl:when>
+      <xsl:otherwise><xsl:text>m</xsl:text></xsl:otherwise>
+    </xsl:choose>
+    <xsl:text> a2200000u</xsl:text>
+    <xsl:choose>
+      <xsl:when test="contains('i ',substring($leader,19,1))">
+        <xsl:text>i</xsl:text>
+      </xsl:when>
+      <xsl:when test="substring($leader,19,1)='n'">
+        <xsl:text> </xsl:text>
+      </xsl:when>
+      <xsl:otherwise><xsl:text> </xsl:text></xsl:otherwise>
+    </xsl:choose>
+    <xsl:text> 4500</xsl:text>
+    </leader>
+  </xsl:template>
+
+  <xsl:template name="control005">
+    <xsl:choose>
+      <xsl:when test="marc:controlfield[@tag='005']">
+        <xsl:copy-of select="marc:controlfield[@tag='005']"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:if test="marc:datafield[@tag='801']/marc:subfield[@code='c']">
+        <controlfield tag="005">
+          <xsl:value-of select="marc:datafield[@tag='801']/marc:subfield[@code='c']"/>
+        </controlfield>
+        </xsl:if>
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template name="control008">
+    <!-- FIXME:  Some conversions here are simplified:
+	Processing of pubdate type
+	Material dependent pos 18-34
+    -->
+    <controlfield tag="008">
+      <xsl:value-of select="substring(marc:datafield[@tag='100']/marc:subfield[@code='a'],3,6)"/>
+      <xsl:choose>
+        <xsl:when test="substring(marc:leader,8,1)='s'">
+        </xsl:when>
+        <xsl:otherwise>
+          <xsl:text>s</xsl:text>
+          <xsl:value-of select="substring(marc:datafield[@tag='100']/marc:subfield[@code='a'],10,4)"/>
+          <xsl:text>    </xsl:text>
+        </xsl:otherwise>
+	  <xsl:value-of select="translate(substring(marc:datafield[@tag='100']/marc:subfield[@code='a'],9,1),'abc','cdu')"/>
+          <xsl:value-of select="substring(marc:datafield[@tag='100']/marc:subfield[@code='a'],10,8)"/>
+      </xsl:choose>
+      <!-- pos 15-17 place publication; 102a is two char code -->
+      <xsl:choose>
+      <xsl:when test="marc:datafield[@tag='102']/marc:subfield[@code='a']">
+        <xsl:value-of select="substring(concat(marc:datafield[@tag='102']/marc:subfield[@code='a'],'   '),1,3)"/>
+      </xsl:when>
+      <xsl:otherwise>
+        <xsl:text>xx </xsl:text>
+      </xsl:otherwise>
+      </xsl:choose>
+      <!-- FIXME: pos 18-34 depending on material type -->
+      <xsl:text>|||||||||||||||||</xsl:text>
+      <!-- pos 35-37 language -->
+      <xsl:value-of select="substring(concat(marc:datafield[@tag='101']/marc:subfield[@code='a'],'   '),1,3)"/>
+      <!-- pos 38,39 modified, cataloging source -->
+      <xsl:text> d</xsl:text>
+    </controlfield>
+  </xsl:template>
+
+  <xsl:template name="isbn_issn">
+    <xsl:if test="marc:datafield[@tag='010']">
+      <datafield tag="020" ind1=" " ind2=" ">
+        <subfield code="a">
+	  <xsl:value-of select="marc:datafield[@tag='010']/marc:subfield[@code='a']"/>
+	</subfield>
+        <xsl:if test="marc:datafield[@tag='010']/marc:subfield[@code='b']">
+          <subfield code="b">
+	  <xsl:value-of select="marc:datafield[@tag='010']/marc:subfield[@code='b']"/>
+	  </subfield>
+	</xsl:if>
+        <xsl:if test="marc:datafield[@tag='010']/marc:subfield[@code='d']">
+          <subfield code="c">
+	  <xsl:value-of select="marc:datafield[@tag='010']/marc:subfield[@code='d']"/>
+	  </subfield>
+	</xsl:if>
+        <xsl:copy-of select="marc:datafield[@tag='010']/marc:subfield[@code='z']"/>
+      </datafield>
+    </xsl:if>
+    <xsl:if test="marc:datafield[@tag='011']">
+      <datafield tag="022" ind1=" " ind2=" ">
+        <subfield code="a">
+	  <xsl:value-of select="marc:datafield[@tag='011']/marc:subfield[@code='a']"/>
+	</subfield>
+        <xsl:copy-of select="marc:datafield[@tag='011']/marc:subfield[@code='z']"/>
+      </datafield>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template name="author">
+    <xsl:if test="marc:datafield[@tag='700']">
+    <datafield tag="100">
+      <!-- 100c only is R -->
+      <xsl:call-template name="copy_indicators"><xsl:with-param name="tagno">700</xsl:with-param></xsl:call-template>
+      <subfield code="a">
+	<xsl:value-of select="marc:datafield[@tag='700']/marc:subfield[@code='a']"/>
+	<xsl:if test="marc:datafield[@tag='700']/marc:subfield[@code='b']">
+	  <xsl:text>, </xsl:text>
+	  <xsl:value-of select="marc:datafield[@tag='700']/marc:subfield[@code='b']"/>
+	</xsl:if>
+      </subfield>
+      <xsl:if test="marc:datafield[@tag='700']/marc:subfield[@code='d']">
+          <subfield code='b'>
+          <xsl:value-of select="marc:datafield[@tag='700']/marc:subfield[@code='d']"/>
+          </subfield>
+      </xsl:if>
+      <xsl:copy-of select="marc:datafield[@tag='700']/marc:subfield[@code='c']"/>
+      <xsl:if test="marc:datafield[@tag='700']/marc:subfield[@code='f']">
+          <subfield code='d'>
+          <xsl:value-of select="marc:datafield[@tag='700']/marc:subfield[@code='f']"/>
+          </subfield>
+      </xsl:if>
+      <xsl:if test="marc:datafield[@tag='700']/marc:subfield[@code='g']">
+          <subfield code='q'>
+          <xsl:value-of select="marc:datafield[@tag='700']/marc:subfield[@code='g']"/>
+          </subfield>
+      </xsl:if>
+    </datafield>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template name="author_corp">
+    <xsl:if test="marc:datafield[@tag='710']">
+      <datafield>
+      <xsl:variable name="type" select="marc:datafield[@tag='710']/@ind1"/>
+      <xsl:choose>
+	<xsl:when test="$type=1">
+	  <xsl:attribute name="tag">111</xsl:attribute>
+	</xsl:when>
+	<xsl:otherwise>
+	  <xsl:attribute name="tag">110</xsl:attribute>
+	</xsl:otherwise>
+      </xsl:choose>
+      <xsl:attribute name="ind1">
+        <xsl:value-of select="marc:datafield[@tag='710']/@ind2"/>
+      </xsl:attribute>
+      <xsl:attribute name="ind2"><xsl:text> </xsl:text></xsl:attribute>
+
+      <subfield code="a">
+	<xsl:value-of select="marc:datafield[@tag='710']/marc:subfield[@code='a']"/>
+	<xsl:for-each select="marc:datafield[@tag='710']/marc:subfield[@code='c']">
+	  <xsl:text>, </xsl:text>
+	  <xsl:value-of select="."/>
+	</xsl:for-each>
+      </subfield>
+      <xsl:copy-of select="marc:datafield[@tag='710']/marc:subfield[@code='b']"/>
+      <xsl:if test="marc:datafield[@tag='710']/marc:subfield[@code='e']">
+          <subfield code='c'>
+          <xsl:value-of select="marc:datafield[@tag='710']/marc:subfield[@code='e']"/>
+          </subfield>
+      </xsl:if>
+      <xsl:if test="marc:datafield[@tag='710']/marc:subfield[@code='f']">
+          <subfield code='d'>
+          <xsl:value-of select="marc:datafield[@tag='710']/marc:subfield[@code='f']"/>
+          </subfield>
+      </xsl:if>
+      <xsl:if test="marc:datafield[@tag='710']/marc:subfield[@code='d']">
+          <subfield code='n'>
+          <xsl:value-of select="marc:datafield[@tag='710']/marc:subfield[@code='d']"/>
+          </subfield>
+      </xsl:if>
+      <xsl:if test="marc:datafield[@tag='710']/marc:subfield[@code='p']">
+          <subfield code='u'>
+          <xsl:value-of select="marc:datafield[@tag='710']/marc:subfield[@code='p']"/>
+          </subfield>
+      </xsl:if>
+      <xsl:copy-of select="marc:datafield[@tag='710']/marc:subfield[@code='4']"/>
+      </datafield>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template name="title">
+    <datafield tag="245">
+      <!-- 245abc are NR, 245np are R -->
+      <xsl:call-template name="copy_indicators"><xsl:with-param name="tagno">200</xsl:with-param></xsl:call-template>
+      <subfield code="a">
+	<xsl:value-of select="marc:datafield[@tag='200']/marc:subfield[@code='a']"/>
+      </subfield>
+
+      <xsl:variable name="tagd" select="marc:datafield[@tag='200']/marc:subfield[@code='d']"/>
+      <xsl:variable name="tage" select="marc:datafield[@tag='200']/marc:subfield[@code='e']"/>
+      <xsl:if test="$tagd!='' or $tage!=''">
+        <subfield code="b">
+	<xsl:value-of select="$tagd"/>
+	<xsl:for-each select="marc:datafield[@tag='200']/marc:subfield[@code='e']">
+	  <xsl:text> : </xsl:text>
+	  <xsl:value-of select="."/>
+	</xsl:for-each>
+        </subfield>
+      </xsl:if>
+
+      <xsl:variable name="tagf" select="marc:datafield[@tag='200']/marc:subfield[@code='f']"/>
+      <xsl:variable name="tagg" select="marc:datafield[@tag='200']/marc:subfield[@code='g']"/>
+      <xsl:if test="$tagf!='' or $tagg!=''">
+        <subfield code="c">
+	<xsl:value-of select="$tagf"/>
+	<xsl:for-each select="marc:datafield[@tag='200']/marc:subfield[@code='g']">
+	  <xsl:text> ; </xsl:text>
+	  <xsl:value-of select="."/>
+	</xsl:for-each>
+        </subfield>
+      </xsl:if>
+
+      <xsl:for-each select="marc:datafield[@tag='200']/marc:subfield[@code='h']">
+        <subfield code="n"><xsl:value-of select="."/></subfield>
+      </xsl:for-each>
+      <xsl:for-each select="marc:datafield[@tag='200']/marc:subfield[@code='i']">
+        <subfield code="p"><xsl:value-of select="."/></subfield>
+      </xsl:for-each>
+    </datafield>
+  </xsl:template>
+
+  <xsl:template name="edition">
+    <xsl:if test="marc:datafield[@tag='205']">
+      <datafield tag="250" ind1=" " ind2=" ">
+        <!-- 250 a is NR -->
+        <xsl:copy-of select="marc:datafield[@tag='205'][1]/marc:subfield[@code='a'][1]"/>
+        <xsl:if test="marc:datafield[@tag='205']/marc:subfield[@code='f']">
+          <subfield code='b'>
+          <xsl:value-of select="marc:datafield[@tag='205']/marc:subfield[@code='f']"/>
+          </subfield>
+        </xsl:if>
+      </datafield>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template name="publication">
+    <xsl:if test="marc:datafield[@tag='210']">
+      <datafield tag="260" ind1=" " ind2=" ">
+	<!-- 260 abc are repeatable: use for loops -->
+        <xsl:copy-of select="marc:datafield[@tag='210']/marc:subfield[@code='a']"/>
+        <xsl:for-each select="marc:datafield[@tag='210']/marc:subfield[@code='c']">
+          <subfield code='b'>
+          <xsl:value-of select="."/>
+          </subfield>
+        </xsl:for-each>
+        <xsl:for-each select="marc:datafield[@tag='210']/marc:subfield[@code='d']">
+          <subfield code='c'>
+          <xsl:value-of select="."/>
+          </subfield>
+        </xsl:for-each>
+
+        <!-- 260 efg are not-repeatable: take the first element only -->
+        <xsl:copy-of select="marc:datafield[@tag='210']/marc:subfield[@code='e'][1]"/>
+        <xsl:if test="marc:datafield[@tag='210']/marc:subfield[@code='g']">
+          <subfield code='f'>
+          <xsl:value-of select="marc:datafield[@tag='210']/marc:subfield[@code='g']"/>
+          </subfield>
+        </xsl:if>
+        <xsl:if test="marc:datafield[@tag='210']/marc:subfield[@code='h']">
+          <subfield code='g'>
+          <xsl:value-of select="marc:datafield[@tag='210']/marc:subfield[@code='h']"/>
+          </subfield>
+        </xsl:if>
+      </datafield>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template name="physicaldesc">
+    <xsl:for-each select="marc:datafield[@tag='215']">
+      <!-- 300ac are R, 300be are NR -->
+      <datafield tag="300" ind1=" " ind2=" ">
+        <xsl:copy-of select="marc:subfield[@code='a']"/>
+        <xsl:if test="marc:subfield[@code='c']">
+          <subfield code='b'>
+          <xsl:value-of select="marc:subfield[@code='c']"/>
+          </subfield>
+        </xsl:if>
+        <xsl:for-each select="marc:subfield[@code='d']">
+          <subfield code='c'>
+          <xsl:value-of select="."/>
+          </subfield>
+        </xsl:for-each>
+        <xsl:copy-of select="marc:subfield[@code='e'][1]"/>
+      </datafield>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template name="note_general">
+    <xsl:for-each select="marc:datafield[@tag='300']">
+      <!-- 500a is R -->
+      <datafield tag="500" ind1=" " ind2=" ">
+        <xsl:copy-of select="marc:subfield[@code='a']"/>
+      </datafield>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template name="subject_person">
+    <xsl:for-each select="marc:datafield[@tag='600']">
+      <!-- only MARC21 600c is R -->
+      <datafield tag="600">
+      <xsl:attribute name="ind1"><xsl:value-of select="@ind1"/></xsl:attribute>
+      <xsl:attribute name="ind2"><xsl:value-of select="@ind2"/></xsl:attribute>
+        <xsl:copy-of select="marc:subfield[@code='a'][1]"/>
+        <xsl:if test="marc:subfield[@code='d']">
+          <subfield code='b'>
+          <xsl:value-of select="marc:subfield[@code='d']"/>
+          </subfield>
+        </xsl:if>
+        <xsl:copy-of select="marc:subfield[@code='c']"/>
+        <xsl:if test="marc:subfield[@code='f']">
+          <subfield code='d'>
+          <xsl:value-of select="marc:subfield[@code='f']"/>
+          </subfield>
+        </xsl:if>
+        <xsl:if test="marc:subfield[@code='b']">
+          <subfield code='q'>
+          <xsl:value-of select="marc:subfield[@code='b']"/>
+          </subfield>
+        </xsl:if>
+      </datafield>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template name="subject_topic">
+    <xsl:for-each select="marc:datafield[@tag='606']">
+      <!-- 650a is NR -->
+      <datafield tag="650" ind1=" " ind2="4">
+        <xsl:copy-of select="marc:subfield[@code='a'][1]"/>
+      </datafield>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template name="subject_geo">
+    <xsl:for-each select="marc:datafield[@tag='607']">
+      <!-- 651a is NR -->
+      <datafield tag="651" ind1=" " ind2="4">
+        <xsl:copy-of select="marc:subfield[@code='a'][1]"/>
+      </datafield>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template name="subject_uncontrolled">
+    <xsl:for-each select="marc:datafield[@tag='610']">
+      <!-- 653a is R -->
+      <datafield tag="653">
+        <xsl:attribute name="ind1"><xsl:value-of select="@ind1"/></xsl:attribute>
+        <xsl:attribute name="ind2"><xsl:value-of select="@ind2"/></xsl:attribute>
+        <xsl:copy-of select="marc:subfield[@code='a']"/>
+      </datafield>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template name="pers_name">
+    <xsl:for-each select="marc:datafield[@tag='701' or @tag='702']">
+    <datafield tag="700">
+      <!-- 700c only is R -->
+        <xsl:attribute name="ind1"><xsl:value-of select="@ind1"/></xsl:attribute>
+        <xsl:attribute name="ind2"><xsl:value-of select="@ind2"/></xsl:attribute>
+      <subfield code="a">
+	<xsl:value-of select="marc:subfield[@code='a']"/>
+	<xsl:if test="marc:subfield[@code='b']">
+	  <xsl:text>, </xsl:text>
+	  <xsl:value-of select="marc:subfield[@code='b']"/>
+	</xsl:if>
+      </subfield>
+      <xsl:if test="marc:subfield[@code='d']">
+          <subfield code='b'>
+          <xsl:value-of select="marc:subfield[@code='d']"/>
+          </subfield>
+      </xsl:if>
+      <xsl:copy-of select="marc:subfield[@code='c']"/>
+      <xsl:if test="marc:subfield[@code='f']">
+          <subfield code='d'>
+          <xsl:value-of select="marc:subfield[@code='f']"/>
+          </subfield>
+      </xsl:if>
+      <xsl:if test="marc:subfield[@code='g']">
+          <subfield code='q'>
+          <xsl:value-of select="marc:subfield[@code='g']"/>
+          </subfield>
+      </xsl:if>
+    </datafield>
+    </xsl:for-each>
+  </xsl:template>
+
+  <xsl:template name="corp_name">
+    <xsl:for-each select="marc:datafield[@tag='711' or @tag='712']">
+      <datafield>
+      <xsl:variable name="type" select="@ind1"/>
+      <xsl:choose>
+	<xsl:when test="$type=1">
+	  <xsl:attribute name="tag">711</xsl:attribute>
+	</xsl:when>
+	<xsl:otherwise>
+	  <xsl:attribute name="tag">710</xsl:attribute>
+	</xsl:otherwise>
+      </xsl:choose>
+      <xsl:attribute name="ind1">
+        <xsl:value-of select="@ind2"/>
+      </xsl:attribute>
+      <xsl:attribute name="ind2"><xsl:text> </xsl:text></xsl:attribute>
+
+      <subfield code="a">
+	<xsl:value-of select="marc:subfield[@code='a']"/>
+	<xsl:for-each select="marc:subfield[@code='c']">
+	  <xsl:text>, </xsl:text>
+	  <xsl:value-of select="."/>
+	</xsl:for-each>
+      </subfield>
+      <xsl:copy-of select="marc:subfield[@code='b']"/>
+      <xsl:if test="marc:subfield[@code='e']">
+          <subfield code='c'>
+          <xsl:value-of select="marc:subfield[@code='e']"/>
+          </subfield>
+      </xsl:if>
+      <xsl:if test="marc:subfield[@code='f']">
+          <subfield code='d'>
+          <xsl:value-of select="marc:subfield[@code='f']"/>
+          </subfield>
+      </xsl:if>
+      <xsl:if test="marc:subfield[@code='d']">
+          <subfield code='n'>
+          <xsl:value-of select="marc:subfield[@code='d']"/>
+          </subfield>
+      </xsl:if>
+      <xsl:if test="marc:subfield[@code='p']">
+          <subfield code='u'>
+          <xsl:value-of select="marc:subfield[@code='p']"/>
+          </subfield>
+      </xsl:if>
+      <xsl:copy-of select="marc:subfield[@code='4']"/>
+      </datafield>
+    </xsl:for-each>
+  </xsl:template>
+
+  <!-- And some utility functions -->
+
+  <xsl:template name="copy_control">
+    <xsl:param name="tagno"/>
+    <xsl:if test="marc:controlfield[@tag=$tagno]">
+      <controlfield>
+       <xsl:attribute name="tag"><xsl:value-of select="$tagno"/></xsl:attribute>
+       <xsl:value-of select="marc:controlfield[@tag=$tagno]" />
+      </controlfield>
+    </xsl:if>
+  </xsl:template>
+
+  <xsl:template name="copy_indicators">
+    <xsl:param name="tagno"/>
+        <xsl:attribute name="ind1">
+          <xsl:value-of select="marc:datafield[@tag=$tagno]/@ind1"/>
+        </xsl:attribute>
+        <xsl:attribute name="ind2">
+          <xsl:value-of select="marc:datafield[@tag=$tagno]/@ind2"/>
+        </xsl:attribute>
+  </xsl:template>
+
+</xsl:stylesheet>
-- 
1.7.5.4


More information about the Patches mailing list