Valid XHTML     Valid CSS2    

Listing du fichier l2xml_6_tp4.php

 

00001     <?php
00002     #   # (gH)   -_-  l2xml_6_tp4.php  ;  TimeStamp (unix) : 11 F&eacute;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 
;
00021     
00022     if (!isset($_GET
["standalone"])) { debutPage("XML en L2, TP $numSerie","strict","","l2xml.js") ; } ;
00023     
00024     debutSection
() ;
00025     h1
("$XML en L2, universit&eacute; d'Angers ") ;
00026     h2
(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00027     pvide
() ;
00028     h2
(s_span("T.P. num&eacute;ro $numSerie","gbleu")."&nbsp;:&nbsp; transformation") ;
00029     pvide
() ;
00030     
00031     ###########################################################################################
00032     
00033     $tableauDesRubriques 
= array() ;
00034     $idr 
;
00035     $idr
++; $tableauDesRubriques[$idr] = "Expressions $XPATH " ;
00036     $idr
++; $tableauDesRubriques[$idr] = "Comprendre la transformation vide" ;
00037     $idr
++; $tableauDesRubriques[$idr] = "R&eacute;aliser une transformation minimale avec $XSL;
00038     $idr
++; $tableauDesRubriques[$idr] = "Une transformation $XSL &eacute;l&eacute;mentaire" ;
00039     $idr
++; $tableauDesRubriques[$idr] = "Une deuxi&egrave;me transformation $XSL pour ajouter des informations " ;
00040     $idr
++; $tableauDesRubriques[$idr] = "Une troisi&egrave;me transformation $XSL pour un rendu en page Web" ;
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     $numExo   
;
00048     $numSerie 
;
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&eacute;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&nbsp;:" ;
00072     finp
() ;
00073     
00074     pre_fichier
("films2.dtd","cadrebleu") ;
00075     
00076     p
("texte") ;
00077     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;:" ;
00078     finp
() ;
00079     
00080     pre_fichier
("films2_stru.txt","cadrejaune") ;
00081     
00082     p
("texte") ;
00083     echo " On liste &eacute;galement la liste des attributs uniques du fichier&nbsp;:" 
;
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("&laquo;shell&raquo;").", essayer ensuite de r&eacute;pondre aux questions suivantes&nbsp;:" ;
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&nbsp;?" 
;
00098     finp
() ; finli() ;
00099     
00100     debutli
() ; p("texte") ;
00101       echo "Quel est le neuvi&egrave;me titre de film&nbsp;?" 
;
00102     finp
() ; finli() ;
00103     
00104     debutli
() ; p("texte") ;
00105       echo "En quelle ann&eacute;e est sorti le film "
.em("Blade Runner")."&nbsp;?" ;
00106     finp
() ; finli() ;
00107     
00108     debutli
() ; p("texte") ;
00109       echo "Quel en est le metteur en sc&egrave;ne&nbsp;?" 
;
00110     finp
() ; finli() ;
00111     
00112     debutli
() ; p("texte") ;
00113       echo "Combien y a-t-il de films&nbsp;?" 
;
00114     finp
() ; finli() ;
00115     
00116     debutli
() ; p("texte") ;
00117       echo "Quels &eacute;l&eacute;ments contiennent le texte \"Bruce\"&nbsp;?" 
;
00118     finp
() ; finli() ;
00119     
00120     finul
() ;
00121     
00122     p
("texte") ;
00123     echo b
("Remarque&nbsp;:") ;
00124     echo " il faut peut-&ecirc;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 &agrave; ex&eacute;cuter dans le shell de "
.b("XMLLINT")." pour r&eacute;pondre aux questions pos&eacute;es&nbsp;:" ;
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&eacute;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&nbsp;?" 
;
00157     finp
() ;
00158     
00159     pre_fichier
("vide.xsl","cadrebleu") ;
00160     
00161     p
("texte") ;
00162     echo "Quelle est, pour ces fichiers, la diff&eacute;rence avec la transformation minimaliste nomm&eacute;e "
.href("minimaliste.xsl")."&nbsp;?" ;
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 &eacute;l&eacute;ments et ignore les attributs. " 
;
00171     echo " Pour le fichier "
.href("eau.xml")." on r&eacute;cup&egrave;re donc trois lignes pratiquement vides (en fait on r&eacute;cup&egrave;re les espaces d'indentation et les sauts de ligne, ";
00172     echo " ce qui fait qu'&agrave; l'&eacute;cran on ne voit rien. " 
;
00173     echo " Pour le fichier "
.href("eau2.xml")." on r&eacute;cup&egrave;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&eacute;part et d'arriv&eacute;e sont affich&eacute;s." ;
00175     finp
() ;
00176     
00177     p
("texte") ;
00178     echo "Pour le dessin du renard, il y a beaucoup de lignes vides affich&eacute;es, ce qui fait qu'on risque de manquer le d&eacute;but de " 
;
00179     echo " l'affichage. Heureusement, "
.b("grep")." est notre ami&nbsp;! " ;
00180     echo " On r&eacute;cup&egrave;re donc comme seules lignes de texte le contenu des &eacute;l&eacute;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&eacute;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&egrave;gles par d&eacute;faut &agrave; partir de la racine." 
;
00192     finp
() ;
00193     
00194     finsolution
() ;
00195     
00196     finblockquote
() ;
00197     
00198     ## -------------------------------------------------------------------------------------------
00199     
00200     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; #  R&eacute;aliser une transformation minimale avec XSL
00201     
00202     ## -------------------------------------------------------------------------------------------
00203     
00204     blockquote
() ;
00205     
00206     p
("texte") ;
00207     echo " Que faut-il ajouter &agrave; la "
.b("transformation minimaliste")." d&eacute;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 "&nbsp;?" 
;
00211     finp
() ;
00212     
00213     solution
($numExo,$numSerie) ;
00214     
00215     p
("texte") ;
00216     echo " Une premi&egrave;re solution consiste &agrave; d&eacute;finir deux r&egrave;gles, l'une pour l'&eacute;l&eacute;ment "
.b("nom")." et l'autre pour l'&eacute;l&eacute;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")."&nbsp;:" ;
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&eacute;clencher les r&egrave;gles pour les &eacute;l&eacute;ments "
.b("noms").", " ;
00225     echo " soit le code du fichier "
.href("mineau3.xsl")."&nbsp;:" ;
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")."&nbsp;:" ;
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 &eacute;l&eacute;mentaire
00244     
00245     ## -------------------------------------------------------------------------------------------
00246     
00247     blockquote
() ;
00248     
00249     p
("texte") ;
00250     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").". " ;
00251     echo " Trouver une solution en ligne de commandes puis &agrave; l'aide d'une transformation 
$XSL." ;
00252     finp
() ;
00253     
00254     p
("texte") ;
00255     echo " Comment peut-on trouver la plus petite longueur de prot&eacute;ine et la plus grande via 
$XSL&nbsp;?" ;
00256     finp
() ;
00257     
00258     /*
00259     p("texte") ;
00260     echo " Ecrire ensuite un script $PHP qui trouve la plus petite longueur de prot&eacute;ine et la plus grande." ;
00261     finp() ;
00262     */
00263     
00264     solution
($numExo,$numSerie) ;
00265     
00266     p
("texte") ;
00267     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. " ;
00268     echo " L'attribut "
.b("length").", lui, peut se rep&eacute;rer gr&acirc;ce &agrave; l'expression ".b("&lt;fasta length=").". " ;
00269     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") ;
00270     echo " dans un sous-&eacute;l&eacute;ment "
.b("fasta")." sauf &agrave; valider le fichier pour la grammaire " ;
00271     echo href
("leadb_dtd.txt","leadb.dtd")." du T.P. numéro 1  " ;
00272     echo " (ou &agrave; 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 &agrave; utiliser&nbsp;:" 
;
00275     finp
() ;
00276     
00277     pre_fichier
("leadb_prot.txt","cadrebleu") ;
00278     
00279     
00280     p
("texte") ;
00281     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 " ;
00282     echo " la racine du document et d'utiliser la fonction 
$XPATH nomm&eacute;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")."&nbsp;:") ;
00288     finp
() ;
00289     
00290     pre_fichier
("proteines.xsl","cadrebleu") ;
00291     
00292     p
("texte") ;
00293     echo "Pour ex&eacute;cuter cette transformation, on peut utiliser "
.b("xsltproc")."&nbsp;:" ;
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")."&nbsp;:"  ;
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&ecirc;te du fichier $XML et faire ex&eacute;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&eacute;croissant et de garder la premi&egrave;re valeur, soit " 
;
00312     echo " le code 
$XSL suivant&nbsp;:" ;
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&egrave;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 &eacute;l&eacute;ment age lorsque la ddn est un &eacute;l&eacute;ment, un attribut age " 
;
00338     echo " si la ddn est un attribut. Effectuez ensuite les transformations inverses, &agrave; savoir mettre un attribut quand on " 
;
00339     echo " a un &eacute;l&eacute;ment et r&eacute;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&eacute;rie d'exercices sur la structuration des fichiers 
$XML qu'un attribut tout num&eacute;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 &eacute;l&eacute;ments " ;
00346     echo ghBleu
("MES")." (metteurs en sc&egrave;ne) et ".ghBleu("ARTISTES")." de ".href("films2.xml")." par l'ajout " ;
00347     echo " de "
.b("\"art\"").". Ainsi au lieu de ".ghRouge("&lt;MES idref=\"3\"&gt;&lt;/MES&gt;")." et ".ghRouge("&lt;ARTISTE id=\"51\"&gt;").", " ;
00348     echo " on devra avoir&nbsp;: "
.ghVert("&lt;MES idref=\"art3\"&gt;&lt;/MES&gt;")." et ".ghVert("&lt;ARTISTE id=\"art51\"&gt;")."." ;
00349     finp
() ;
00350     
00351     solution
($numExo,$numSerie) ;
00352     
00353     $sousExo 
;
00354     /*
00355     p("texte") ;
00356     echo "Exercice volontairement non corrig&eacute;." ;
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&ccedil;ons par ajouter un &eacute;l&eacute;ment age pour "
.href("pers01.xml")."&nbsp;:" ;
00373     finp
() ;
00374     
00375     pre_fichier
("aea1.xsl","cadre") ;
00376     
00377     p
("texte") ;
00378     echo "R&eacute;sultat&nbsp;:" 
;
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")."&nbsp;:" ;
00385     finp
() ;
00386     
00387     pre_fichier
("aea2.xsl","cadre") ;
00388     
00389     p
("texte") ;
00390     echo "R&eacute;sultat&nbsp;:" 
;
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&ecirc;me pricipe; ajoutons maintenant un attribut age pour "
.href("pers01.xml")."&nbsp;:" ;
00397     finp
() ;
00398     
00399     pre_fichier
("aea3.xsl","cadre") ;
00400     
00401     p
("texte") ;
00402     echo "R&eacute;sultat&nbsp;:" 
;
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 &eacute;l&eacute;ment age pour "
.href("pers02.xml")."&nbsp;:" ;
00409     finp
() ;
00410     
00411     pre_fichier
("aea4.xsl","cadre") ;
00412     
00413     p
("texte") ;
00414     echo "R&eacute;sultat&nbsp;:" 
;
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&eacute;e courante dans une variable ?
00421     
00422     $sousExo++ ; h3("$numExo".".".$sousExo." Ajout de la longueur dans les s&eacute;quences Fasta") ;
00423     
00424     p("texte") ;
00425     echo "Voici deux possibilit&eacute;s d'ajout, d'abord en &eacute;l&eacute;ment puis en attribut&nbsp;:" ;
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&nbsp;:") ;
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&egrave;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&nbsp;? Et d'artistes&nbsp;? Combien de r&eacute;f&eacute;rences pour combien de metteurs en sc&egrave;ne&nbsp;? " ;
00460     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 " ;
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&nbsp;:") ;
00466     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").". " ;
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 &agrave; l'aide de la fonction ".b("count()")." dans un attribut ".b("select")." d'un &eacute;l&eacute;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 &eacute;l&eacute;ments "
.ghBleu("FILM")." et " ;
00486     echo " "
.ghBleu("ARTISTE")." identifient de fa&ccedil;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&egrave;ne, il faut retenir les attributs "
.b("id")." de ".ghBleu("ARTISTE") ;
00491     echo " qui correspondent &agrave; 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&eacute; dans la solution des "
.b("xsl:text")." pour rendre les " ;
00494     echo " affichages plus lisibles (avec des indications de solution "
.ghRouge("XSL 2").")&nbsp;:" ;
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&eacute;sultat est un peu plus compliqu&eacute; 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&nbsp;:" 
;
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&eacute;es
00522     
00523     ## -------------------------------------------------------------------------------------------
00524     
00525     blockquote
() ;
00526     
00527     p
("texte") ;
00528     echo " On voudrait effectuer des calculs statistiques et tracer des graphiques pour &eacute;tudier statistiquement la longueur des prot&eacute;ines " 
;
00529     echo " du fichier "
.href("leadb880.xml").". Que peut-on calculer et tracer via $XSL&nbsp;?" ;
00530     finp
() ;
00531     
00532     p
("texte") ;
00533     echo " Est-ce qu'&eacute;crire un script 
$PHP est ici adapt&eacute;&nbsp;?" ;
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&ccedil;u pour transformer du texte, pas pour calculer. " ;
00540     echo 
$PHP n'est pas vraiment non plus pr&eacute;vu pour r&eacute;aliser des traitements statistiques. " ;
00541     echo " Par contre 
$XSL peut nous aider &agrave; 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&eacute;ine, sa classe et sa longueur. C'est ce que fait la transformation suivante&nbsp;:" 
;
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&eacute;rifier que les donn&eacute;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")."&nbsp;:" ;
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&eacute;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&eacute;sultats ci-dessous" 
;
00569     finp
() ;
00570     
00571     pre_fichier
("prot_export.sor","cadrebleu") ;
00572     
00573     p
("texte") ;
00574     echo "ainsi que le graphique suivant&nbsp;:" 
;
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&eacute;diger le commentaire statistique associ&eacute;." 
;
00584     echo " Le script 
$R utilise notre fonction ".b("decritQT()")." d&eacute;crite " ;
00585     echo href
("http://forge.info.univ-angers.fr/~gh/wstat/statghfns.php?lafns=decritQT&amp;montrer=montrer","ici").". " ;
00586     finp
() ;
00587     
00588     finsolution
() ;
00589     
00590     finblockquote
() ;
00591     
00592     ## -------------------------------------------------------------------------------------------
00593     
00594     h2
("Questions sans r&eacute;ponse affich&eacute;e dans le navigateur (donc venez en TP&nbsp;!)") ;
00595     
00596     blockquote
() ;
00597     ul
() ;
00598       debutli
() ; p("texte") ;
00599         echo "Pourquoi est-ce difficile de construire une grammaire 
$XSD fine et pr&eacute;cise pour les prot&eacute;ines LEA si on n'est pas biologiste&nbsp;?" ;
00600       finp
() ; finli() ;
00601     
00602       # il est difficile de d&eacute;finir une longueur minimale (et sans doute maximale) de prot&eacute;ine, de savoir &agrave; quoi correspond une classe,
00603       # savoir quelle expression r&eacute;guli&egrave;re correspond aux num&eacute;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")."&nbsp;?" ;
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-&eacute;l&eacute;ments\" ou des &eacute;l&eacute;ments  sans attributs&nbsp;?" 
;
00614        echo " Par exemple, pour "
.href("films2.xml")." combien manque-t-il de r&eacute;sum&eacute;s&nbsp;? et de dates de naissance&nbsp;?" ;
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 &eacute;l&eacute;ments
00619       # xpath count(//ARTISTE[./ANNEENAISS!=""])  # 77 &eacute;l&eacute;ments
00620     
00621       debutli
() ; p("texte") ;
00622        echo "Pourquoi faut-il compter les attributs avec "
.b("/@")." plut&ocirc;t qu'avec seulement ".b("@")."&nbsp;&nbsp;?" ;
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 gH    Retour à la page principale de   (gH)