Listing du fichier l2xml_6_tp4.php
00001 <?php
00002 # # (gH) -_- l2xml_6_tp4.php ; TimeStamp (unix) : 11 Février 2018 vers 16:32
00003 include("std.php") ;
00004 include("l2xml_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 = 4 ;
00021
00022 if (!isset($_GET["standalone"])) { debutPage("XML en L2, TP $numSerie","strict","","l2xml.js") ; } ;
00023
00024 debutSection() ;
00025 h1("$XML en L2, université d'Angers ") ;
00026 h2(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00027 pvide() ;
00028 h2(s_span("T.P. numéro $numSerie","gbleu")." : transformation") ;
00029 pvide() ;
00030
00031 ###########################################################################################
00032
00033 $tableauDesRubriques = array() ;
00034 $idr = 0 ;
00035 $idr++; $tableauDesRubriques[$idr] = "Expressions $XPATH " ;
00036 $idr++; $tableauDesRubriques[$idr] = "Comprendre la transformation vide" ;
00037 $idr++; $tableauDesRubriques[$idr] = "Réaliser une transformation minimale avec $XSL" ;
00038 $idr++; $tableauDesRubriques[$idr] = "Une transformation $XSL élémentaire" ;
00039 $idr++; $tableauDesRubriques[$idr] = "Une deuxième transformation $XSL pour ajouter des informations " ;
00040 $idr++; $tableauDesRubriques[$idr] = "Une troisième transformation $XSL pour un rendu en page Web" ;
00041 $idr++; $tableauDesRubriques[$idr] = "Transformations $XSL avancées et statistiques" ;
00042 $tdmCRLM = new tdm($tableauDesRubriques) ;
00043 $tdmCRLM->titre() ;
00044 $tdmCRLM->menu("oui","oui","nou") ;
00045
00046 pvide() ;
00047 $numExo = 0 ;
00048 $numSerie = 4 ;
00049 direAfficherSolutions($numSerie) ;
00050 pvide() ;
00051
00052 ## -------------------------------------------------------------------------------------------
00053
00054 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Expressions XPATH
00055
00056 ## -------------------------------------------------------------------------------------------
00057
00058 blockquote() ;
00059
00060 p("texte") ;
00061 echo " On s'intéresse ici au document ".href("films2.xml")." qui contient des films et des artistes. " ;
00062 finp() ;
00063
00064 blockquote() ;
00065 p() ;
00066 textarea_fichier("films2","tajaunec",25,80,"films","films2.xml","") ;
00067 finp() ;
00068 finblockquote() ;
00069
00070 p("texte") ;
00071 echo "En voici la grammaire $DTD :" ;
00072 finp() ;
00073
00074 pre_fichier("films2.dtd","cadrebleu") ;
00075
00076 p("texte") ;
00077 echo "On fournit aussi la structure explicite du fichier (éléments seulement) obtenue à l'aide de la commande ".b("xmlstarlet el -u films2.xml")." :" ;
00078 finp() ;
00079
00080 pre_fichier("films2_stru.txt","cadrejaune") ;
00081
00082 p("texte") ;
00083 echo " On liste également la liste des attributs uniques du fichier :" ;
00084 finp() ;
00085
00086 pre_fichier("films2_att.txt","cadrejaune") ;
00087
00088 p("texte") ;
00089 echo "A l'aide de ".b("xmllint")." en mode ".em("«shell»").", essayer ensuite de répondre aux questions suivantes :" ;
00090 finp() ;
00091
00092 ul() ;
00093
00094 # grep TITRE films2.xml | head -n 9 | tail -n 1 ; 95:<TITRE>Gladiator</TITRE>
00095
00096 debutli() ; p("texte") ;
00097 echo "Quels sont tous les titres de films ?" ;
00098 finp() ; finli() ;
00099
00100 debutli() ; p("texte") ;
00101 echo "Quel est le neuvième titre de film ?" ;
00102 finp() ; finli() ;
00103
00104 debutli() ; p("texte") ;
00105 echo "En quelle année est sorti le film ".em("Blade Runner")." ?" ;
00106 finp() ; finli() ;
00107
00108 debutli() ; p("texte") ;
00109 echo "Quel en est le metteur en scène ?" ;
00110 finp() ; finli() ;
00111
00112 debutli() ; p("texte") ;
00113 echo "Combien y a-t-il de films ?" ;
00114 finp() ; finli() ;
00115
00116 debutli() ; p("texte") ;
00117 echo "Quels éléments contiennent le texte \"Bruce\" ?" ;
00118 finp() ; finli() ;
00119
00120 finul() ;
00121
00122 p("texte") ;
00123 echo b("Remarque :") ;
00124 echo " il faut peut-être utiliser la commande ".b("rlwrap xmllint --shell films2.xml") ;
00125 echo " au lieu de la simple commande ".b("xmllint --shell films2.xml")." si le terminal n'est pas bien configuré afin de pouvoir " ;
00126 echo " facilement éditer la ligne de commandes sous xmllint." ;
00127 finp() ;
00128
00129 solution($numExo,$numSerie) ;
00130
00131 p("texte") ;
00132 echo " Voici les instructions à exécuter dans le shell de ".b("XMLLINT")." pour répondre aux questions posées :" ;
00133 finp() ;
00134
00135 pre_fichier("films2_sh.txt","cadrebleu") ;
00136
00137 finsolution() ;
00138
00139 finblockquote() ;
00140
00141 ## -------------------------------------------------------------------------------------------
00142
00143 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Comprende la transformation vide
00144
00145 ## -------------------------------------------------------------------------------------------
00146
00147 blockquote() ;
00148
00149 p("texte") ;
00150 echo " Que produit la ".b("transformation vide")." définie dans le fichier ".href("vide.xsl") ;
00151 echo " si on l'applique aux fichiers " ;
00152 echo href("eau.xml").", " ;
00153 echo href("eau2.xml").", " ;
00154 echo href("trajets.xml")." et " ;
00155 echo href("firefox.svg") ;
00156 echo " du T.P. 1 ?" ;
00157 finp() ;
00158
00159 pre_fichier("vide.xsl","cadrebleu") ;
00160
00161 p("texte") ;
00162 echo "Quelle est, pour ces fichiers, la différence avec la transformation minimaliste nommée ".href("minimaliste.xsl")." ?" ;
00163 finp() ;
00164
00165 pre_fichier("minimaliste.xsl","cadrebleu") ;
00166
00167 solution($numExo,$numSerie) ;
00168
00169 p("texte") ;
00170 echo " La transformation vide affiche les contenus textuels des éléments et ignore les attributs. " ;
00171 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, ";
00172 echo " ce qui fait qu'à l'écran on ne voit rien. " ;
00173 echo " Pour le fichier ".href("eau2.xml")." on récupère les noms et les nombres d'atomes. " ;
00174 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." ;
00175 finp() ;
00176
00177 p("texte") ;
00178 echo "Pour le dessin du renard, il y a beaucoup de lignes vides affichées, ce qui fait qu'on risque de manquer le début de " ;
00179 echo " l'affichage. Heureusement, ".b("grep")." est notre ami ! " ;
00180 echo " On récupère donc comme seules lignes de texte le contenu des éléments ".b("title")." et ".b("desc").". " ;
00181 finp() ;
00182
00183 pre_fichier("tf_vides.txt","cadre") ;
00184
00185
00186 p("texte") ;
00187 echo "Il n'y a en principe aucune différence entre les transformations " ;
00188 echo href("vide.xsl") ;
00189 echo " et " ;
00190 echo href("minimaliste.xsl") ;
00191 echo " parce que la transformation vide applique toutes les règles par défaut à partir de la racine." ;
00192 finp() ;
00193
00194 finsolution() ;
00195
00196 finblockquote() ;
00197
00198 ## -------------------------------------------------------------------------------------------
00199
00200 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Réaliser une transformation minimale avec XSL
00201
00202 ## -------------------------------------------------------------------------------------------
00203
00204 blockquote() ;
00205
00206 p("texte") ;
00207 echo " Que faut-il ajouter à la ".b("transformation minimaliste")." définie dans le fichier ".href("minimaliste.xsl") ;
00208 echo " pour qu'elle n'affiche que les noms d'atome si on l'applique au fichier " ;
00209 echo href("eau2.xml") ;
00210 echo " ?" ;
00211 finp() ;
00212
00213 solution($numExo,$numSerie) ;
00214
00215 p("texte") ;
00216 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").". " ;
00217 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)".". " ;
00218 echo " Voici donc la solution dans ".href("mineau2.xsl")." :" ;
00219 finp() ;
00220
00221 pre_fichier("mineau2.xsl","cadrejaune") ;
00222
00223 p("texte") ;
00224 echo "Une meilleure solution est sans doute de ne demander que de déclencher les règles pour les éléments ".b("noms").", " ;
00225 echo " soit le code du fichier ".href("mineau3.xsl")." :" ;
00226 finp() ;
00227
00228 pre_fichier("mineau3.xsl","cadrejaune") ;
00229
00230 p("texte") ;
00231 echo " Enfin, la solution la plus courte est d'intercepter la règle sur l'élément nombre, " ;
00232 echo " soit le code du fichier ".href("mineau4.xsl")." :" ;
00233 finp() ;
00234
00235 pre_fichier("mineau4.xsl","cadrejaune") ;
00236
00237 finsolution() ;
00238
00239 finblockquote() ;
00240
00241 ## -------------------------------------------------------------------------------------------
00242
00243 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Une transformation XSL élémentaire
00244
00245 ## -------------------------------------------------------------------------------------------
00246
00247 blockquote() ;
00248
00249 p("texte") ;
00250 echo " On voudrait compter le nombre de protéines du fichier ".href("leadb880.xml")." et vérifier que chaque protéine a bien un attribut ".b("length").". " ;
00251 echo " Trouver une solution en ligne de commandes puis à l'aide d'une transformation $XSL." ;
00252 finp() ;
00253
00254 p("texte") ;
00255 echo " Comment peut-on trouver la plus petite longueur de protéine et la plus grande via $XSL ?" ;
00256 finp() ;
00257
00258 /*
00259 p("texte") ;
00260 echo " Ecrire ensuite un script $PHP qui trouve la plus petite longueur de protéine et la plus grande." ;
00261 finp() ;
00262 */
00263
00264 solution($numExo,$numSerie) ;
00265
00266 p("texte") ;
00267 echo " Une protéine correspond à un élément ".b("protein")." donc il suffit de compter les chaines ".b("<protein>")." pour les dénombrer. " ;
00268 echo " L'attribut ".b("length").", lui, peut se repérer grâce à l'expression ".b("<fasta length=").". " ;
00269 echo " Dans les deux cas, on trouve 880 lignes correspondantes, mais cela ne prouve sans doute pas que chaque protéine a bien un attribut ".b("length") ;
00270 echo " dans un sous-élément ".b("fasta")." sauf à valider le fichier pour la grammaire " ;
00271 echo href("leadb_dtd.txt","leadb.dtd")." du T.P. numéro 1 " ;
00272 echo " (ou à savoir bien compter, car 3521 = 1 + 4x880). " ;
00273 echo " Par contre rechercher toutes les expressions ".b("proteins/protein/fasta/@length")." dans la sortie de ".b("xmlstarlet el -a")." peut le prouver. ";
00274 echo " Voici les commandes à utiliser :" ;
00275 finp() ;
00276
00277 pre_fichier("leadb_prot.txt","cadrebleu") ;
00278
00279
00280 p("texte") ;
00281 echo "Pour effectuer une transformation $XSL qui réalise les mêmes comptages, il suffit de mettre une seule règle sur " ;
00282 echo " la racine du document et d'utiliser la fonction $XPATH nommée " ;
00283 echo href("http://forge.info.univ-angers.fr/~gh/selfhtml_fr/xml/representation/fonctionsxpath.htm#count","count()").". " ;
00284 finp() ;
00285
00286 p() ;
00287 echo b("Transformation ".href("proteines.xsl")." :") ;
00288 finp() ;
00289
00290 pre_fichier("proteines.xsl","cadrebleu") ;
00291
00292 p("texte") ;
00293 echo "Pour exécuter cette transformation, on peut utiliser ".b("xsltproc")." :" ;
00294 finp() ;
00295
00296 pre_fichier("proteines_sh1.txt","cadrebleu") ;
00297
00298 p("texte") ;
00299 echo "mais ce n'est pas le seul choix possible. Par exemple on peut utiliser ".b("xmlstarlet")." :" ;
00300 finp() ;
00301
00302 pre_fichier("proteines_sh2.txt","cadrebleu") ;
00303
00304
00305 p("texte") ;
00306 echo " On peut aussi mettre l'appel du fichier $XSL dans l'en-tête du fichier $XML et faire exécuter la transformation " ;
00307 echo " par le navigateur, comme ".href("leadb880tr.xml","ici").". " ;
00308 finp() ;
00309
00310 p("texte") ;
00311 echo "Pour trouver la longueur minimale et la longueur maximale, on peut se contenter de trier par ordre croissant ou décroissant et de garder la première valeur, soit " ;
00312 echo " le code $XSL suivant :" ;
00313 finp() ;
00314
00315 pre_fichier("prot_max1.xsl","cadrebleu") ;
00316
00317 p("texte") ;
00318 echo " dont le rendu est " ;
00319 finp() ;
00320
00321 pre_fichier("prot_max1.sor","cadrejaune") ;
00322
00323 finsolution() ;
00324
00325 finblockquote() ;
00326
00327 ## -------------------------------------------------------------------------------------------
00328
00329 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Une deuxième transformation XSL pour ajouter des informations
00330
00331 ## -------------------------------------------------------------------------------------------
00332
00333 blockquote() ;
00334
00335 p("texte") ;
00336 echo "Ecrire des transformations ".b("ajouteAge")." qui calculent et ajoutent l'age aux personnes dont " ;
00337 echo " on connait la date de naissance. On ajoutera un élément age lorsque la ddn est un élément, un attribut age " ;
00338 echo " si la ddn est un attribut. Effectuez ensuite les transformations inverses, à savoir mettre un attribut quand on " ;
00339 echo " a un élément et réciproquement. " ;
00340 echo " On utilisera les fichiers ".href("pers01.xml")." et ".href("pers02.xml")." pour tester les transformations." ;
00341 finp() ;
00342
00343 p("texte") ;
00344 echo "Nous avons vu dans la série d'exercices sur la structuration des fichiers $XML qu'un attribut tout numérique ne pouvait pas servir d'".b("ID")." et donc d'".b("IDREF")." non plus. " ;
00345 echo " Ecrire une transformation ".b("ajouteArt")." qui modifie les attributs ".ghBleu("id")." et ".ghBleu("idref")." des éléments " ;
00346 echo ghBleu("MES")." (metteurs en scène) et ".ghBleu("ARTISTES")." de ".href("films2.xml")." par l'ajout " ;
00347 echo " de ".b("\"art\"").". Ainsi au lieu de ".ghRouge("<MES idref=\"3\"></MES>")." et ".ghRouge("<ARTISTE id=\"51\">").", " ;
00348 echo " on devra avoir : ".ghVert("<MES idref=\"art3\"></MES>")." et ".ghVert("<ARTISTE id=\"art51\">")."." ;
00349 finp() ;
00350
00351 solution($numExo,$numSerie) ;
00352
00353 $sousExo = 0 ;
00354 /*
00355 p("texte") ;
00356 echo "Exercice volontairement non corrigé." ;
00357 finp() ;
00358 */
00359
00360 p("texte") ;
00361 echo " Il n'y a aucune difficuté à ajouter des éléments ou des attributs à un document $XML. " ;
00362 echo " On commence par préciser dans ".b("xsl:output")." que la sortie est du $XML, puis on se sert de " ;
00363 echo " la fonction ".href("http://fsajous.free.fr/xml/xslt/instr_copy-of.html","xsl:copy-of") ;
00364 echo " pour recopier chaque élément ".b("personne")." avec son sous-arbre. " ;
00365 echo " Au passage, on crée un nouvel élément ".b("age")." ou on rajoute un attribut ".b("age").". " ;
00366 finp() ;
00367
00368 $sousExo++ ; h3("$numExo".".".$sousExo." Ajout de l'age") ;
00369
00370
00371 p("texte") ;
00372 echo "Commençons par ajouter un élément age pour ".href("pers01.xml")." :" ;
00373 finp() ;
00374
00375 pre_fichier("aea1.xsl","cadre") ;
00376
00377 p("texte") ;
00378 echo "Résultat :" ;
00379 finp() ;
00380
00381 pre_fichier("aea1.res","cadrebleu",0,1) ; # produit par exsl pers01.xml aea1.xsl > aea1.res
00382
00383 p("texte") ;
00384 echo "Ajoutons maintenant un attribut age pour ".href("pers02.xml")." :" ;
00385 finp() ;
00386
00387 pre_fichier("aea2.xsl","cadre") ;
00388
00389 p("texte") ;
00390 echo "Résultat :" ;
00391 finp() ;
00392
00393 pre_fichier("aea2.res","cadrebleu",0,1) ; # produit par exsl pers02.xml aea2.xsl > aea2.res
00394
00395 p("texte") ;
00396 echo "Sur le même pricipe; ajoutons maintenant un attribut age pour ".href("pers01.xml")." :" ;
00397 finp() ;
00398
00399 pre_fichier("aea3.xsl","cadre") ;
00400
00401 p("texte") ;
00402 echo "Résultat :" ;
00403 finp() ;
00404
00405 pre_fichier("aea3.res","cadrebleu",0,1) ; # produit par exsl pers01.xml aea3.xsl > aea3.res
00406
00407 p("texte") ;
00408 echo "Et enfin voici un élément age pour ".href("pers02.xml")." :" ;
00409 finp() ;
00410
00411 pre_fichier("aea4.xsl","cadre") ;
00412
00413 p("texte") ;
00414 echo "Résultat :" ;
00415 finp() ;
00416
00417 pre_fichier("aea4.res","cadrebleu",0,1) ; # produit par exsl pers02.xml aea4.xsl > aea4.res
00418
00419 /*
00420 # une pI (processing instruction pour avoir l'année courante dans une variable ?
00421
00422 $sousExo++ ; h3("$numExo".".".$sousExo." Ajout de la longueur dans les séquences Fasta") ;
00423
00424 p("texte") ;
00425 echo "Voici deux possibilités d'ajout, d'abord en élément puis en attribut :" ;
00426 finp() ;
00427
00428 pre_fichier("eltaddlng.xsl","cadrebleu",0,1) ;
00429 pre_fichier("attaddlng.xsl","cadrejaune",0,1) ;
00430 */
00431
00432 $sousExo++ ; h3("$numExo".".".$sousExo." Ajout de \"art\" pour les id et idrefs") ;
00433
00434 p("text") ;
00435 echo b("Attention :") ;
00436 echo " ici, il ne faut pas ajouter un élément ou un attribut, mais le modifier, en lui concaténant les trois lettres ".b("art") ;
00437 echo " en début de chaine. Heureusement, il y a une fonction $XSL nommée " ;
00438 echo href("http://www.java2s.com/Tutorial/XML/0100__XSLT-stylesheet/concatfunction.htm","xsl:concat").". " ;
00439 finp() ;
00440
00441 pre_fichier("ajoutart.xsl","cadre") ;
00442
00443 # plus robuste si {name}="MES" que position 4 ???
00444
00445
00446 finsolution() ;
00447
00448 finblockquote() ;
00449
00450 ## -------------------------------------------------------------------------------------------
00451
00452 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Une troisième transformation XSL pour un rendu en page Web
00453
00454 ## -------------------------------------------------------------------------------------------
00455
00456 blockquote() ;
00457
00458 p("texte") ;
00459 echo " Dans le document ".href("films2.xml").", combien y a-t-il de films ? Et d'artistes ? Combien de références pour combien de metteurs en scène ? " ;
00460 echo " On écrira une transformation $XSL qui affichera ces résultats en mode texte qu'on exécutera avec ".b("xmlstarlet")." avant " ;
00461 echo " de modifier le document pour avoir un rendu dans une ".b("page Web")." valide pour la grammaire ".b("XHTML Strict")."." ;
00462 finp() ;
00463
00464 p("texte") ;
00465 echo ghRouge("Remarque :") ;
00466 echo " on pourra utiliser le fichier ".href("stdWeb2.xsl")." qui contient des sous-programmes $XSL adaptés à la production de pages ".b("Web").". " ;
00467 finp() ;
00468
00469 blockquote() ;
00470
00471 p() ;
00472 echo b("Fichier stdWeb2.xsl") ;
00473 finp() ;
00474
00475 p() ;
00476 textarea_fichier("stdweb2","tajaunec",25,80,"stdweb","stdWeb2.xsl","") ;
00477 finp() ;
00478
00479 finblockquote() ;
00480
00481 solution($numExo,$numSerie) ;
00482
00483 p("texte") ;
00484 echo "Compter avec $XSL se fait à l'aide de la fonction ".b("count()")." dans un attribut ".b("select")." d'un élément ".b("xsl:value-of").". " ;
00485 echo " Encore faut-il trouver les noeuds correspondants. Pour les films et les artistes, c'est assez simple car les éléments ".ghBleu("FILM")." et " ;
00486 echo " ".ghBleu("ARTISTE")." identifient de façon unique ce qu'on cherche donc il suffit de compter ".ghBleu("//FILM")." et ".ghBleu("//ARTISTE").". " ;
00487 finp() ;
00488
00489 p("texte") ;
00490 echo "Pour trouver les metteurs en scène, il faut retenir les attributs ".b("id")." de ".ghBleu("ARTISTE") ;
00491 echo " qui correspondent à un attribut ".b("idref")." de ".ghBleu("MES").", " ;
00492 echo " soit le filtre ".ghBleu("ARTISTE[@id=//MES/@idref]")." -- bien noter le double slash devant ".b("MES").". " ;
00493 echo " Nous avons rajouté dans la solution des ".b("xsl:text")." pour rendre les " ;
00494 echo " affichages plus lisibles (avec des indications de solution ".ghRouge("XSL 2").") :" ;
00495 finp() ;
00496
00497 pre_fichier("nbfa1.xsl","cadrebleu") ;
00498 pre_fichier("nbfa1_sor.txt","cadrejaune") ;
00499
00500 p("texte") ;
00501 echo "Produire une page Web résultat est un peu plus compliqué car il faut aussi produire du code $HTML " ;
00502 echo " ce qui signifie qu'il faut sans doute utiliser deux espaces de noms distincts. " ;
00503 finp() ;
00504
00505 p("texte") ;
00506 echo " Voici la solution :" ;
00507 finp() ;
00508
00509 pre_fichier("films2.xsl","cadrebleu") ;
00510
00511 p("texte") ;
00512 echo "Le rendu correspondant est ".href("films2_xsl.html","ici").". " ;
00513 finp() ;
00514
00515 finsolution() ;
00516
00517 finblockquote() ;
00518
00519 ## -------------------------------------------------------------------------------------------
00520
00521 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Transformations XSL avancées
00522
00523 ## -------------------------------------------------------------------------------------------
00524
00525 blockquote() ;
00526
00527 p("texte") ;
00528 echo " On voudrait effectuer des calculs statistiques et tracer des graphiques pour étudier statistiquement la longueur des protéines " ;
00529 echo " du fichier ".href("leadb880.xml").". Que peut-on calculer et tracer via $XSL ?" ;
00530 finp() ;
00531
00532 p("texte") ;
00533 echo " Est-ce qu'écrire un script $PHP est ici adapté ?" ;
00534 finp() ;
00535
00536 solution($numExo,$numSerie) ;
00537
00538 p("texte") ;
00539 echo " $XSL ne peut pas grand chose pour nous ici car $XSL est conçu pour transformer du texte, pas pour calculer. " ;
00540 echo " $PHP n'est pas vraiment non plus prévu pour réaliser des traitements statistiques. " ;
00541 echo " Par contre $XSL peut nous aider à produire un fichier $CSV utilisable par $Excel, le logiciel $R ou tout autre logiciel statistique. " ;
00542 echo " Pour cela, il suffit d'exporter le nom de chaque protéine, sa classe et sa longueur. C'est ce que fait la transformation suivante :" ;
00543 finp() ;
00544
00545 pre_fichier("prot_export.xsl","cadrebleu") ;
00546
00547 # xsltproc prot_export.xsl leadb880.xml | grep -v "^$" | head
00548
00549 p("texte") ;
00550 echo "On pourra vérifier que les données obtenues par la commande " ;
00551 echo b("xsltproc prot_export.xsl leadb880.xml | grep -v \"^$\" | head") ;
00552 echo " soit le fichier ".href("prot_export.csv")." est utilisable par ".b("Microsoft Office Excel")." ou par ".b("Libre Office Calc")." :" ;
00553 finp() ;
00554
00555 blockquote() ;
00556 p() ;
00557 textarea_fichier("leadb880exp","tajaunec",25,80,"leadbExp","prot_export.csv","") ;
00558 finp() ;
00559 finblockquote() ;
00560
00561 p("texte") ;
00562 echo "On peut alors analyser ces données via le script $R suivant" ;
00563 finp() ;
00564
00565 pre_fichier("prot_export.r","cadre") ;
00566
00567 p("texte") ;
00568 echo "qui produit les résultats ci-dessous" ;
00569 finp() ;
00570
00571 pre_fichier("prot_export.sor","cadrebleu") ;
00572
00573 p("texte") ;
00574 echo "ainsi que le graphique suivant :" ;
00575 finp() ;
00576
00577 p() ;
00578 $img = "protLng.png" ;
00579 echo href($img,img($img,"",400)) ;
00580 finp() ;
00581
00582 p("texte") ;
00583 echo "Nous laissons le soin au lecteur de rédiger le commentaire statistique associé." ;
00584 echo " Le script $R utilise notre fonction ".b("decritQT()")." décrite " ;
00585 echo href("http://forge.info.univ-angers.fr/~gh/wstat/statghfns.php?lafns=decritQT&montrer=montrer","ici").". " ;
00586 finp() ;
00587
00588 finsolution() ;
00589
00590 finblockquote() ;
00591
00592 ## -------------------------------------------------------------------------------------------
00593
00594 h2("Questions sans réponse affichée dans le navigateur (donc venez en TP !)") ;
00595
00596 blockquote() ;
00597 ul() ;
00598 debutli() ; p("texte") ;
00599 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 ?" ;
00600 finp() ; finli() ;
00601
00602 # il est difficile de définir une longueur minimale (et sans doute maximale) de protéine, de savoir à quoi correspond une classe,
00603 # savoir quelle expression régulière correspond aux numéros d'accession est un vrai casse-tete
00604
00605 debutli() ; p("texte") ;
00606 echo "Comment faire pour trouver les attributs uniques si on ne connait pas l'option ".b("-u")." de la commande ".b("sort")." ?" ;
00607 finp() ; finli() ;
00608
00609 # on peut utiliser la commande unique d'Unix ; exemple :
00610 # (rm -f films_att.txt ; xmlstarlet el -a films2.xml | grep "@" | sort > films.att ; unique films_att.txt < films.att).
00611
00612 debutli() ; p("texte") ;
00613 echo "Peut-on compter des \"non-éléments\" ou des éléments sans attributs ?" ;
00614 echo " Par exemple, pour ".href("films2.xml")." combien manque-t-il de résumés ? et de dates de naissance ?" ;
00615 finp() ; finli() ;
00616
00617 # xpath count(//FILM//RESUME) soit 41 films sur 48 n'est sans doute pas suffisant
00618 # xpath count(//ARTISTE[./ANNEENAISS=""]) # 40 éléments
00619 # xpath count(//ARTISTE[./ANNEENAISS!=""]) # 77 éléments
00620
00621 debutli() ; p("texte") ;
00622 echo "Pourquoi faut-il compter les attributs avec ".b("/@")." plutôt qu'avec seulement ".b("@")." ?" ;
00623 finp() ; finli() ;
00624
00625 # il pourrait y avoir des adresses emails avec le symbole @
00626
00627 finul() ;
00628 finblockquote() ;
00629
00630 ## -------------------------------------------------------------------------------------------
00631
00632 pvide() ;
00633
00634 ###########################################################################################
00635
00636 p() ;
00637 echo href("montresource.php?nomfic=l2xml_6_tp4.php","Code-source php de cette page","orange_stim nou")."." ;
00638 finp() ;
00639
00640 finSection() ;
00641
00642 if (!isset($_GET["standalone"])) { finPage() ; } ;
00643 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)