open(FILE,"$ARGV[0]");
my @lignes=;
close(FILE);
while (my $ligne=shift(@lignes)) {
chomp $ligne;
my $sequence="";
my $longueur=0;
if ( $ligne =~ /NOM<\/data>[^<]+<\/data>([^<]+)<\/data><\/element>/) {
my $forme=$1;
$sequence.=$forme;
$longueur=1;
my $nextligne=$lignes[1]; #saut de ligne dans nos scripts
if ( $nextligne =~ /ADJ<\/data>[^<]+<\/data>([^<]+)<\/data><\/element>/) {
my $forme=$1;
$sequence.=" ".$forme;
$longueur=2;
}
}
if ($longueur == 2) {
print $sequence,"\n";
}
}
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<body bgcolor="#FF5500">
<table align="center" width="50%" bgcolor="173653" bordercolor="#bad0d1" border="1">
<tr bgcolor="#FF8A9A">
<td>
<font color="#c86755" align="center">
<h1>
Extraction de patron
<font color="#f0b156">
<b>NOM</b>
</font>
<font color="#bad0d1">
<b>ADJ</b>
</font>
</h1>
</font>
</td>
</tr>
<tr>
<td>
<blockquote>
<xsl:apply-templates select="//article"/>
</blockquote>
</td>
</tr>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="element">
<xsl:choose>
<xsl:when test="(./data[contains(text(),'NOM')]) and (following-sibling::element[1][./data[contains(text(),'NOM')]])">
<font color="#f0b156">
<xsl:value-of select="./data[3]"/>
</font>
<xsl:text></xsl:text>
</xsl:when>
<xsl:when test="(./data[contains(text(),'ADJ')]) and (preceding-sibling::element[1][./data[contains(text(),'ADJ')]])">
<font color="#bad0d1">
<xsl:value-of select="./data[3]"/>
</font>
<br/>
</xsl:when>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
A.2] Voici un aperçue de la sortie au format HTML une fois que la feuille de style est appliquée à un fichier XML:
HTML
#!/usr/bin/perl
#-------------------------------------------------
# PROGRAMME PRINCIPAL
#-------------------------------------------------
my @LISTETOKEN=();
my @LISTELEMME=();
my @LISTEETIQUETTE=();
#--------------------------------------------------
# lecture du fichier PATRON
open(PATRON,"$ARGV[1]");
my @LISTEPATRON=<PATRON>; # lecture globale du fichier dans une liste
close(PATRON);
#--------------------------------------------------
# le fichier cordial est le premier argument du programme
open(CORDIAL,"$ARGV[0]"); # visiblement pas de pb d'encodage...
while (my $ligne=<CORDIAL>) {
$ligne=~s/\r//;
chomp($ligne);
if ($ligne=~/^([^\t]+)\t([^\t]+)\t([^\t]+)$/) {
my ($token,$lemme,$etiquette)=($1,$2,$3);
if ($etiquette!~/PCTF/) {
push(@LISTETOKEN,$token);
push(@LISTELEMME,$lemme);
push(@LISTEETIQUETTE,$etiquette);
}
else {
&compare(\@LISTETOKEN,\@LISTEETIQUETTE);
# creation d'un reference vers une liste
@LISTETOKEN=();
@LISTEETIQUETTE=();
@LISTELEMME=();
}
}
}
# -----------------------------------------------------
# SOUS - PROGRAMMES
#------------------------------------------------------
sub compare {
# TRAITEMENT...
my ($first,$second)=@_;
my @LISTETOKEN=@$first;
my @LISTEETIQUETTE=@$second;
foreach my $patron (@LISTEPATRON) {
$patron=~s/\r//;
chomp $patron;
#print "$patron\n";
my $texte_des_pos=join(" ",@LISTEETIQUETTE);
while ($texte_des_pos=~/$patron/g) {
my $contextebefore=$`;
my $compteurblanc=0;
while ($contextebefore=~/ /g) {
$compteurblanc++;
}
my @MONPATRONENCOURS=split(/ /, $patron);
my $longueurpatron=$#MONPATRONENCOURS;
my $bornesup = $compteurblanc + $longueurpatron;
print "@LISTETOKEN[$compteurblanc..$bornesup] \n";
}
}
}
B.2] Voici un aperçu de ce que produit ce script:
système de qualifications
élimination progressive
système de qualifications
Prix d' ouverture
est en ouest
manière curieuse
Danse sur glace
titre mondial
programme libre
titre mondial
patinage artistique
nageur français
pilote espagnol
discrimination salariale
fédération pour discrimination
monde américaines
équipe nationale
justice civile
paires de chaussures
star argentine
vague d' indignation
vie désastreuses
ouvriers immigrés
conditions de vie