+=for sql
+-- ExtractValue(marcxml,'//datafield[@tag="100"]/subfield[@code="9"]') as first_author,
+-- ExtractValue(marcxml,'//datafield[@tag="700"]/subfield[@code="9"]') as other_authors,
+-- ExtractValue(marcxml,'//datafield[@tag="942"]/subfield[@code="t"]') as category,
+
+-- and SUBSTR(ExtractValue(marcxml,'//controlfield[@tag="008"]'),8,4) between 2008 and 2013
+-- order by SUBSTR(ExtractValue(marcxml,'//controlfield[@tag="008"]'),8,4) desc
+=cut
+
+my $biblio_year;
+my $type_stats;
+
+my $parser = XML::LibXML->new();
+$parser->recover_silently(0); # don't die when you find &, >, etc
+my $style_doc = $parser->parse_file($xslfilename);
+my $xslt = XML::LibXSLT->new();
+my $parsed = $xslt->parse_stylesheet($style_doc);
+
+my $biblio_html;
+
+open(my $xml_fh, '>', '/tmp/bibliografija.xml') if $ENV{XML};
+
+sub biblioitem_html {
+ my $biblionumber = shift;
+
+ return $biblio_html->{$biblionumber} if exists $biblio_html->{$biblionumber};
+
+ my $xmlrecord = $marcxml->{$biblionumber} || die "missing $biblionumber marcxml";
+
+ print $xml_fh $xmlrecord if $ENV{XML};
+
+ my $source = eval { $parser->parse_string($xmlrecord) };
+ if ( $@ ) {
+# warn "SKIP $biblionumber corrupt XML";
+ push @{ $skip->{XML_corrupt} }, $biblionumber;
+ return;
+ }
+
+ my $transformed = $parsed->transform($source);
+ $biblio_html->{$biblionumber} = $parsed->output_string( $transformed );
+
+ return ( $biblio_html->{$biblionumber}, $source ) if wantarray;
+ return $biblio_html->{$biblionumber};
+}
+