Bonjour,
Je travaille sur des ressources lexicales codées en XML. L'objectif est de transformer ces ressources en un même balisage XML (pour les fusionner ensuite).
Pour cela, j'ai un programme pour chaque ressource (ils fonctionnent tous). Mais je me suis demandé s'il n'était pas possible de programmer une sorte de "Transformation universelle" puisque le résultat doit être le même.
J'ai donc pensé établir une table de hachage au début de mon programme. Les clefs sont les balises que l'on aura en sortie, les valeurs les balises de la source.
Cependant, le résultat est quelque peu problématique, d'où ce sujet.
-- PROLOGUE : --
FAQ sur les hash tables
Introduction à la programmation en Perl de S. Lhullier
Divers sujets déjà créés, dont celui-ci (problème valeurs/clefs)
Pas de solution trouvée.
-- SOURCE (extrait d'une des sources à traiter) : source_test.xml --
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!-- ?xml:stylesheet type="text/css" href="fravie.css"? --> <!-- DOCTYPE dictionary SYSTEM "fravie.dtd" --> <volume name="ThuyDict_fra" source-language="fra" target-language="vie" creation-date="18/01/2002"> <entry id=""><headword>a</headword> <syntactic-sense><pos>xxx</pos> <translation lang="vie">xxx</translation> <example><fra>a majuscule (A)</fra><vie>xxx</vie></example> <example><fra>a minuscule (a)</fra><vie>xxx</vie></example> </syntactic-sense> <syntactic-sense><pos>xxx</pos> <translation lang="vie">xxx</translation> <translation lang="vie">xxx</translation> <translation lang="vie">xxx</translation> <translation lang="vie">xxx</translation> </syntactic-sense> <syntactic-sense><pos>xxx</pos> <translation lang="vie">xxx</translation> </syntactic-sense> </entry> <entry id=""><headword>abaca</headword> <syntactic-sense><pos>xxx</pos> <translation lang="vie">xxx</translation> </syntactic-sense> </entry> </volume>
les 'xxx' sont en réalité des termes en vietnamiens (mais l'affichage pose problème sur le forum).
-- CODE (j'ai supprimé le superflu - gestion des arguments de la commande - et simplifié au maximum pour plus de clarté) : TRANSFO.pl --
J'ai choisi pour l'exemple de ne travailler que sur <headword>, je suppose que si une solution est trouvée pour cette élément, je pourrais l'appliquer au reste. J'utilise les pointeurs xpath, la seul possibilité pour une transformation commune aux sources selon moi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95 #!/usr/bin/perl # ###------### # use strict; use warnings; use locale; use utf8; use XML::Twig; use XML::Twig::Xpath; # ###------### # [1] Table de hachage # my %balises = ( "entry" => "entry", "head" => "", "headword" => "headword", "pronunciation" => "", "pos" => "syntactic-sense", "sense" => "", "definition" => "", "label" => "", "formula" => "", "gloss" => "", "translations" => "", "translation" => "translation", "examples" => "", "example" => "example/vie", "idioms" => "", "idiom" => "", "else" => "example/fra", ); # # [2] Autres variables : # my ($FichierXML, # le fichier source $FichierResultat, # le fichier en sortie $FiRe, # descripteur pour le fichier en sortie $erreur, # message d'erreur $encoding, # format d'encodage par défaut $twig, # variable pour le parsing $CountEntry, # comptage des entrées $TwigEntry, # le twig pour la balise <entry> $date) = 0; # la date # ##------## # $erreur = "|ERROR| : problem opening the file :"; $encoding = "UTF-8"; $date = localtime; $CountEntry = 0; # ##------## # Input $FichierXML = 'source_test.xml'; # Output $FichierResultat = 'out_test.xml'; open ($FiRe, ">:encoding($encoding)",$FichierResultat) or die ("$erreur $!\n"); # # print {$FiRe} "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n", "<m:volume name=\"VD_Mam\" creation-date=\"$date\">\n"; # ###------### # # $twig = new XML::Twig (Twig_handlers => {'entry' => \&entry,},); $twig -> parsefile($FichierXML); # print {$FiRe} "</m:volume>"; close($FiRe); # ###------### # sub entry { ($twig, $TwigEntry) = @_; $CountEntry++; # my $path_headword = $TwigEntry->get_xpath($balises{'headword'}); print {$FiRe} "<m:entry", ' ', 'id="fra.', $path_headword,'">'; print {$FiRe} "<m:head>"; print {$FiRe} "<m:headword>", $path_headword, "</m:headword>"; print {$FiRe} "<m:pronunciation></m:pronunciation>"; print {$FiRe} "<m:pos>", "</m:pos>"; print {$FiRe} "</m:head>"; print {$FiRe} "</m:entry>", "\n"; # $twig->purge; return; } ##------## 1 ;
-- RÉSULTAT (de l'extrait indiqué) out_test.xml --
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <m:volume name="VD_Mam" creation-date="Sat May 29 12:07:57 2010"> <m:entry id="fra.1"><m:head><m:headword>1</m:headword><m:pronunciation></m:pronunciation><m:pos></m:pos></m:head></m:entry> <m:entry id="fra.1"><m:head><m:headword>1</m:headword><m:pronunciation></m:pronunciation><m:pos></m:pos></m:head></m:entry> </m:volume>
Ainsi donc au lieu d'afficher le PCDATA de l'élément <headword>, je me retrouve avec un 1 (sûrement pour me dire TRUE non ?!). J'en suis arrivé là.
-- CONCLUSION --
Si vous avez connu ce genre de problème, ou encore si vous avez un avis sur le programme en général, merci de me répondre !
Bon weekend à tous (même si vous ne me répondez pas )
Partager