my $dstore;
my $sfmap;
-my @modlist = qw( multi ignoremulti bib required first concatenate );
+my @modlist = qw( multi ignoremulti bib required first concatenate parallel );
my %allmods = ();
my $multis = {};
+my $parallel_fields = {};
my $reccount;
my $verbose = 0;
$verbose = 1 if $args{verbose};
- my $self = bless { multis => \$multis,
+ my $self = bless {
+ multis => \$multis,
+ parallel_fields => \$parallel_fields,
}, $class;
# initialize map and taglist
my $fieldname = $sfmap->field($mappedtag, $mappedsub);
my $mods = $sfmap->mods($fieldname);
next if $mods->{multi};
- $crec->{tags}[-1]{uni}{$mappedsub} = '';
+ if ($mods->{parallel}) {
+ push @{ $crec->{tags}[-1]{parallel}{$mappedsub} }, '';
+ $crec->{tags}[-1]{uni} = undef;
+ } else {
+ $crec->{tags}[-1]{uni}{$mappedsub} = '';
+ $crec->{tags}[-1]{parallel} = undef;
+ }
$crec->{tags}[-1]{multi} = undef;
$crec->{tags}[-1]{tag} = $mappedtag;
}
return;
}
if ($sfmap->has($tag)) {
- push @{$crec->{tags}}, { tag => $tag, uni => undef, multi => undef };
+ push @{$crec->{tags}}, { tag => $tag, uni => undef, multi => undef, parallel => undef };
push @{$crec->{tmap}{$tag}}, (@{$crec->{tags}} - 1);
my @subs = $field->children('subfield');
for my $sub (@subs)
my $fieldname = $sfmap->field($tag, $mappedsub);
my $mods = $sfmap->mods($fieldname);
next if $mods->{multi};
- $crec->{tags}[-1]{uni}{$mappedsub} = ''
- unless defined $crec->{tags}[-1]{uni}{$mappedsub};
+ if ($mods->{parallel}) {
+ push @{ $crec->{tags}[-1]{parallel}{$mappedsub} }, ''
+ unless defined $crec->{tags}[-1]{parallel}{$mappedsub};
+ } else {
+ $crec->{tags}[-1]{uni}{$mappedsub} = ''
+ unless defined $crec->{tags}[-1]{uni}{$mappedsub};
+ }
}
}
}
return if ($sub->text =~ /$filter/i);
}
+ if ($mods->{parallel}) {
+ $parallel_fields->{$tag}{$code} = 1;
+ push @{$dataf->{parallel}{$code}}, $sub->text;
+ return;
+ }
+
# handle multi modifier
if ($mods->{multi}) {
$multis->{$tag}{$code} = 1;
return $multis;
}
+=head2 get_parallel_fields
+
+Returns hashref of C<{tag}{code}> for all mapped parallel fields
+
+=cut
+
+sub get_parallel_fields {
+ my ($self) = @_;
+ return $parallel_fields;
+}
+
=head1 MODIFIERS
MapDrivenMARCXMLProc implements the following modifiers, and passes
{ open my $fh, ">", ($c->{prefix} . "-HOLDINGS-MULT-$t$s.pg"); $MULTIFILE{"$t$s"} = $fh }
}
+ my $parallel_fields = $m->get_parallel_fields;
+
my $i = 0; # record counter
my $j = 0; # holdings counter
push @out, '';
next;
}
+
+ # handle parallel fields
+ if (exists($parallel_fields->{$othertag})) {
+ my $num_fields = $#{ $rec->{tmap}{$othertag} };
+ my $tag_idx;
+ if ($holdidx > $num_fields) {
+ $tag_idx = -1;
+ } else {
+ $tag_idx = $rec->{tmap}{$othertag}[$holdidx];
+ }
+ for my $sub ( sort keys %{ $parallel_fields->{$othertag } } ) {
+ push @out, $tag_idx > -1 ? $rec->{tags}[$tag_idx]{parallel}{$sub}->[0] : '';
+ print HOLDINGS "l_", $m->name($rec->{tags}[$tag_idx]{tag}, $sub), ", " unless $j;
+ }
+ }
+
# handle only first other tag unless it is known to be multi
my $limit = 0;
if (exists($multis->{$othertag})) {