#!/usr/bin/perl
use strict;
use XML::LibXML;
use List::Util qw{ uniq };
my $dom = 'XML::LibXML'->load_xml(IO => *DATA);
my @headers = ();
my @lang = ();
for ($dom->findnodes('//tu/prop/@type')){
push @headers, 'tu:'.$_->value;
}
for my $tuv ($dom->findnodes('//tu/tuv')){
my $lang = $tuv->findvalue('@xml:lang');
push @lang, $lang;
for ($tuv->findnodes('prop/@type')){
push @headers, 'tuv:'.$_->value.':'.$lang;
}
}
@headers = sort +uniq(@headers);
@lang = sort +uniq(@lang);
push @headers,@lang; # add lang
open OUT,'>','report.dat' or die "$!";
print OUT join "\t",@headers,"\n";
for my $tu ($dom->findnodes('/tmx/body/tu')) {
my %props;
for my $prop ($tu->findnodes('prop')) {
$props{ 'tu:'.$prop->findvalue('@type') } = $prop->textContent;
}
for my $tuv ($tu->findnodes('tuv')) {
my $lang = $tuv->findvalue('@xml:lang');
($props{$lang} = $tuv->findvalue('seg')) =~ s{\n}{
}g;
for my $prop ($tuv->findnodes('prop')) {
my $name = join ':','tuv',$prop->findvalue('@type'),$lang;
$props{$name} = $prop->textContent;
}
}
print OUT join ("\t", map $_ // "", @props{@headers}), "\t";
print OUT "\n";
}
__DATA__
a
b
c
d
no
no
Hello
world!
Bonjour
monde
1
yes
no
no
zyx
Hello world!
2
yes 2
no 2
no 2
Bonjour monde