--- /dev/null
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+use XML::Twig;
+use YAML;
+use JSON;
+
+my $marcxml = shift;
+
+open HOLDINGS, '>', "holdings";
+open X, '>', "holdings.x";
+open Z, '>', "holdings.z";
+open ALL852, '>', "holdings.all852";
+
+my $holdings = {};
+my $copyid = 0;
+my %all852 = ( x => {}, z => {} ); # hash of all subfields in all 852s
+
+my $t = XML::Twig->new( twig_handlers => { record => \&record } );
+$t->parsefile($marcxml);
+#print ALL852 to_json(\%all852);
+print ALL852 Dump(%all852);
+
+sub record {
+ my($t, $r)= @_;
+ $holdings = { copies => [] };
+
+ my @dfields = $r->children('datafield');
+ for my $d (@dfields) {
+ process_datafields($d)
+ }
+
+ for my $copy (@{$holdings->{copies}})
+ { print_reports($copy) }
+ $r->purge;
+}
+
+sub process_datafields {
+ my ($d) = @_;
+ # get 903
+ if ($d->{'att'}->{'tag'} == 903) {
+ my $s = $d->first_child('subfield');
+ $holdings->{id} = $s->text;;
+ }
+
+ # and holdings data
+ if ($d->{'att'}->{'tag'} == 852) {
+ push @{$holdings->{copies}}, { x =>[], z => [] };
+ $holdings->{copies}[-1]{copyid} = $copyid;
+ my @subs = $d->children('subfield');
+ for my $s (@subs)
+ { process_subs($s) }
+ $copyid++;
+ }
+}
+
+sub process_subs {
+ my ($s) = @_;
+ my $copy = $holdings->{copies}[-1];
+
+ my $code = $s->{'att'}->{'code'};
+ my $value = $s->text;
+
+ if ($code eq 'x' or $code eq 'z') {
+ push @{$copy->{$code}}, $value;
+ my ($k,$v) = split /:/, $value;
+ $all852{$code}{$k} = $v;
+ } else {
+ $copy->{$code} = $value;
+ $all852{$code} = $value;
+ }
+}
+
+sub print_reports {
+ my ($copy) = @_;
+ my $note = 0;
+ for (@{$copy->{x}}) {
+ print X join("\t", $holdings->{id}, $copy->{copyid}, $note, $_), "\n";
+ $note++;
+ }
+ $note = 0;
+ for (@{$copy->{z}}) {
+ print Z join("\t", $holdings->{id}, $copy->{copyid}, $note, $_), "\n";
+ $note++;
+ }
+ print HOLDINGS join("\t", $holdings->{id}, $copy->{copyid},
+ $copy->{b}, $copy->{p}, $copy->{h}, $copy->{9}), "\n";
+}