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