#!/usr/bin/perl use utf8; use XML::LibXML; use XML::LibXML::XPathContext; use Data::Dumper; use Switch; my $filename="bibliografia-mods.xml"; my $parser=XML::LibXML->new(); my $ugov = $parser->parse_file($filename); $ugov or die "Issues with $filename"; my $xpc = XML::LibXML::XPathContext->new($ugov); $xpc->registerNs( mods=>'http://www.loc.gov/mods/v3'); # $xpc->registerNs( # xsi=>'http://www.w3.org/2001/XMLSchema-instance'); sub genTag{ my $tagname=$_[0]; my (%hashbase) = %{$_[1]}; my $actual=$hashbase{$tagname}; $actual or return ""; my $return=""; switch($tagname) { case /DOI/ { $return .="DOI: ".$actual."" } case /dateyear/ { $return .="($actual)" } case /volume/ { $return .="$actual:" } {$return .= $actual; } } $return .=""; return $return; } sub formatAuthors{ my @auth=@{$_[0]}; my $result; my $num=$#auth; for ($i=0;$i<$num;$i++) { $result.=$auth[$i].", "; } $result.=$auth[$num]; return $result; } %QueryTable=( "journal"=>'./mods:relatedItem[@type="host"]/mods:titleInfo/mods:title', "issn"=>'./mods:relatedItem[@type="host"]//mods:identifier[@type="issn"]', "title"=>'./mods:titleInfo/mods:title', "dateyear"=>'./mods:originInfo/mods:dateIssued', "DOI"=>'./mods:identifier[@type="doi"]', "firstpage"=>'./mods:part/mods:extent[@unit="page"]/mods:start', "lastpage"=>'./mods:part/mods:extent[@unit="page"]/mods:end', "volume"=>'./mods:part/mods:detail[@type="volume"]/mods:number' ); @AllNodes=$xpc->findnodes("//mods:mods"); foreach my $ThisMods (@AllNodes) { my %ThisPaper={}; foreach my $InTable (keys %QueryTable) { $ThisPaper{$InTable}= ( $xpc->findvalue($QueryTable{$InTable},$ThisMods) or "" ); } my @allauth; foreach my $author ($xpc->findnodes( './mods:name[@type="personal" and mods:role/mods:roleTerm="author"]', $ThisMods)) { my $given=$xpc->find('./mods:namePart[@type="given"]',$author); my $family=$xpc->find('./mods:namePart[@type="family"]',$author); #Normalize names if ($family =~ /^[A-Z](\.)?$/) { my $temp=$given; $given=$family; $family=$temp; } if ($given =~ /^[A-Z]$/) { $given .= "."; } my $nameaut="$given $family"; $nameaut=~s/(\w+)/\u\L$1/g; push(@allauth, $nameaut) } if($ThisPaper{'firstpage'}=~/[0..9]/) { $ThisPaper{'pagerange'}="$ThisPaper{'firstpage'}-$ThisPaper{'lastpage'}"; } $authors=formatAuthors(\@allauth); print "