Listing du fichier l2xml_6_tp2.php
00001 <?php
00002 # # (gH) -_- l2xml_6_tp2.php ; TimeStamp (unix) : 29 Juillet 2017 vers 21:47
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 $JavaScript = s_span("JavaScript" ,"grouge") ;
00016
00017 $numSerie = 2 ;
00018
00019 debutPage("XML en L2","strict","","l2xml.js") ;
00020 debutSection() ;
00021 h1("$XML en L2, université d'Angers ") ;
00022 h2(s_nbsp(4).href("../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00023 pvide() ;
00024 h2("T.P. numéro $numSerie","gbleu") ;
00025 pvide() ;
00026
00027 ###########################################################################################
00028
00029 $tableauDesRubriques = array() ;
00030 $idr = 0 ;
00031 $idr++; $tableauDesRubriques[$idr] = "Compter des éléments ou des attributs dans un document $XML" ;
00032 $idr++; $tableauDesRubriques[$idr] = "Expressions $XPATH " ;
00033 $idr++; $tableauDesRubriques[$idr] = "Une transformation $XSL élémentaire" ;
00034 $idr++; $tableauDesRubriques[$idr] = "Une deuxième transformation $XSL" ;
00035 $idr++; $tableauDesRubriques[$idr] = "Transformations $XSL avancées" ;
00036 $tdmCRLM = new tdm($tableauDesRubriques) ;
00037 $tdmCRLM->titre() ;
00038 $tdmCRLM->menu("oui","oui","nou") ;
00039
00040 pvide() ;
00041
00042 $numExo = 0 ;
00043 $numSerie = 2 ;
00044 direAfficherSolutions($numSerie) ;
00045
00046 ## -------------------------------------------------------------------------------------------
00047
00048 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # "Compter des éléments ou des attributs dans un document XML
00049
00050 ## -------------------------------------------------------------------------------------------
00051
00052 blockquote() ;
00053
00054 p("texte") ;
00055 echo " On s'intéresse au fichier ".href("leadb880.xml")." suivant :" ;
00056 finp() ;
00057
00058 p() ;
00059 textarea_fichier("leadb880","tajaunec",25,80,"leadb","leadb880.xml","") ;
00060 finp() ;
00061
00062 p("texte") ;
00063 echo "Après avoir décrit la structure du fichier, compter le nombre de lignes, le nombre de lignes vides, d'élements et d'attributs. " ;
00064 echo " On pourra utiliser tout outil logiciel. Comment trouver le nombre d'élements distincts ?" ;
00065 finp() ;
00066
00067 solution($numExo,$numSerie) ;
00068
00069 p("texte") ;
00070 echo "On peut facilement obtenir le nombre de lignes avec la commande système nommée ".b("wc").". " ;
00071 echo " Pour le nombre de lignes vides, chainer ".b("grep")." et ".b("wc")." est sans doute un bon choix. " ;
00072 echo " Pour le nombre d'élements distincts et la structure, ".b("xmlstarlet")." et ".b("trang")." sont des outils biens adaptés. " ;
00073 echo " Enfin, pour le nombre d'éléments en tout, on peut chainer ".b("xmlstarlet")." et ".b("wc")." alors que " ;
00074 echo " pour le nombre d'attributs en tout, il faut chainer ".b("xmlstarlet").", ".b("grep")." et ".b("wc")." alors que " ;
00075 echo " Voici le détail des commandes associées :" ;
00076 finp() ;
00077
00078 pre_fichier("leadb880_sh.txt","cadrejaune") ;
00079
00080 p("texte") ;
00081 echo " Une grammaire ".em("raisonnable")." pour ces données est fournie par le fichier suivant nommé ".href("leadb_dtd.txt","leadb.dtd")."." ;
00082 finp();
00083
00084 p() ;
00085 echo b("Grammaire leadb.dtd :") ;
00086 finp() ;
00087
00088 pre_fichier("leadb_dtd.txt","cadrebleu") ;
00089
00090 p("texte") ;
00091 echo " Avec la commande ".b("xmlstarlet el -u")." on dispose de la structure des données :" ;
00092 finp();
00093
00094 pre_fichier("leadb_stru.txt","cadrebleu") ;
00095
00096 finsolution() ;
00097
00098 finblockquote() ;
00099
00100 ## -------------------------------------------------------------------------------------------
00101
00102 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Expressions XSL
00103
00104 ## -------------------------------------------------------------------------------------------
00105
00106 blockquote() ;
00107
00108 p("texte") ;
00109 echo " On s'intéresse ici au document ".href("films2.xml")." qui contient des films et des artistes. En voici la grammaire $DTD :" ;
00110 finp() ;
00111
00112 pre_fichier("films2.dtd","cadrebleu") ;
00113
00114
00115 p("texte") ;
00116 echo "On fournit aussi la structure explicite du fichier (éléments seulement) obtenue à l'aide de la commande ".b("xmlstarlet el -u films2.xml")." :" ;
00117 finp() ;
00118
00119 pre_fichier("films2_stru.txt","cadrejaune") ;
00120
00121 p("texte") ;
00122 echo "A l'aide de ".b("xmllint")." en mode ".em("«shell»").", essayer de répondre aux questions suivantes :" ;
00123 finp() ;
00124
00125 ul() ;
00126
00127 # grep TITRE films2.xml | head -n 9 | tail -n 1 ; 95:<TITRE>Gladiator</TITRE>
00128
00129 debutli() ; p("texte") ;
00130 echo "Quels sont tous les titres de films ?" ;
00131 finp() ; finli() ;
00132
00133 debutli() ; p("texte") ;
00134 echo "Quel est le titre du neuvième film ?" ;
00135 finp() ; finli() ;
00136
00137 debutli() ; p("texte") ;
00138 echo "En quelle année est sorti le film ".em("Blade Runner")." ?" ;
00139 finp() ; finli() ;
00140
00141 debutli() ; p("texte") ;
00142 echo "Quel en est le metteur en scène ?" ;
00143 finp() ; finli() ;
00144
00145 finul() ;
00146
00147 solution($numExo,$numSerie) ;
00148
00149 p("texte") ;
00150 echo " Voici les instructions à exécuter pour répondre aux questions :" ;
00151 finp() ;
00152
00153 pre_fichier("films2_sh.txt","cadrebleu") ;
00154
00155 finsolution() ;
00156
00157 finblockquote() ;
00158
00159 ## -------------------------------------------------------------------------------------------
00160
00161 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Une transformation XSL élémentaire
00162
00163 ## -------------------------------------------------------------------------------------------
00164
00165 blockquote() ;
00166
00167 p("texte") ;
00168 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").". " ;
00169 echo " Trouver une solution en ligne de commandes puis à l'aide d'une transformation XSL." ;
00170 echo " Comment peut-on trouver la plus petite longueur de protéine et la plus grande ?" ;
00171 finp() ;
00172
00173 solution($numExo,$numSerie) ;
00174
00175 p("texte") ;
00176 echo " Une protéine correspond à un élément ".b("protein")." donc il suffit de compter les chaines ".b("<protein>")." pour les dénombrer. " ;
00177 echo " L'attribut ".b("length").", lui, peut se repérer grâce à l'expression ".b("<fasta length=").". " ;
00178 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") ;
00179 echo " dans un sous-élément ".b("fasta")." sauf à valider le fichier pour la grammaire de la question 1. " ;
00180 echo " Par contre rechercher toutes les expressions ".b("proteins/protein/fasta/@length")." dans la sortie de ".b("xmlstarlet el -a")." peut le prouver. ";
00181 echo " Voici les commandes à utiliser :" ;
00182 finp() ;
00183
00184 pre_fichier("leadb_prot.txt","cadrebleu") ;
00185
00186
00187 p("texte") ;
00188 echo "Pour effectuer une transformation $XSL qui réalise les mêmes comptages, il suffit de mettre une seule règle sur " ;
00189 echo " la racine du document et d'utiliser la fonction $XPATH nommée " ;
00190 echo href("http://forge.info.univ-angers.fr/~gh/selfhtml_fr/xml/representation/fonctionsxpath.htm#count","count()").". " ;
00191 finp() ;
00192
00193 p() ;
00194 echo b("Transformation ".href("proteines.xsl")." :") ;
00195 finp() ;
00196
00197 pre_fichier("proteines.xsl","cadrebleu") ;
00198
00199 p("texte") ;
00200 echo "Pour exécuter cette transformation, on peut utiliser ".b("xsltproc")." :" ;
00201 finp() ;
00202
00203 pre_fichier("proteines_sh1.txt","cadrebleu") ;
00204
00205 p("texte") ;
00206 echo "mais ce n'est pas le seul choix possible. Par exemple on peut utiliser ".b("xmlstarlet")." :" ;
00207 finp() ;
00208
00209 pre_fichier("proteines_sh2.txt","cadrebleu") ;
00210
00211
00212 p("texte") ;
00213 echo " On peut aussi mettre l'appel du fichier $XSL dans l'en-tête du fichier $XML et faire exécuter la transformation " ;
00214 echo " par le navigateur, comme ".href("leadb880tr.xml","ici").". " ;
00215 finp() ;
00216
00217 p("texte") ;
00218 echo "Pour trouver la longueur minimale et la longueur maximale ??? " ;
00219 finp() ;
00220
00221 finsolution() ;
00222
00223 finblockquote() ;
00224
00225 ## -------------------------------------------------------------------------------------------
00226
00227 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Une deuxième transformation XSL
00228
00229 ## -------------------------------------------------------------------------------------------
00230
00231 blockquote() ;
00232
00233 p("texte") ;
00234 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 ? " ;
00235 echo " On écrira une transformation $XSL qui affichera ces résultats en mode texte qu'on exécutera avec ".b("xmlstarlet")." avant " ;
00236 echo " de modifier le document pour avoir un rendu dans une page Web." ;
00237 finp() ;
00238
00239 solution($numExo,$numSerie) ;
00240
00241 p("texte") ;
00242 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").". " ;
00243 echo " Encore faut-il trouver les noeuds correspondants. Pour les films et les artistes, c'est assez simple car les éléments FILM et " ;
00244 echo " ARTISTE identifient de façon unique ce qu'on cherche donc il suffit de compter //FILM et //ARTISTE. " ;
00245 finp() ;
00246
00247 p("texte") ;
00248 echo "Pour trouver les metteurs en scène, il faut retenir les attributs id de ARTISTE qui correspondent à un attribut idref de MES, " ;
00249 echo " soit le filtre ARTISTE[@id=//MES/@idref]. Nous avons rajouté dans la solution des xsl:text pour rendre les " ;
00250 echo " affichages plus lisibles et nous avons mis le nom des metteurs en majuscules (avec des indications de solution $XSL 2) :" ;
00251 finp() ;
00252
00253 pre_fichier("nbfa1.xsl","cadrebleu") ;
00254 pre_fichier("nbfa1_sor.txt","cadrejaune") ;
00255
00256
00257 p("texte") ;
00258 echo "Produire une page Web résultat est un peu plus compliqué car ???" ;
00259 finp() ;
00260
00261 finsolution() ;
00262
00263 finblockquote() ;
00264
00265 ## -------------------------------------------------------------------------------------------
00266
00267 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Transformations XSL avancées
00268
00269 ## -------------------------------------------------------------------------------------------
00270
00271 blockquote() ;
00272
00273 p("texte") ;
00274 echo " On voudrait effectuer des calculs statistiques et tracer des graphiques pour étudier la longueur des protéines " ;
00275 echo " du fichier ".href("leadb880.xml").". Que peut-on calculer et tracer via $XSL ?" ;
00276 finp() ;
00277
00278 solution($numExo,$numSerie) ;
00279
00280 p("texte") ;
00281 echo " $XSL ne peut pas grand chose pour nous ici car $XSL est conçu pour transformer du texte, pas pour calculer. " ;
00282 echo " Par contre $XSL peut nous aider à produire un fichier $CSV utilisable par Excel, le logiciel R ou tout autre logiciel statistique. " ;
00283 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 :" ;
00284 finp() ;
00285
00286 pre_fichier("prot_export.xsl","cadrebleu") ;
00287
00288 p("texte") ;
00289 echo "On pourra vérifier que le fichier obtenu, soit ".href("prot_export.csv")." est utilisable par ".b("Microsoft Office Excel")." ou par ".b("Libre Office Calc")." :" ;
00290 finp() ;
00291
00292 pre_fichier("prot_export.csv","cadrejaune") ;
00293
00294 finsolution() ;
00295
00296 finblockquote() ;
00297
00298 ## -------------------------------------------------------------------------------------------
00299
00300 /*
00301
00302 h2("Questions sans réponse écrite (donc venez en TP !)") ;
00303
00304 blockquote() ;
00305 ul() ;
00306 debutli() ; p("texte") ;
00307 echo "Que faut-il changer dans les fichiers $XML et dans les grammaires $DTD et $XSD précédentes si on décide d'utiliser " ;
00308 echo " des accents, que ce soit avec un encodage " ;
00309 echo href("https://www.alsacreations.com/astuce/lire/83-codages-ascii-latin1-etc.html","latin1") ;
00310 echo " ou " ;
00311 echo href("https://www.w3.org/International/questions/qa-changing-encoding.fr.html","UTF")." ?" ;
00312 finp() ; finli() ;
00313
00314 debutli() ; p("texte") ;
00315 echo "Est-ce qu'un navigateur peut être ".b("validant")." c'est-à-dire refuser l'affichage d'un document $XML s'il n'est pas " ;
00316 echo " valide pour la grammaire indiquée en début de document ?" ;
00317 finp() ; finli() ;
00318
00319 debutli() ; p("texte") ;
00320 echo "" ;
00321 finp() ; finli() ;
00322
00323 debutli() ; p("texte") ;
00324 echo "" ;
00325 finp() ; finli() ;
00326 debutli() ; p("texte") ;
00327 echo "Après avoir vérifié qu'un document " ;
00328 echo s_span("DOCX","grouge") ;
00329 echo " ou " ;
00330 echo s_span("ODT","grouge") ;
00331 echo " est une archive (lisible par exemple par ".b("zip")."), chercher comment on peut lister tous les espaces de noms " ;
00332 echo " associés. Où trouve-t-on les grammaires pour ces documents ?" ;
00333 finp() ; finli() ;
00334
00335 finul() ;
00336 finblockquote() ;
00337
00338 */
00339
00340 ## -------------------------------------------------------------------------------------------
00341
00342 pvide() ;
00343
00344 ###########################################################################################
00345
00346 p() ;
00347 echo href("montresource.php?nomfic=l2xml_6_tp2.php","Code-source php de cette page","orange_stim nou")."." ;
00348 finp() ;
00349
00350 finSection() ;
00351 finPage() ;
00352 ?>
La coloration syntaxique est réalisée par un enrobage de la function php nommée highlight_file
mais si vous préférez, vous pouvez utiliser celle de SyntaxHighlighter ou même celle de geshi.
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)