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 
;
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 
;
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   
;
00049     $numSerie 
;
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 numéros 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)