Valid XHTML    Valid CSS2    

Listing du fichier m1xml_6_tp2.php

 

00001     <?php
00002     
# # (gH) -_- m1xml_6_tp2.php ; TimeStamp (unix) : 18 Octobre 2017 vers 13:10
00003     
include("std.php") ;
00004     include(
"m1xml_6_inc.php") ;
00005     
00006     
$HTML
= s_span("HTML" ,"grouge") ;
00007     
$XHTML
= s_span("XHTML","grouge") ;
00008     
$XML
= s_span("XML" ,"grouge") ;
00009     
$XSL
= s_span("XSL" ,"grouge") ;
00010     
$XPATH
= s_span("XPATH","grouge") ;
00011     
$DTD
= s_span("DTD" ,"grouge") ;
00012     
$XSD
= s_span("XSD" ,"grouge") ;
00013     
$CSS
= s_span("CSS" ,"grouge") ;
00014     
$CSV
= s_span("CSV" ,"grouge") ;
00015     
$Excel
= s_span("Excel" ,"grouge") ;
00016     
$JavaScript
= s_span("JavaScript" ,"grouge") ;
00017     
$R
= s_span("R" ,"grouge") ;
00018     
$PHP
= s_span("PHP" ,"grouge") ;
00019     
00020     
$numSerie
= 2 ;
00021     
00022     if (!isset(
$_GET
["standalone"])) { debutPage("XML en M1 (2018), TP $numSerie","strict","","m1xml.js") ; } ;
00023     
00024     
debutSection() ;
00025     
h1
("$XML en M1 (2018), universit&eacute; d'Angers ") ;
00026     
h2
(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00027     
pvide() ;
00028     
h2
("T.P. num&eacute;ro $numSerie","gbleu") ;
00029     
pvide() ;
00030     
00031     
###########################################################################################
00032     
00033     
$tableauDesRubriques = array() ;
00034     
$idr
= 0 ;
00035     
$idr
++; $tableauDesRubriques[$idr] = "Compter des &eacute;l&eacute;ments ou des attributs dans un document $XML" ;
00036     
$idr
++; $tableauDesRubriques[$idr] = "Expressions $XPATH " ;
00037     
$idr
++; $tableauDesRubriques[$idr] = "Comprendre la transformation vide" ;
00038     
$idr
++; $tableauDesRubriques[$idr] = "Réaliser une transformation minimale avec $XSL" ;
00039     
$idr
++; $tableauDesRubriques[$idr] = "Une transformation $XSL &eacute;l&eacute;mentaire" ;
00040     
$idr
++; $tableauDesRubriques[$idr] = "Une deuxi&egrave;me transformation $XSL" ;
00041     
$idr
++; $tableauDesRubriques[$idr] = "Transformations $XSL avanc&eacute;es et statistiques" ;
00042     
$tdmCRLM
= new tdm($tableauDesRubriques) ;
00043     
$tdmCRLM
->titre() ;
00044     
$tdmCRLM
->menu("oui","oui","nou") ;
00045     
00046     
pvide() ;
00047     
00048     
$numExo
= 0 ;
00049     
$numSerie
= 2 ;
00050     
direAfficherSolutions
($numSerie) ;
00051     
00052     
## -------------------------------------------------------------------------------------------
00053     
00054     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # "Compter des &eacute;l&eacute;ments ou des attributs dans un document XML
00055     
00056     ## -------------------------------------------------------------------------------------------
00057     
00058     
blockquote() ;
00059     
00060     
p
("texte") ;
00061     echo
" On s'int&eacute;resse au fichier "
.href("leadb880.xml")." suivant qui contient des donn&eacute;es pour des prot&eacute;ines " ;
00062     echo
href
("../../Leadb","LEA","grouge")."&nbsp;:" ;
00063     
finp() ;
00064     
00065     
p() ;
00066     
textarea_fichier
("leadb880","tajaunec",25,80,"leadb","leadb880.xml","") ;
00067     
finp() ;
00068     
00069     
p
("texte") ;
00070     echo
"Apr&egrave;s avoir d&eacute;crit la structure du fichier, " ;
00071     echo
" donner une grammaire
$DTD ".em("minimale et raisonnable")." pour modéliser le contenu du fichier, " ;
00072     echo
" puis compter le nombre de lignes, le nombre de lignes vides, d'&eacute;lements et d'attributs. " ;
00073     echo
" Vous pouvez utiliser tout outil logiciel qui vous parait adapt&eacute;. Comment trouver le nombre d'&eacute;léments distincts&nbsp;?" ;
00074     
finp() ;
00075     
00076     
solution
($numExo,$numSerie) ;
00077     
00078     
p
("texte") ;
00079     echo
"Visiblement l'élément racine du fichier se nomme "
.b("proteins")." et il ne contient que " ;
00080     echo
" des éléments nommés "
.b("protein").". Chaque élément ".b("protein")." contient trois éléments, à savoir " ;
00081     echo
b
("accession").", ".b("class")." et ".b("fasta").". De plus seul cet élément ".b("fasta")." possède un attribut nommé ".b("length").". " ;
00082     
finp();
00083     
00084     
p
("texte") ;
00085     echo
" Une grammaire "
.em("raisonnable")." pour ces donn&eacute;es est fournie par le fichier suivant nomm&eacute; ".href("leadb_dtd.txt","leadb.dtd")."." ;
00086     
finp();
00087     
00088     
p() ;
00089     echo
b
("Grammaire leadb.dtd&nbsp;:") ;
00090     
finp() ;
00091     
00092     
pre_fichier
("leadb_dtd.txt","cadrebleu") ;
00093     
00094     
p
("texte") ;
00095     echo
" Avec la commande "
.b("xmlstarlet&nbsp;el&nbsp;-u")." on dispose de la structure des donn&eacute;es en termes d'&eacute;l&eacute;ments&nbsp;:" ;
00096     
finp();
00097     
00098     
pre_fichier
("leadb_stru.txt","cadrebleu") ;
00099     
00100     
p
("texte") ;
00101     echo
"Il ne manque donc que la ligne "
.ghBleu("proteins/protein/fasta/@length")." pour compl&eacute;ter cette description des &eacute;l&eacute;ments et attributs." ;
00102     
finp();
00103     
00104     
p
("texte") ;
00105     echo
"On peut facilement obtenir le nombre de lignes avec la commande syst&egrave;me nomm&eacute;e "
.b("wc").". " ;
00106     echo
" Pour le nombre de lignes vides, chainer "
.b("grep")." et ".b("wc")." est sans doute un bon choix. " ;
00107     echo
" Pour le nombre d'&eacute;lements distincts et la structure, "
.b("xmlstarlet")." et ".b("trang")." sont des outils biens adapt&eacute;s. " ;
00108     echo
" Enfin, pour le nombre d'&eacute;l&eacute;ments en tout, on peut chainer "
.b("xmlstarlet")." et ".b("wc")." alors que " ;
00109     echo
" pour le nombre d'attributs en tout, il faut chainer "
.b("xmlstarlet").", ".b("grep")." et ".b("wc").". " ;
00110     echo
" Voici le d&eacute;tail des commandes associ&eacute;es&nbsp;:" ;
00111     
finp() ;
00112     
00113     
pre_fichier
("leadb880_sh.txt","cadrejaune") ;
00114     
00115     
finsolution() ;
00116     
00117     
finblockquote() ;
00118     
00119     
## -------------------------------------------------------------------------------------------
00120     
00121     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Expressions XPATH
00122     
00123     ## -------------------------------------------------------------------------------------------
00124     
00125     
blockquote() ;
00126     
00127     
p
("texte") ;
00128     echo
" On s'int&eacute;resse ici au document "
.href("films2.xml")." qui contient des films et des artistes. " ;
00129     
finp() ;
00130     
00131     
blockquote() ;
00132     
p() ;
00133     
textarea_fichier
("films2","tajaunec",25,80,"films","films2.xml","") ;
00134     
finp() ;
00135     
finblockquote() ;
00136     
00137     
p
("texte") ;
00138     echo
"En voici la grammaire
$DTD&nbsp;:" ;
00139     
finp() ;
00140     
00141     
pre_fichier
("films2.dtd","cadrebleu") ;
00142     
00143     
p
("texte") ;
00144     echo
"On fournit aussi la structure explicite du fichier (&eacute;l&eacute;ments seulement) obtenue &agrave; l'aide de la commande "
.b("xmlstarlet el -u films2.xml")."&nbsp;:" ;
00145     
finp() ;
00146     
00147     
pre_fichier
("films2_stru.txt","cadrejaune") ;
00148     
00149     
p
("texte") ;
00150     echo
" Trouver comment on peut produire la liste des attributs uniques du fichier, ce que ne sait pas faire "
.b("xmlstarlet").". " ;
00151     echo
" Voici ce qu'on s'attend à voir&nbsp;:" ;
00152     
finp() ;
00153     
00154     
pre_fichier
("films2_att.txt","cadrejaune") ;
00155     
00156     
p
("texte") ;
00157     echo
"A l'aide de "
.b("xmllint")." en mode ".em("&laquo;shell&raquo;").", essayer ensuite de r&eacute;pondre aux questions suivantes&nbsp;:" ;
00158     
finp() ;
00159     
00160     
ul() ;
00161     
00162     
# grep TITRE films2.xml | head -n 9 | tail -n 1 ; 95:<TITRE>Gladiator</TITRE>
00163     
00164     
debutli
() ; p("texte") ;
00165      echo
"Quels sont tous les titres de films&nbsp;?" ;
00166     
finp
() ; finli() ;
00167     
00168     
debutli
() ; p("texte") ;
00169      echo
"Quel est le titre du neuvi&egrave;me film&nbsp;?" ;
00170     
finp
() ; finli() ;
00171     
00172     
debutli
() ; p("texte") ;
00173      echo
"En quelle ann&eacute;e est sorti le film "
.em("Blade Runner")."&nbsp;?" ;
00174     
finp
() ; finli() ;
00175     
00176     
debutli
() ; p("texte") ;
00177      echo
"Quel en est le metteur en sc&egrave;ne&nbsp;?" ;
00178     
finp
() ; finli() ;
00179     
00180     
debutli
() ; p("texte") ;
00181      echo
"Combien y a-t-il de films&nbsp;?" ;
00182     
finp
() ; finli() ;
00183     
00184     
debutli
() ; p("texte") ;
00185      echo
"Quels éléments contiennent le texte \"Bruce\"&nbsp;?" ;
00186     
finp
() ; finli() ;
00187     
00188     
finul() ;
00189     
00190     
p
("texte") ;
00191     echo
"Essayer enfin à l'aide de "
.b("$PHP")." via le module ".em("SimpleXML")." d'afficher tous les titres de films avec leur numéro, comme ci-dessous&nbsp;:" ;
00192     
finp() ;
00193     
00194     
pre_fichier
("titresEnPhp.txt","cadrejaune") ;
00195     
00196     
solution
($numExo,$numSerie) ;
00197     
00198     
p
("texte") ;
00199     echo
"Les lignes suivantes compl&eacute;tent la description des &eacute;l&eacute;ments uniques " ;
00200     echo
" en chainant "
.b("xmlstarlet").", ".b("grep")." et ".b("sort")."&nbsp;:" ;
00201     
finp();
00202     
00203     
p
("texte") ;
00204     
nbsp
(5) ;
00205     echo
ghRouge
(' xmlstarlet el -a films2.xml | grep "/@" | sort -u ')."." ;
00206     
finp();
00207     
00208     
p
("texte") ;
00209     echo
" Voici les instructions &agrave; ex&eacute;cuter dans le shell de "
.b("XMLLINT")." pour r&eacute;pondre aux questions posées&nbsp;:" ;
00210     
finp() ;
00211     
00212     
pre_fichier
("films2_sh.txt","cadrebleu") ;
00213     
00214     
p
("texte") ;
00215     echo
" Pour les titres de films en
$PHP, une fois la documentation de ".href("http://php.net/manual/fr/book.simplexml.php","SimpleXML")." parcourue, " ;
00216     echo
" les "
.href("http://php.net/manual/fr/simplexml.examples-basic.php","exemples standards")." suffisent largement pour écrire le code suivant " ;
00217     echo
" qui fournit l'affichage demandé&nbsp;:" ;
00218     
00219     
finp() ;
00220     
00221     
pre_fichier
("titres.php","cadrebleu") ;
00222     
00223     
finsolution() ;
00224     
00225     
finblockquote() ;
00226     
00227     
## -------------------------------------------------------------------------------------------
00228     
00229     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Comprende la transformation vide
00230     
00231     ## -------------------------------------------------------------------------------------------
00232     
00233     
blockquote() ;
00234     
00235     
p
("texte") ;
00236     echo
" Que produit la "
.b("transformation vide")." définie dans le fichier ".href("vide.xsl") ;
00237     echo
" si on l'applique aux fichiers " ;
00238     echo
href
("eau.xml").", " ;
00239     echo
href
("eau2.xml").", " ;
00240     echo
href
("trajets.xml")." et " ;
00241     echo
href
("firefox.svg") ;
00242     echo
" du T.P. 1&nbsp;?" ;
00243     
finp() ;
00244     
00245     
pre_fichier
("vide.xsl","cadrebleu") ;
00246     
00247     
p
("texte") ;
00248     echo
"Quelle est, pour ces fichiers, la différence avec la transformation minimaliste nommée "
.href("minimaliste.xsl")."&nbsp;?" ;
00249     
finp() ;
00250     
00251     
pre_fichier
("minimaliste.xsl","cadrebleu") ;
00252     
00253     
solution
($numExo,$numSerie) ;
00254     
00255     
p
("texte") ;
00256     echo
" La transformation vide affiche les contenus textuels des éléments et ignore les attributs. " ;
00257     echo
" Pour le fichier "
.href("eau.xml")." on récupère donc trois lignes pratiquement vides (en fait on récupère les espaces d'indentation et les sauts de ligne, ";
00258     echo
" ce qui fait qu'à l'écran on ne voit rien. " ;
00259     echo
" Pour le fichier "
.href("eau2.xml")." on récupère les noms et les nombres d'atomes. " ;
00260     echo
" Au niveau de "
.href("trajets.xml").", le type de train, le nom des gares de départ et d'arrivée sont affichés." ;
00261     
finp() ;
00262     
00263     
p
("texte") ;
00264     echo
"Pour la dessin du renard, il y a beaucoup de lignes vides affichées, ce qui fait qu'on risque de manquer le début de " ;
00265     echo
" l'affichage. Heureusement, "
.b("grep")." est notre ami&nbsp;! " ;
00266     echo
" On récupère donc comme seules lignes de texte le contenu des éléments "
.b("title")." et ".b("desc").". " ;
00267     
finp() ;
00268     
00269     
pre_fichier
("tf_vides.txt","cadre") ;
00270     
00271     
00272     
p
("texte") ;
00273     echo
"Il n'y a en principe aucune différence entre les transformations " ;
00274     echo
href
("vide.xsl") ;
00275     echo
" et " ;
00276     echo
href
("minimaliste.xsl") ;
00277     echo
" parce que la transformation vide applique toutes les règles par défaut à partir de la racine." ;
00278     
finp() ;
00279     
00280     
finsolution() ;
00281     
00282     
finblockquote() ;
00283     
00284     
## -------------------------------------------------------------------------------------------
00285     
00286     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Réaliser une transformation minimale avec XSL
00287     
00288     ## -------------------------------------------------------------------------------------------
00289     
00290     
blockquote() ;
00291     
00292     
p
("texte") ;
00293     echo
" Que faut-il ajouter à la "
.b("transformation minimaliste")." définie dans le fichier ".href("minimaliste.xsl") ;
00294     echo
" pour qu'elle n'affiche que les noms d'atome si on l'applique au fichier " ;
00295     echo
href
("eau2.xml") ;
00296     echo
"&nbsp;?" ;
00297     
finp() ;
00298     
00299     
solution
($numExo,$numSerie) ;
00300     
00301     
p
("texte") ;
00302     echo
" Une première solution consiste à définir deux règles, l'une pour l'élément "
.b("nom")." et l'autre pour l'élément ".b("nombre").". " ;
00303     echo
" Pour "
.b("nom")." on veut afficher le contenu alors que pour ".b("nombre")." on ne veut rien faire (puisqu'on ne veut pas afficher)".". " ;
00304     echo
" Voici donc la solution dans "
.href("mineau2.xsl")."&nbsp;:" ;
00305     
finp() ;
00306     
00307     
pre_fichier
("mineau2.xsl","cadrejaune") ;
00308     
00309     
p
("texte") ;
00310     echo
"Une meilleure solution est sans doute de ne demander que de déclencher les règles pour les éléments "
.b("noms").", " ;
00311     echo
" soit le code du fichier "
.href("mineau3.xsl")."&nbsp;:" ;
00312     
finp() ;
00313     
00314     
pre_fichier
("mineau3.xsl","cadrejaune") ;
00315     
00316     
finsolution() ;
00317     
00318     
finblockquote() ;
00319     
00320     
## -------------------------------------------------------------------------------------------
00321     
00322     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Une transformation XSL &eacute;l&eacute;mentaire
00323     
00324     ## -------------------------------------------------------------------------------------------
00325     
00326     
blockquote() ;
00327     
00328     
p
("texte") ;
00329     echo
" On voudrait compter le nombre de prot&eacute;ines du fichier "
.href("leadb880.xml")." et v&eacute;rifier que chaque prot&eacute;ine a bien un attribut ".b("length").". " ;
00330     echo
" Trouver une solution en ligne de commandes puis &agrave; l'aide d'une transformation
$XSL." ;
00331     echo
" Comment peut-on trouver la plus petite longueur de prot&eacute;ine et la plus grande via
$XSL&nbsp;?" ;
00332     
finp() ;
00333     
00334     
p
("texte") ;
00335     echo
" Ecrire ensuite un script
$PHP qui trouve la plus petite longueur de prot&eacute;ine et la plus grande." ;
00336     
finp() ;
00337     
00338     
solution
($numExo,$numSerie) ;
00339     
00340     
p
("texte") ;
00341     echo
" Une prot&eacute;ine correspond &agrave; un &eacute;l&eacute;ment "
.b("protein")." donc il suffit de compter les chaines ".b("&lt;protein&gt;")." pour les d&eacute;nombrer. " ;
00342     echo
" L'attribut "
.b("length").", lui, peut se rep&eacute;rer gr&acirc;ce &agrave; l'expression ".b("&lt;fasta length=").". " ;
00343     echo
" Dans les deux cas, on trouve 880 lignes correspondantes, mais cela ne prouve sans doute pas que chaque prot&eacute;ine a bien un attribut "
.b("length") ;
00344     echo
" dans un sous-&eacute;l&eacute;ment "
.b("fasta")." sauf &agrave; valider le fichier pour la grammaire " ;
00345     echo
href
("leadb_dtd.txt","leadb.dtd")." de la question 1 " ;
00346     echo
" (ou à savoir bien compter, car 3521 = 1 + 4x880). " ;
00347     echo
" Par contre rechercher toutes les expressions "
.b("proteins/protein/fasta/@length")." dans la sortie de ".b("xmlstarlet el -a")." peut le prouver. ";
00348     echo
" Voici les commandes &agrave; utiliser&nbsp;:" ;
00349     
finp() ;
00350     
00351     
pre_fichier
("leadb_prot.txt","cadrebleu") ;
00352     
00353     
00354     
p
("texte") ;
00355     echo
"Pour effectuer une transformation
$XSL qui r&eacute;alise les m&ecirc;mes comptages, il suffit de mettre une seule r&egrave;gle sur " ;
00356     echo
" la racine du document et d'utiliser la fonction
$XPATH nomm&eacute;e " ;
00357     echo
href
("http://forge.info.univ-angers.fr/~gh/selfhtml_fr/xml/representation/fonctionsxpath.htm#count","count()").". " ;
00358     
finp() ;
00359     
00360     
p() ;
00361     echo
b
("Transformation ".href("proteines.xsl")."&nbsp;:") ;
00362     
finp() ;
00363     
00364     
pre_fichier
("proteines.xsl","cadrebleu") ;
00365     
00366     
p
("texte") ;
00367     echo
"Pour ex&eacute;cuter cette transformation, on peut utiliser "
.b("xsltproc")."&nbsp;:" ;
00368     
finp() ;
00369     
00370     
pre_fichier
("proteines_sh1.txt","cadrebleu") ;
00371     
00372     
p
("texte") ;
00373     echo
"mais ce n'est pas le seul choix possible. Par exemple on peut utiliser "
.b("xmlstarlet")."&nbsp;:" ;
00374     
finp() ;
00375     
00376     
pre_fichier
("proteines_sh2.txt","cadrebleu") ;
00377     
00378     
00379     
p
("texte") ;
00380     echo
" On peut aussi mettre l'appel du fichier
$XSL dans l'en-t&ecirc;te du fichier $XML et faire ex&eacute;cuter la transformation " ;
00381     echo
" par le navigateur, comme "
.href("leadb880tr.xml","ici").". " ;
00382     
finp() ;
00383     
00384     
p
("texte") ;
00385     echo
"Pour trouver la longueur minimale et la longueur maximale, on peut se contenter de trier par ordre croissant ou d&eacute;croissant et de garder la premi&egrave;re valeur, soit " ;
00386     echo
" le code
$XSL suivant&nbsp;:" ;
00387     
finp() ;
00388     
00389     
pre_fichier
("prot_max1.xsl","cadrebleu") ;
00390     
00391     
p
("texte") ;
00392     echo
" dont le rendu est " ;
00393     
finp() ;
00394     
00395     
pre_fichier
("prot_max1.sor","cadrejaune") ;
00396     
00397     
p
("texte") ;
00398     echo
" Il n'y a aucune difficulté à utiliser de nouveau "
.b("SimpleXML")." pour trouver en $PHP la plus petite longueur et la plus grande longueur de protéine et la plus grande. " ;
00399     echo
" Il faut juste ne pas oublier de convertir le texte issu de
$XPATH via la fonction ".href("http://php.net/manual/fr/function.intval.php","intval()")." sous peine de trouver " ;
00400     echo
" 110 aa à la fois comme plus petite valeur et plus grande valeur." ;
00401     
finp() ;
00402     
00403     
pre_fichier
("protminmax.php","cadrebleu") ;
00404     
00405     
finsolution() ;
00406     
00407     
finblockquote() ;
00408     
00409     
## -------------------------------------------------------------------------------------------
00410     
00411     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Une deuxi&egrave;me transformation XSL
00412     
00413     ## -------------------------------------------------------------------------------------------
00414     
00415     
blockquote() ;
00416     
00417     
p
("texte") ;
00418     echo
" Dans le document "
.href("films2.xml").", combien y a-t-il de films&nbsp;? Et d'artistes&nbsp;? Combien de r&eacute;f&eacute;rences pour combien de metteurs en sc&egrave;ne&nbsp;? " ;
00419     echo
" On &eacute;crira une transformation
$XSL qui affichera ces r&eacute;sultats en mode texte qu'on ex&eacute;cutera avec ".b("xmlstarlet")." avant " ;
00420     echo
" de modifier le document pour avoir un rendu dans une "
.b("page Web")." valide pour la grammaire ".b("XHTML Strict")."." ;
00421     
finp() ;
00422     
00423     
p
("texte") ;
00424     echo
ghRouge
("Remarque&nbsp;:") ;
00425     echo
" on pourra utiliser le fichier "
.href("stdWeb2.xsl")." qui contient des sous-programmes $XSL adapt&eacute;s &agrave; la production de pages ".b("Web").". " ;
00426     
finp() ;
00427     
00428     
blockquote() ;
00429     
00430     
p() ;
00431     echo
b
("Fichier stdWeb2.xsl") ;
00432     
finp() ;
00433     
00434     
p() ;
00435     
textarea_fichier
("stdweb2","tajaunec",25,80,"stdweb","stdWeb2.xsl","") ;
00436     
finp() ;
00437     
00438     
finblockquote() ;
00439     
00440     
solution
($numExo,$numSerie) ;
00441     
00442     
p
("texte") ;
00443     echo
"Compter avec
$XSL se fait &agrave; l'aide de la fonction ".b("count()")." dans un attribut ".b("select")." d'un &eacute;l&eacute;ment ".b("xsl:value-of").". " ;
00444     echo
" Encore faut-il trouver les noeuds correspondants. Pour les films et les artistes, c'est assez simple car les &eacute;l&eacute;ments "
.ghBleu("FILM")." et " ;
00445     echo
" "
.ghBleu("ARTISTE")." identifient de fa&ccedil;on unique ce qu'on cherche donc il suffit de compter ".ghBleu("//FILM")." et ".ghBleu("//ARTISTE").". " ;
00446     
finp() ;
00447     
00448     
p
("texte") ;
00449     echo
"Pour trouver les metteurs en sc&egrave;ne, il faut retenir les attributs "
.b("id")." de ".ghBleu("ARTISTE") ;
00450     echo
" qui correspondent &agrave; un attribut "
.b("idref")." de ".ghBleu("MES").", " ;
00451     echo
" soit le filtre "
.ghBleu("ARTISTE[@id=//MES/@idref]")." -- bien noter le double slash devant ".b("MES").". " ;
00452     echo
" Nous avons rajout&eacute; dans la solution des "
.b("xsl:text")." pour rendre les " ;
00453     echo
" affichages plus lisibles et nous avons mis le nom des metteurs en majuscules (avec des indications de solution "
.ghRouge("XSL 2").")&nbsp;:" ;
00454     
finp() ;
00455     
00456     
pre_fichier
("nbfa1.xsl","cadrebleu") ;
00457     
pre_fichier
("nbfa1_sor.txt","cadrejaune") ;
00458     
00459     
00460     
p
("texte") ;
00461     echo
"Produire une page Web r&eacute;sultat est un peu plus compliqu&eacute; car il faut aussi produire du code
$HTML " ;
00462     echo
" ce qui signifie qu'il faut sans doute utiliser deux espaces de noms distincts. " ;
00463     
finp() ;
00464     
00465     
p
("texte") ;
00466     echo
" Voici la solution&nbsp;:" ;
00467     
finp() ;
00468     
00469     
pre_fichier
("films2.xsl","cadrebleu") ;
00470     
00471     
p
("texte") ;
00472      echo
"Le rendu correspondant est "
.href("films2_xsl.html","ici").". " ;
00473     
finp() ;
00474     
00475     
finsolution() ;
00476     
00477     
finblockquote() ;
00478     
00479     
## -------------------------------------------------------------------------------------------
00480     
00481     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Transformations XSL avanc&eacute;es
00482     
00483     ## -------------------------------------------------------------------------------------------
00484     
00485     
blockquote() ;
00486     
00487     
p
("texte") ;
00488     echo
" On voudrait effectuer des calculs statistiques et tracer des graphiques pour &eacute;tudier statistiquement la longueur des prot&eacute;ines " ;
00489     echo
" du fichier "
.href("leadb880.xml").". Que peut-on calculer et tracer via $XSL&nbsp;?" ;
00490     
finp() ;
00491     
00492     
p
("texte") ;
00493     echo
" Est-ce qu'écrire un script
$PHP est ici adapté&nbsp;?" ;
00494     
finp() ;
00495     
00496     
solution
($numExo,$numSerie) ;
00497     
00498     
p
("texte") ;
00499     echo
"
$XSL ne peut pas grand chose pour nous ici car $XSL est con&ccedil;u pour transformer du texte, pas pour calculer. " ;
00500     echo
"
$PHP n'est pas vraiment non plus prévu pour réaliser des traitements statistiques. " ;
00501     echo
" Par contre
$XSL peut nous aider &agrave; produire un fichier $CSV utilisable par $Excel, le logiciel $R ou tout autre logiciel statistique. " ;
00502     echo
" Pour cela, il suffit d'exporter le nom de chaque prot&eacute;ine, sa classe et sa longueur. C'est ce que fait la transformation suivante&nbsp;:" ;
00503     
finp() ;
00504     
00505     
pre_fichier
("prot_export.xsl","cadrebleu") ;
00506     
00507     
# xsltproc prot_export.xsl leadb880.xml | grep -v "^$" | head
00508     
00509     
p
("texte") ;
00510     echo
"On pourra v&eacute;rifier que les donn&eacute;es obtenues par la commande " ;
00511     echo
b
("xsltproc prot_export.xsl leadb880.xml | grep -v \"^$\" | head") ;
00512     echo
" soit le fichier "
.href("prot_export.csv")." est utilisable par ".b("Microsoft Office Excel")." ou par ".b("Libre Office Calc")."&nbsp;:" ;
00513     
finp() ;
00514     
00515     
blockquote() ;
00516     
p() ;
00517     
textarea_fichier
("leadb880exp","tajaunec",25,80,"leadbExp","prot_export.csv","") ;
00518     
finp() ;
00519     
finblockquote() ;
00520     
00521     
p
("texte") ;
00522     echo
"On peut alors analyser ces données via le script
$R suivant" ;
00523     
finp() ;
00524     
00525     
pre_fichier
("prot_export.r","cadre") ;
00526     
00527     
p
("texte") ;
00528     echo
"qui produit les résultats ci-dessous" ;
00529     
finp() ;
00530     
00531     
pre_fichier
("prot_export.sor","cadrebleu") ;
00532     
00533     
p
("texte") ;
00534     echo
"ainsi que le graphique suivant&nbsp;:" ;
00535     
finp() ;
00536     
00537     
p() ;
00538     
$img
= "protLng.png" ;
00539     echo
href
($img,img($img,"",400)) ;
00540     
finp() ;
00541     
00542     
p
("texte") ;
00543     echo
"Nous laissons le soin au lecteur de rédiger le commentaire statistique associé." ;
00544     echo
" Le script
$R utilise notre fonction ".b("decritQT()")." décrite " ;
00545     echo
href
("http://forge.info.univ-angers.fr/~gh/wstat/statghfns.php?lafns=decritQT&amp;montrer=montrer","ici").". " ;
00546     
finp() ;
00547     
00548     
finsolution() ;
00549     
00550     
finblockquote() ;
00551     
00552     
## -------------------------------------------------------------------------------------------
00553     
00554     
h2
("Questions sans réponse affichée dans le navigateur (donc venez en TP&nbsp;!)") ;
00555     
00556     
blockquote() ;
00557     
ul() ;
00558     
debutli
() ; p("texte") ;
00559      echo
"Pourquoi est-ce difficile de construire une grammaire
$XSD fine et précise pour les protéines LEA si on n'est pas biologiste&nbsp;?" ;
00560     
finp
() ; finli() ;
00561     
00562     
# il est difficile de définir une longueur minimale (et sans doute maximale) de protéine, de savoir à quoi correspond une classe,
00563      # savoir quelle expression régulière correspond aux numéros d'accession est un vrai casse-tete
00564     
00565     
debutli
() ; p("texte") ;
00566      echo
"Comment faire pour trouver les attributs uniques si on ne connait pas l'option "
.b("-u")." de la commande ".b("sort")."&nbsp;?" ;
00567     
finp
() ; finli() ;
00568     
00569     
# on peut utiliser la commande unique d'Unix ; exemple :
00570      # (rm -f films_att.txt ; xmlstarlet el -a films2.xml | grep "@" | sort > films.att ; unique films_att.txt < films.att).
00571     
00572     
debutli
() ; p("texte") ;
00573      echo
"Peut-on compter des \"non-éléments\" ou des éléments sans attributs&nbsp;?" ;
00574      echo
" Par exemple, pour "
.href("films2.xml")." combien manque-t-il de résumés&nbsp;? et de dates de naissance&nbsp;?" ;
00575     
finp
() ; finli() ;
00576     
00577     
# xpath count(//FILM//RESUME) soit 41 films sur 48 n'est sans doute pas suffisant
00578      # xpath count(//ARTISTE[./ANNEENAISS=""]) # 40 éléments
00579      # xpath count(//ARTISTE[./ANNEENAISS!=""]) # 77 éléments
00580     
00581     
debutli
() ; p("texte") ;
00582      echo
"Pourquoi faut-il compter les attributs avec "
.b("/@")." plut&ocirc;t qu'avec seulement ".b("@")."&nbsp;&nbsp;?" ;
00583     
finp
() ; finli() ;
00584     
00585     
# il pourrait y avoir des adresses emails avec le symbole @
00586     
00587     
finul() ;
00588     
finblockquote() ;
00589     
00590     
## -------------------------------------------------------------------------------------------
00591     
00592     
pvide() ;
00593     
00594     
###########################################################################################
00595     
00596     
p() ;
00597     echo
href
("montresource.php?nomfic=m1xml_6_tp2.php","Code-source php de cette page","orange_stim nou")."." ;
00598     
finp() ;
00599     
00600     
finSection() ;
00601     
00602     if (!isset(
$_GET
["standalone"])) { finPage() ; } ;
00603     
?>

Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.

 

 

retour gH    Retour à la page principale de   (gH)