Listing du fichier webrd03.php
00001 <?php
00002 error_reporting(E_ALL | E_NOTICE | E_STRICT) ;
00003 include("std.php") ;
00004 include("../xmlstd.php") ;
00005 include("webrd_inc.php") ;
00006
00007 # (gH) -_- webrd03.php ; TimeStamp (unix) : 08 Octobre 2012 vers 10:13
00008
00009 debutPageWrd(3) ;
00010
00011 $DTD = rouge("DTD") ;
00012 $XSD = rouge("XSD") ;
00013 $XML = rouge("XML") ;
00014 $XPATH = rouge("XPATH") ;
00015 $xml = rouge("xml") ;
00016 $dtd = rouge("dtd") ;
00017 $xsd = rouge("xsd") ;
00018 $xsl = rouge("xsl") ;
00019 $VCARD = rouge("VCARD") ;
00020 $XCARD = rouge("XCARD") ;
00021 $Fasta = rouge("Fasta") ;
00022 $XSL = rouge("XSL") ;
00023 $XSL2 = rouge("XSL2") ;
00024 $XSLT = rouge("XSLT") ;
00025 $HTML = bleu("HTML") ;
00026 $HTML5 = bleu("HTML5") ;
00027 $XHTML = rouge("XHTML") ;
00028
00029 ## -------------------------------------------------------------------------------------------
00030
00031 debutSection() ;
00032
00033 $tableauDesRubriques = array() ;
00034 $idr = 0 ;
00035 $idr++; $tableauDesRubriques[$idr] = "Expressions $XPATH élémentaires (films)" ;
00036 $idr++; $tableauDesRubriques[$idr] = "Expressions $XPATH avancées (films)" ;
00037 $idr++; $tableauDesRubriques[$idr] = "Expressions $XPATH élémentaires (bioinformatique)" ;
00038 $idr++; $tableauDesRubriques[$idr] = "Expressions $XPATH avancées (bioinformatique)" ;
00039 $idr++; $tableauDesRubriques[$idr] = "Compréhension de la transformation vide" ;
00040 $idr++; $tableauDesRubriques[$idr] = "Comptages avec $XSL (1)" ;
00041 $idr++; $tableauDesRubriques[$idr] = "Transformations entre éléments et attributs" ;
00042 $idr++; $tableauDesRubriques[$idr] = "Ajouts et modifications d'éléments ou d'attributs" ;
00043 $idr++; $tableauDesRubriques[$idr] = "Comptages avec $XSL (2)" ;
00044 $idr++; $tableauDesRubriques[$idr] = "Suppression de la mise en forme $XHTML" ;
00045 $idr++; $tableauDesRubriques[$idr] = "Tris avec $XSL " ;
00046 $idr++; $tableauDesRubriques[$idr] = "Fichiers inclus, sous-programmes et variables en $XSL " ;
00047 $idr++; $tableauDesRubriques[$idr] = "Une transformation à peine plus complexe " ;
00048 $idr++; $tableauDesRubriques[$idr] = "Questions diverses" ;
00049 $tdmCRLM = new tdm($tableauDesRubriques) ;
00050 $tdmCRLM->titre() ;
00051 $tdmCRLM->menu("oui","oui","nou") ;
00052
00053 pvide() ;
00054
00055 p() ;
00056 echo "Il est possible d'afficher toutes les solutions via ".href("webrd03.php?solutions=1","?solutions=1","bouton_fin jaune_pastel nou").". " ;
00057 finp() ;
00058
00059 finSection() ;
00060
00061 debutSection() ;
00062 $numExo = 0 ;
00063
00064 ## -------------------------------------------------------------------------------------------
00065
00066
00067 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Expressions XPATH élémentaires (films)
00068
00069 ## -------------------------------------------------------------------------------------------
00070
00071 blockquote() ;
00072
00073 p("texte") ;
00074 echo "Pour ce premier exercice, on utilisera le fichier " ;
00075 echo href("films2.xml")." qui est une version légèrement modifiée du fichier de " ;
00076 # href("http://www.lamsade.dauphine.fr/rigaux/web/","P. Rigaux") ;
00077 echo href("http://deptinfo.cnam.fr/~rigaux/","P. Rigaux") ;
00078 echo " à qui nous avons emprunté certains exercices. " ;
00079 finp() ;
00080
00081 p("texte") ;
00082 echo "Quelle est la différence entre ".b("xmlstarlet el")." et ".b("xmlstarlet el -u")." ? " ;
00083 finp() ;
00084
00085 p("texte") ;
00086 echo "Quelle est la différence entre ".vert("/*")." et ".vert("//*")." ? Utilisez ".b("xmllint")." en mode \"shell\" pour le montrer. " ;
00087 finp() ;
00088
00089 p("texte") ;
00090 echo "Donner le titre de tous les films puis le nom de tous les artistes (metteurs en scène et acteurs). " ;
00091 finp() ;
00092
00093 p("texte") ;
00094 echo "Que signifie ".vert("/FILMSETARTISTES/FILMS/FILM[@Annee=1990]/TITRE")." ? " ;
00095 echo " Trouvez une expression $XPATH plus concise qui fournit le même résultat." ;
00096 finp() ;
00097
00098 p("texte") ;
00099 echo "Donnez les titres des films avec Bruce Willis. " ;
00100 finp() ;
00101
00102 p("texte") ;
00103 echo "Dans ".em("Reservoir dogs").", quel personnage (élément INTITULE) joue Harvey Keitel ? " ;
00104 finp() ;
00105
00106 p("texte") ;
00107 echo "Quel metteur en scène correspond à la référence 3 ? " ;
00108 finp() ;
00109
00110 solution($numExo) ;
00111
00112 p("texte") ;
00113 echo "En mode el, ".b("xmlstarlet")." affiche le chemin absolu de tous les éléments. Avec l'option -u, chaque élément est affiché de façon unique :" ;
00114 finp() ;
00115
00116 pre_fichier("xmlstarlet_films2.txt","cadre") ;
00117
00118 p("texte") ;
00119 echo "La notation AFP ".s_span("/*","gvertf")." affiche les éléments directement sous la racine alors que ".s_span("//*","gvertf")." affiche tous les éléments :" ;
00120 finp() ;
00121
00122 pre_fichier("xmllint_films2.txt","cadre") ;
00123
00124 p("texte") ;
00125 echo "On trouvera dans ".href("xmllint_long.txt")." l'affichage complet (2732 lignes !) de la sortie de //*." ;
00126 finp() ;
00127
00128 p("texte") ;
00129 echo "Un titre de film correspond est le contenu texte d'un élément TITRE dont la localisation absolue est " ;
00130 echo " /FILMSETARTISTES/FILMS/FILM/TITRE mais on peut raccourcir en //TITRE car TITRE n'est pas utilisé ailleurs. " ;
00131 echo "De même, un nom d'artiste est /FILMSETARTISTES/ARTISTES/ARTISTE/ARTNOM qu'on peut raccourcir en //ARTNOM. " ;
00132 finp() ;
00133
00134 #p("texte") ;
00135 #echo "/FILMSETARTISTES/FILMS/FILM/TITRE désigne tous les éléments TITRE des films en chemin absolu depuis la racine. " ;
00136 #echo " Comme l'élément TITRE n'existe pas ailleurs, on peut simplifier cette expression en //TITRE." ;
00137 #finp() ;
00138
00139 p("texte") ;
00140 echo " L'expression /FILMSETARTISTES/FILMS/FILM[@Annee=1990]/TITRE filtre les films et ne retient que ceux qui vérifient @Annee=1990, c'est-à-dire " ;
00141 echo " qu'elle ne garde que les éléments FILM dont l'attribut Annee vaut 1990. Une fois sélectionnés, on affiche le titre de ces éléments. " ;
00142 echo " On peut donc utiliser plus simplement //FILM[@Annee=1990]/TITRE." ;
00143 finp() ;
00144
00145 pre_fichier("xmllint_films3.txt","cadre") ;
00146
00147 # montrer ls //TITRE|@Annee pour faire du "ou"
00148
00149 p("texte") ;
00150 echo "NOM et PRENOM sont des sous-éléments de ROLE, lui-même sous-élément de /FILMSETARTISTES/FILMS/FILM/ROLES. " ;
00151 echo " Comme Bruce est la valeur de l'élément PRENOM recherché et Willis celui de NOM, le filtre est : " ;
00152 echo ' [ROLES/ROLE/PRENOM="Bruce" and ROLES/ROLE/NOM="Willis"] '." et, pour obtenir le titre des films, on entoure ceci de FILM et TITRE, soit la " ;
00153 echo " solution ".'/FILMSETARTISTES/FILMS/FILM[ROLES/ROLE/PRENOM="Bruce" and ROLES/ROLE/NOM="Willis"]/TITRE'.". " ;
00154 echo " Avec des chemins relatifs, on peut se contenter de //FILM et de .//PRENOM :" ;
00155 finp() ;
00156
00157 pre_fichier("xmllint_films4.txt","cadre") ;
00158
00159 p("texte") ;
00160 echo "NOM, PRENOM et INTITULE sont des sous-éléments de ROLE alors que TITRE est un sous-élément de FILM. Il faut donc utiliser conjointement " ;
00161 echo " les deux filtres TITRE='Reservoir dogs' et PRENOM='Harvey' and NOM='Keitel'. " ;
00162 echo " Comme TITRE est plus haut que ROLE dans la hiérarchie, il faut commencer par filtrer sur TITRE :" ;
00163 finp() ;
00164
00165 pre_fichier("xmllint_films5.txt","cadre") ;
00166
00167 p("texte") ;
00168 echo "Pour le metteur en scène, la solution est ".b("//ARTISTE[@id=3]/ARTNOM").", volontairement non expliquée." ;
00169 finp() ;
00170
00171 finsolution() ;
00172
00173 finblockquote() ;
00174
00175 ## -------------------------------------------------------------------------------------------
00176
00177 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Expressions XPATH avancées (films)
00178
00179 ## -------------------------------------------------------------------------------------------
00180
00181 blockquote() ;
00182
00183 p("texte") ;
00184 echo "On utilise toujours ".href("films2.xml")." et ".b("xmllint")." en mode ".em("shell")." pour cet exercice. " ;
00185 echo "Donner la liste de toutes les références aux metteurs en scène " ;
00186 echo "puis donner la liste des noms des metteurs en scène référencés. " ;
00187 finp() ;
00188
00189 p("texte") ;
00190 echo "Peut-on facilement afficher le nom et les prénoms des metteurs en scène ? De façon lisible ? " ;
00191 echo "Enfin, donner la liste des noms des metteurs en scène distincts triée par ordre alphabétique." ;
00192 finp() ;
00193
00194 solution($numExo) ;
00195
00196 p("texte") ;
00197 echo "Les références de metteurs en scène sont les attributs ".vert("idref")." des éléments ".vert("MEF").", " ;
00198 echo " donc ".vert("//MES/@idref")." suffit pour obtenir toutes les références demandées. " ;
00199 echo " Les noms des metteurs en scène sont les sous-éléments ".vert("ARTNOM")." de ".vert("ARTISTE")." qu'il faut filtrer, " ;
00200 echo " donc on ne peut pas utiliser seulement ".vert("//ARTISTE/ARTNOM").". Le filtre doit faire correspondre " ;
00201 echo " l'attribut ".vert("id")." de ".vert("ARTISTE")." avec un attribut ".vert("idref")." quelconque de ".vert("MES").", soit : " ;
00202 echo vert("//ARTISTE[@id=//MES/@idref]/ARTNOM").". " ;
00203 echo "Ecrire ".vert("//ARTISTE[./@id=//MES/@idref]/ARTNOM")." donc avec un point devant @id est peut-être plus intéressant " ;
00204 echo " (mais plus long à écrire) pour rappeler qu'il s'agit de l'attribut de l'élément courant du filtre. " ;
00205 finp() ;
00206
00207 pre_fichier("xmllint_mes1.txt","cadre") ;
00208
00209 p("texte") ;
00210 echo "Dans la mesure où PRENOM et NOM sont les deux premiers sous-éléments de ROLE, on peut filtrer avec ".b("position()") ;
00211 echo " pour avoir les noms et prénoms, mais pas de façon lisible si on n'utilise que $XPATH. Le tri non plus ne peut pas se faire avec un simple ".b("ls")."." ;
00212 echo " Une transformation $XSL pour répondre à ces questions sera fournie à l'exercice 9." ;
00213 finp() ;
00214
00215 pre_fichier("xmllint_mes2.txt","cadre") ;
00216
00217 finsolution() ;
00218
00219 finblockquote() ;
00220
00221 ## -------------------------------------------------------------------------------------------
00222
00223 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Expressions XPATH élémentaires (bioinformatique)
00224
00225 ## -------------------------------------------------------------------------------------------
00226
00227 blockquote() ;
00228
00229 p("texte") ;
00230 echo "Pour cet exercice, on utilise les fichiers " ;
00231 echo href("Ncbi/424143.gbx.xml","424143.gbx.xml")." (NCBI) et " ;
00232 echo href("Uniprot/P14602.xml","P14602.xml")." (UNIPROT) " ;
00233 echo " qui correspondent à la protéine ".href(ncbi("424143"),"AAA18335") ;
00234 echo " vue à la série d'exercices numéro 1. " ;
00235 finp() ;
00236
00237 p("texte") ;
00238 echo "Sachant qu'au ".href(ncbi(),"NCBI")." les identifiants sont les contenus texte des éléments ".vert("GBSeqid").", lister tous les " ;
00239 echo " identifiants liés à la protéine. " ;
00240 echo " Comment n'afficher que l'identifiant ".b("GenInfo").", c'est-à-dire celui qui commence par ".vert("gi|")." ? " ;
00241 echo " On utilisera astucieusement ".b("xmlstarlet")." puis ".b("xmllint")." pour trouver les identifiants avant d'écrire une " ;
00242 echo " expression ".b("XPATH")." qui affiche les identifiants complets puis une transformation $XSL qui n'affiche que la " ;
00243 echo " valeur du ".b("gi").", soit ici bien sûr ".bleu("424143").". " ;
00244 finp() ;
00245
00246
00247
00248 solution($numExo) ;
00249
00250 p("texte") ;
00251 echo "Après avoir lu les sorties de la commande " ;
00252 echo href("AAA18335_elts.txt","xmlstarlet el -u AAA18335.xml","nou gnoir") ;
00253 echo ", on exécute la commande " ;
00254 echo href("AAA18335_GBSeqid.txt","xmlstarlet el -u AAA18335.xml | grep GBSeqid","gnoir nou") ;
00255 echo " qui montre que l'élément ".vert("GBSeqid")." apparait une seule fois dans " ;
00256 echo " la liste des éléments. Donc au lieu de ".vert("/GBSet/GBSeq/GBSeq_other-seqids/GBSeqid")." on peut se contenter de " ;
00257 echo vert("//GBSeqid")." pour accéder aux identifiants. Il existe une fonction ".bleu("starts-with")." en $XSL donc pour obtenir seulement le ".vert("gi")." " ;
00258 echo " on doit filtrer par ".vert("//GBSeqid[starts-with(.,'gi|')]")." ou par ".vert("//GBSeqid[starts-with(text(),'gi|')]").". " ;
00259 echo " On peut facilement vérifier ces expressions $XPATH avec xmllint en mode \"shell\" :" ;
00260 finp() ;
00261
00262 pre_fichier("AAA18335_xmllint.txt","cadre") ;
00263
00264 p("texte") ;
00265 echo "La première transformation $XSL, pour obtenir les identifiants complets, est ultra-classique : " ;
00266 echo " à partir de la racine, on sélectionne les ".vert("//GBSeqid")." comme règle de sélection " ;
00267 echo " et dans la gestion de ces éléments, on affiche ".bleu(".")." ou ".bleu("text()").", ce qui est la même chose ici. " ;
00268 echo " Enfin, on utilise ".bleu("xsl:text")." pour générer un saut de ligne " ;
00269 echo " soit la transformation ".href("ncbi_gi_1.xsl").". " ;
00270 echo " Pour la seconde transformation $XSL, où on veut juste le numéro d'identifiant, on utilise ".vert("//GBSeqid[starts-with(text(),'gi|')]") ;
00271 echo " comme filtre et pour afficher on " ;
00272 echo " profite de ".bleu("substring-after").", soit la transformation ".href("ncbi_gi_2.xsl").". " ;
00273 finp() ;
00274
00275 # mettre les sorties de xsltproc ncbi_gi_1.xsl Ncbi/424143.gbx.xml et idem pour ncbi_gi_2.xsl
00276
00277 p("texte") ;
00278 echo "Voici les deux transformations :" ;
00279 finp() ;
00280
00281 blockquote() ;
00282 $listeXsl1 = listeFichiers("ncbi_gi_",1,2,"xsl") ;
00283 $liste1 = "$listeXsl1" ;
00284 montreListe($liste1,"visuListe1",20) ;
00285 finblockquote() ;
00286
00287 p("texte") ;
00288 echo "Et leurs résultats :" ;
00289 finp() ;
00290
00291 pre_fichier("ncbi_res1.txt","cadre") ;
00292
00293 p("texte") ;
00294 echo b("Remarque : ") ;
00295 echo " on aurait pu utiliser " ;
00296 echo b("xsltproc ncbi_gi_1.xsl AAA18335.xml") ;
00297 echo " et " ;
00298 echo b("xsltproc ncbi_gi_2.xsl AAA18335.xml") ;
00299 echo " pour exécuter les transformations $XSL." ;
00300 finp() ;
00301
00302 p("texte") ;
00303 echo "Un simple ".b("grep")." de gi ou de info sur le fichier ".href("P14602.xml")." montre qu'il n'y a pas d'informations liées " ;
00304 echo " au gi dans le fichier Uniprot. $XPATH et $XSL ne peuvent donc rien pour nous ici !" ;
00305 finp() ;
00306
00307 finsolution() ;
00308
00309 finblockquote() ;
00310
00311 ## -------------------------------------------------------------------------------------------
00312
00313 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Expressions XPATH avancées (bioinformatique)
00314
00315 ## -------------------------------------------------------------------------------------------
00316
00317 blockquote() ; $sousExo = 0 ;
00318
00319 $sousExo++ ; h3("$numExo".".".$sousExo." Valeur de CDD") ;
00320
00321 p("texte") ;
00322 echo "Donner une transformation ".bleu("XSL")." qui permet d'obtenir la valeur du ".bleu("CDD") ;
00323 echo " pour une protéine du ".href(ncbi(),"NCBI")." obtenue par " ;
00324 echo href("http://www.ncbi.nlm.nih.gov/entrez/query/static/efetchseq_help.html","efetch") ;
00325 echo " sachant qu'il s'agit du contenu texte de ".vert("Object-id_id")." lorsque qu'on est dans un élément ".vert("Dbtag") ;
00326 echo " dont le sous-élément ".vert("Dbtag_db")." vaut 'CDD'." ;
00327 echo " On utilisera le fichier ".href("158513197.xml")." qui correspond à la protéine " ;
00328 echo href("http://www.ncbi.nlm.nih.gov/protein/158513917","A1VFJ3") ;
00329 echo " soit l'URL ".href("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=protein&rettype=gpamp;&retmode=xml&id=158513197","efetch...id=158513197").". " ;
00330 echo " On devra trouver ".href("http://www.ncbi.nlm.nih.gov/Structure/cdd/cddsrv.cgi?uid=111833","111833")." comme valeur de " ;
00331 echo href("http://www.ncbi.nlm.nih.gov/cdd","CDD")." (" ;
00332 echo href("http://en.wikipedia.org/wiki/Conserved_Domain_Database","Conserved Domain Database")."). " ;
00333 echo " On pourra consulter ".href("158513197_elts.txt")." qui est la sortie de ".b("xmlstarlet el -u 158513197.xml")." et " ;
00334 echo href("158513197_elts_Object-id_id.txt")." qui est la sortie de ".b("xmlstarlet el -u 158513197.xml | grep Object-id_id").". " ;
00335 finp() ;
00336
00337 p("texte") ;
00338 echo "On essaiera de fournir plusieurs solutions, dont une qui utilise ".vert("//Seq-feat_dbxref").", " ;
00339 echo " une qui utilise ".vert("//Object-id_id")." et une qui utilise ".vert("//Dbtag").". " ;
00340 finp() ;
00341
00342 $sousExo++ ; h3("$numExo".".".$sousExo." Valeur de PFAM") ;
00343
00344 p("texte") ;
00345 echo "Sur le site d'Uniprot, un fichier XML complet pour une protéine contient «quelque part» une indication de " ;
00346 echo href("http://xfam.org/","PFAM") ;
00347 echo " (" ;
00348 echo href("http://en.wikipedia.org/wiki/Pfam","Protein FAMilies") ;
00349 echo "). Rechercher cette valeur de PFAM pour la protéine " ;
00350 echo href("http://www.uniprot.org/uniprot/P14602","X68357") ;
00351 echo " soit le fichier ".href("P14602.xml")." dont les éléments sont listés dans ".href("P14602_elts.txt")." et les " ;
00352 echo " éléments avec attributs dans ".href("P14602_attrs.txt").". " ;
00353 echo " On essaiera aussi de fournir plusieurs solutions. " ;
00354 #echo " On devra trouver ".href("http://pfam.sanger.ac.uk/family/PF00011","PF00011").". " ;
00355 echo " On devra trouver ".href("http://pfam.xfam.org/family/PF00011").". " ;
00356 finp() ;
00357
00358
00359 solution($numExo) ; $sousExo = 0 ;
00360
00361 $sousExo++ ; h3("$numExo".".".$sousExo." Valeur de CDD") ;
00362
00363 p("texte") ;
00364 echo "Pour trouver le CDD, une première solution consiste à essayer de descendre dans l'arbre pour obtenir ".vert("Object-id_id")." mais " ;
00365 echo vert("//Object-id_id")." est une notation ambigue qui sélectionne aussi bien " ;
00366 echo vert("//Org-ref_db/Dbtag/Dbtag_tag/Object-id/Object-id_id") ;
00367 echo " que " ;
00368 echo vert("//Seq-feat_dbxref/Dbtag/Dbtag_tag/Object-id/Object-id_id").". " ;
00369 echo " Cette dernière expression fournit exactement ce que l'on cherche. " ;
00370 echo " La transformation $XSL qui s'en déduit est classique : sélection de l'élément puis affichage du texte, soit " ;
00371 echo href("ncbi_cdd1.xsl").". " ;
00372 finp() ;
00373
00374 p("texte") ;
00375 echo "Une deuxième solution consiste à filtrer ".vert("Object-id_id")." pour indiquer la base de données qui correspond à ".b("CDD").". " ;
00376 echo "L'information de base de données est trois niveaux plus haut, donc on peut utiliser " ;
00377 echo vert("//Object-id_id[../../../Dbtag_db='CDD']")." pour l'obtenir." ;
00378 echo " Cette solution " ;
00379 echo href("ncbi_cdd2.xsl") ;
00380 echo " est sans doute celle qui correspond le mieux à l'énoncé. " ;
00381 finp() ;
00382
00383 p("texte") ;
00384 echo "Une troisième solution est de filtrer ".vert("Dbtag")." puis de descendre jusqu'à ".vert("Object-id_id").", soit : " ;
00385 echo vert("//Dbtag[Dbtag_db='CDD']/Dbtag_tag/Object-id/Object-id_id")." : " ;
00386 echo href("ncbi_cdd3.xsl").". " ;
00387 finp() ;
00388
00389 p("texte") ;
00390 echo "Une quatrième solution est de passer en revue dans une boucle tous les enfants de ".vert("Dbtag").". " ;
00391 echo " Lorsqu'on trouve un élément dont le nom est ".vert("Dbtag_db")." et dont le texte est ".b("'CDD'").", on remonte d'un niveau et on " ;
00392 echo " affiche le contenu de ".vert("Dbtag_tag/Object-id/Object-id_id")." soit la transformation " ;
00393 echo href("ncbi_cdd4.xsl").". " ;
00394 finp() ;
00395
00396 pre_fichier("ncbi_cdd.txt","cadre") ;
00397
00398 p("texte") ;
00399 echo "Voici les quatre transformations :" ;
00400 finp() ;
00401
00402 blockquote() ;
00403 $listeXslC = listeFichiers("ncbi_cdd",1,4,"xsl") ;
00404 $listeC = "$listeXslC" ;
00405 montreListe($listeC,"visuListeC",30) ;
00406 finblockquote() ;
00407
00408 # //dbReference[@type='Pfam']/@id si on enlève ce qui suit <uniprot "
00409
00410 $sousExo++ ; h3("$numExo".".".$sousExo." Valeur de PFAM") ;
00411
00412 p("texte") ;
00413 echo "Exercice volontairement corrigé de façon succinte :" ;
00414 finp() ;
00415
00416 pre_fichier("uniprot_pfam2.txt","cadre") ;
00417
00418 finsolution() ;
00419
00420 finblockquote() ;
00421
00422 ## -------------------------------------------------------------------------------------------
00423
00424 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Compréhension de la transformation vide
00425
00426 ## -------------------------------------------------------------------------------------------
00427
00428 blockquote() ;
00429
00430 p("texte") ;
00431 echo "Expliquer ce que fait la transformation vide sur les fichiers " ;
00432 echo href("serv00.xml").", ".href("serv01.xml")."... ".href("serv05.xml")." de la série 1 d'exercices, puis " ;
00433 echo " pour les fichiers ".href("pers01.xml").", ".href("pers02.xml")."... ".href("pers04.xml")." de la série 1 d'exercices " ;
00434 echo " et enfin pour les fichiers ".href("fasta01.xml")." à ".href("fasta05.xml").". " ;
00435 finp() ;
00436
00437 solution($numExo) ;
00438
00439 p("texte") ;
00440 echo "La ".b("transformation vide")." garde le contenu texte des éléments (et les espaces et les retours-charriots) mais pas les attributs :" ;
00441 finp() ;
00442
00443 blockquote() ;
00444
00445 $listeXml2 = listeFichiers("serv0",0,5,"xml") ;
00446 $listeXsl2 = listeFichiers("serv_0",0,5,"txt") ;
00447 $liste2 = "$listeXml2 <p> $listeXsl2" ;
00448 montreListe($liste2,"visuListe2",20) ;
00449
00450
00451 $listeXml3 = listeFichiers("pers0",1,4,"xml") ;
00452 $listeXsl3 = listeFichiers("pers_0",1,4,"txt") ;
00453 $liste3 = "$listeXml3 <p> $listeXsl3" ;
00454 montreListe($liste3,"visuListe3",20) ;
00455
00456 $listeXml4 = listeFichiers("fasta0",1,5,"xml") ;
00457 $listeXsl4 = listeFichiers("fasta_0",1,5,"txt") ;
00458 $liste4 = "$listeXml4 <p> $listeXsl4" ;
00459 montreListe($liste4,"visuListe4",20) ;
00460
00461 finblockquote() ;
00462
00463 finsolution() ;
00464
00465 finblockquote() ;
00466
00467 ## -------------------------------------------------------------------------------------------
00468
00469 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Comptages avec XSL (1)
00470
00471 ## -------------------------------------------------------------------------------------------
00472
00473 blockquote() ;
00474
00475 p("texte") ;
00476 echo "Dans ".href("films2.xml").", combien y a-t-il de films ? " ;
00477 echo " Et d'artistes ? Et de metteurs en scène ? " ; ## D'acteurs non metteurs en scène ?
00478 finp() ;
00479
00480 p("texte") ;
00481 echo " On écrira une transformation $XSL qui affichera ces résultats en mode texte et qu'on exécutera avec ".b("xmlstarlet").". " ;
00482 finp() ;
00483
00484 solution($numExo) ;
00485
00486 p("texte") ;
00487 echo "Compter avec $XSL se fait à l'aide de la fonction ".b("count()")." dans un attribut select d'un élément xsl:value-of. " ;
00488 echo " Encore faut-il trouver les noeuds correspondants. Pour les films et les artistes, c'est assez simple car les éléments FILM et " ;
00489 echo " ARTISTE identifient de façon unique ce qu'on cherche donc il suffit de compter //FILM et //ARTISTE. " ;
00490 finp() ;
00491
00492 p("texte") ;
00493 echo "Pour trouver les metteurs en scène, il faut retenir les attributs id de ARTISTE qui correspondent à un attribut idref de MES, " ;
00494 echo " soit le filtre (déjà vu) ARTISTE[@id=//MES/@idref]. Nous avons rajouté dans la solution des xsl:text pour rendre les " ;
00495 echo " affichages plus lisibles et nous avons mis le nom des metteurs en majuscules (avec des indications de solution $XSL 2) :" ;
00496 finp() ;
00497
00498 pre_fichier("nbfilms0.xsl","cadrebleu") ;
00499 pre_fichier("nbfilms0_sor.txt","cadrejaune") ;
00500
00501 finsolution() ;
00502
00503 finblockquote() ;
00504
00505 ## -------------------------------------------------------------------------------------------
00506
00507 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Transformations éléments de et vers attributs
00508
00509 ## -------------------------------------------------------------------------------------------
00510
00511 blockquote() ;
00512
00513 p("texte") ;
00514 echo "Ecrire la transformation ".b("s2vers3.xsl")." qui transforme ".href("serv02.xml")." en ".href("serv03.xml") ;
00515 echo ", c'est-à-dire qui transforme les éléments en attributs. Ecrire ensuite la " ;
00516 echo " transformation inverse ".b("s3vers2.xsl")." qui transforme ".href("serv03.xml")." en ".href("serv02.xml") ;
00517 echo ", c'est-à-dire qui transforme les attributs en éléments. " ;
00518 finp() ;
00519
00520 solution($numExo) ;
00521
00522 p("texte") ;
00523 echo "Avec ".b("xsl:attribute")." on crée un attribut et avec ".b("xsl:element")." on crée un élément. Donc il suffit de se positionner " ;
00524 echo " sur chacun des services et le tour est joué ! On remarquera l'utilisation de ".b("normalize-space")." pour ".href("s2vers3.xsl").". " ;
00525 finp() ;
00526
00527 pre_fichier("s2vers3.xsl","cadre") ;
00528 pre_fichier("s2vers3.txt","cadrejaune") ;
00529
00530 pre_fichier("s3vers2.xsl","cadre") ;
00531 pre_fichier("s3vers2.txt","cadrejaune") ;
00532
00533 finsolution() ;
00534
00535 finblockquote() ;
00536
00537 ## -------------------------------------------------------------------------------------------
00538
00539 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Ajouts et modifications d'éléments ou d'attributs
00540
00541 ## -------------------------------------------------------------------------------------------
00542
00543 blockquote() ;
00544
00545 p("texte") ;
00546 echo "Ecrire des transformations ".b("ajouteAge")." qui calculent et ajoutent l'age aux personnes dont " ;
00547 echo " on connait la date de naissance. On ajoutera un élément age lorsque la ddn est un élément, un attribut age " ;
00548 echo " si la ddn est un attribut. Effectuez ensuite les transformations inverses, à savoir mettre un attribut quand on " ;
00549 echo " a un élément et réciproquement. " ;
00550 finp() ;
00551
00552 p("texte") ;
00553 echo "Effectuez des transformations similaires pour ajouter la longueur d'une séquence Fasta pour les fichiers bioinformatiques." ;
00554 finp() ;
00555
00556 p("texte") ;
00557 echo "Nous avions vu dans la série 2 d'exercices qu'un attribut tout numérique ne pouvait pas servir d'".b("ID")." et donc d'".b("IDREF")." non plus. " ;
00558 echo " Ecrire une transformation ".b("ajouteArt")." qui modifie les attributs ".bleu("id")." et ".bleu("idref")." des éléments " ;
00559 echo bleu("MES")." (metteurs en scène) et ".bleu("ARTISTES")." de ".href("films2.xml")." par l'ajout " ;
00560 echo " de ".b("\"art\"").". Ainsi au lieu de ".rouge("<MES idref=\"3\"></MES>")." et ".rouge("<ARTISTE id=\"51\">").", " ;
00561 echo " on devra avoir : ".vert("<MES idref=\"art3\"></MES>")." et ".vert("<ARTISTE id=\"art51\">")."." ;
00562 finp() ;
00563
00564 solution($numExo) ;
00565
00566 $sousExo = 0 ;
00567 /*
00568 p("texte") ;
00569 echo "Exercice volontairement non corrigé." ;
00570 finp() ;
00571 */
00572
00573 $sousExo++ ; h3("$numExo".".".$sousExo." Ajout de l'age") ;
00574
00575 p("texte") ;
00576 echo "Commençons par ajouter un élément age pour ".href("pers01.xml")." :" ;
00577 finp() ;
00578
00579 pre_fichier("aea1.xsl","cadre") ;
00580
00581 p("texte") ;
00582 echo "Résultat :" ;
00583 finp() ;
00584
00585 pre_fichier("aea1.res","cadrebleu",0,1) ; # produit par exsl pers01.xml aea1.xsl > aea1.res
00586
00587 p("texte") ;
00588 echo "Ajoutons maintenant un attribut age pour ".href("pers02.xml")." :" ;
00589 finp() ;
00590
00591 pre_fichier("aea2.xsl","cadre") ;
00592
00593 p("texte") ;
00594 echo "Résultat :" ;
00595 finp() ;
00596
00597 pre_fichier("aea2.res","cadrebleu",0,1) ; # produit par exsl pers02.xml aea2.xsl > aea2.res
00598
00599 p("texte") ;
00600 echo "Sur le même pricipe; ajoutons maintenant un attribut age pour ".href("pers01.xml")." :" ;
00601 finp() ;
00602
00603 pre_fichier("aea3.xsl","cadre") ;
00604
00605 p("texte") ;
00606 echo "Résultat :" ;
00607 finp() ;
00608
00609 pre_fichier("aea3.res","cadrebleu",0,1) ; # produit par exsl pers01.xml aea3.xsl > aea3.res
00610
00611 p("texte") ;
00612 echo "Et enfin voici un élément age pour ".href("pers02.xml")." :" ;
00613 finp() ;
00614
00615 pre_fichier("aea4.xsl","cadre") ;
00616
00617 p("texte") ;
00618 echo "Résultat :" ;
00619 finp() ;
00620
00621 pre_fichier("aea4.res","cadrebleu",0,1) ; # produit par exsl pers02.xml aea4.xsl > aea4.res
00622
00623 # une pI (processing instruction pour avoir l'année courante dans une variable ?
00624
00625 $sousExo++ ; h3("$numExo".".".$sousExo." Ajout de la longueur dans les séquences Fasta") ;
00626
00627 p("texte") ;
00628 echo "Voici deux possibilités d'ajout, d'abord en élément puis en attribut :" ;
00629 finp() ;
00630
00631 pre_fichier("eltaddlng.xsl","cadrebleu",0,1) ;
00632 pre_fichier("attaddlng.xsl","cadrejaune",0,1) ;
00633
00634 $sousExo++ ; h3("$numExo".".".$sousExo." Ajout de \"art\" pour les id et idrefs") ;
00635
00636 pre_fichier("ajoutart.xsl","cadre") ;
00637
00638 # plus robuste si {name}="MES" que position 4 ???
00639 finsolution() ;
00640
00641 finblockquote() ;
00642
00643 ## -------------------------------------------------------------------------------------------
00644
00645 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Comptages avec XSL (2)
00646
00647 ## -------------------------------------------------------------------------------------------
00648
00649 blockquote() ;
00650
00651 p("texte") ;
00652 echo "On reprend ici l'exercice 6 avec les comptages de personnes dans les films en $XSL." ;
00653 echo " Dans ".href("films2.xml").", combien y a-t-il de films ? " ;
00654 echo " Et d'artistes ? Et de metteurs en scène ? " ; ## D'acteurs non metteurs en scène ?
00655 finp() ;
00656
00657 p("texte") ;
00658 echo " On écrira une transformation $XSL qui affichera ces résultats en mode texte et qu'on exécutera avec ".b("xmlstarlet").". " ;
00659 echo " On affichera également la liste des seuls metteurs en scène avec nom et prénom, le nom étant écrit en majuscules. " ;
00660 finp() ;
00661
00662 p("texte") ;
00663 echo " Que faut-il modifier pour trier la liste des metteurs en scène par ordre alphabétique ?" ;
00664 finp() ;
00665
00666 solution($numExo) ;
00667
00668 p("texte") ;
00669 echo "Pour avoir une liste triée, il suffit d'utiliser ".b("xsl:sort")." et de préciser sur quel élément faire porter le tri, même si " ;
00670 echo " ici on pourra de dispenser du ".b("select")." puisque ".b("ARTNOM")." est le premier élément d'".b("ARTISTE").". La solution est donc " ;
00671 echo href("nbfilms2.xsl","ici")." et ci-dessous :" ;
00672 finp() ;
00673
00674 pre_fichier("nbfilms2.xsl","cadrebleu") ;
00675 pre_fichier("nbfilms_sor.txt","cadrejaune") ;
00676
00677 finsolution() ;
00678
00679 finblockquote() ;
00680
00681 /*
00682 ## -------------------------------------------------------------------------------------------
00683
00684 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Transformations bioinformatiques
00685
00686 ## -------------------------------------------------------------------------------------------
00687
00688 blockquote() ;
00689
00690 p("texte") ;
00691 echo "XML" ;
00692 finp() ;
00693
00694 solution($numExo) ;
00695
00696 p("texte") ;
00697 echo "XML" ;
00698 finp() ;
00699
00700 finsolution() ;
00701
00702 finblockquote() ;
00703 */
00704
00705 ## -------------------------------------------------------------------------------------------
00706
00707 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Suppression de la mise en forme XHTML
00708
00709 ## -------------------------------------------------------------------------------------------
00710
00711 blockquote() ;
00712
00713 p("texte") ;
00714 echo "Expliquez ce que font chacune des transformations suivantes et ce qu'on obtient si on les applique au fichier " ;
00715 echo href("serv00.xml")." : " ;
00716 finp() ;
00717
00718 montre(1,5,"services","visuXsl","xsl") ;
00719
00720
00721 p("texte") ;
00722 echo "Ecrire une transformation ".b("nohtml.xsl")." qui ne garde que les contenus-textes de la partie <".b("body")."> " ;
00723 echo " d'une page $XHTML valide. On pourra utiliser ".href("page.html")." qui devra être transformé en ".href("page.txt").". " ;
00724 finp() ;
00725
00726 solution($numExo) ;
00727
00728 p("texte") ;
00729 echo "Solution volontairement non communiquée." ;
00730 finp() ;
00731
00732 finsolution() ;
00733
00734 finblockquote() ;
00735
00736 ## -------------------------------------------------------------------------------------------
00737
00738 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Tris avec XSL
00739
00740 ## -------------------------------------------------------------------------------------------
00741
00742 blockquote() ;
00743
00744 p("texte") ;
00745 echo "Afficher tous les films de ".href("films2.xml")." par ordre alphabétique dans un fichier texte. " ;
00746 finp() ;
00747
00748 p("texte") ;
00749 echo "Afficher tous les films et leur date de sortie de ".href("films2.xml")." dans une page $XHTML \"presque\" valide. " ;
00750 echo " On triera par date de sortie décroissante et, en cas d'ex-aequo, par ordre alphabétique, comme " ;
00751 echo " par exemple pour l'année 1990." ;
00752 finp() ;
00753
00754 p("texte") ;
00755 echo "Afficher tous les artistes de ".href("films2.xml")." qui ont joué dans au moins un film " ;
00756 echo " dans une page $XHTML valide au sens ".b("1.0 strict")." avec un encodage ISO-8859-1." ;
00757 echo " On fournira leur nom, leur prénom, le nombre de films où ils ont joué et on triera par nom puis par prénom en cas d'égalité. " ;
00758 echo " Rappel : certains artistes sont des metteurs en scène qui ne jouent pas tous dans des films." ;
00759 finp() ;
00760
00761 solution($numExo) ;
00762
00763 p("texte") ;
00764 echo "Le premier tri est très facile à réaliser car il n'y a qu'une seule clé de tri. " ;
00765 echo " Il suffit donc d'ajouter ".b("xsl:sort")." dans la règle de sélection des ".b("//TITRE") ;
00766 echo " pour obtenir la liste demandée, soit ".href("films_lst_1.xsl").". " ;
00767 finp() ;
00768
00769 p("texte") ;
00770 echo "Pour la deuxième transformation, il y a deux problèmes distincts : le tri multicritères et " ;
00771 echo " la production d'un tableau ".bleu("XHTML").". Pour trier selon l'année puis selon le texte du titre, " ;
00772 echo " il suffit donc d'enchainer les ".b("xsl:sort")." (il ne faut pas les emboiter), " ;
00773 echo " soit ".href("films_lst_2a.xsl").". " ;
00774 echo " Pour la partie partie ".bleu("XHTML").", on pourrait penser écrire un sous-programme pour la partie entre " ;
00775 echo vert("<html>")." et ".vert("<body>")." nommé ".b("debutPage")." puis un sous-programme pour " ;
00776 echo vert("</body>")." et ".vert("</html;")." nommé ".b("finPage").", soit ".href("films_lst_2b1.xsl") ;
00777 echo " mais malheureusement, cela n'est pas possible car il faudrait laisser ".vert("<body>")." ouvert. " ;
00778 echo " Il faut donc se rabattre sur une solution plus classique, moins modulaire avec ";
00779 echo href("films_lst_2b2.xsl") ;
00780 echo " qui produit ".href("films2b2.html") ;
00781 finp() ;
00782
00783 p("texte") ;
00784 echo "La troisième transformation ajoute le problème de la validité de la page et celui du nombre de films joués par acteur. " ;
00785 echo " Attention : tous les artistes ne sont pas des acteurs, car certains sont des metteurs en scène. " ;
00786 echo " Si essaie de compter le nombre de films par artiste, on doit, à partir du nom de l'artiste, trouver son prénom, ce qui " ;
00787 echo " est facile puis qu'il suffit de remonter d'un cran dans l'arbre puis d'utiliser l'élément ARTPRENOM. Par contre, " ;
00788 echo " pour compter, il faut se servir du noeud courant avec ARTNOM et ARTPRENOM et comparer à tous les NOM et PRENOM des films. " ;
00789 echo " Une solution correspondante est dans ".href("films_lst_3a.xsl").". " ;
00790 echo " Le résultat de la transformation est dans ".href("films_lst_3a.txt").". " ;
00791 finp() ;
00792
00793 p("texte") ;
00794 echo "Pour ne prendre en compte que les artistes qui ont joué dans au moins un film, on peut se " ;
00795 echo " contenter de filtrer l'affichage précédent suivant que le comptage avec ".b("count()")." renvoie " ;
00796 echo " un nombre supérieur à 0 ou pas, " ;
00797 echo " soit ".href("films_lst_3b.xsl").". " ;
00798 echo " Le résultat de cette transformation est dans ".href("films_lst_3b.txt").". " ;
00799 finp() ;
00800
00801 p("texte") ;
00802 echo "Il reste maintenant à fournir une page $XHTML valide au sens ".b("1.0 strict")." en ISO-8859-1." ;
00803 echo " Le plus simple est sans doute de produire les élements $XHTML via ".b("xsl:value-of") ;
00804 echo " avec l'attribut ".b("disable-output-escaping")." mis à ".bleu("yes").", " ;
00805 echo " soit ".href("films_lst_3c.xsl").". " ;
00806 echo " Le résultat de cette transformation est dans ".href("films_lst_3c.html").". " ;
00807 finp() ;
00808
00809 p("texte") ;
00810 echo "Après réflexion, il n'y a pas besoin de ".b("disable-output-escaping='yes'") ;
00811 echo " pour les éléments complets, et on peut donc simplifier la transformation en ".href("films_lst_3d.xsl")." où " ;
00812 echo " toute la partie head est écrite telle quelle. " ;
00813 echo " Le résultat de cette transformation est dans ".href("films_lst_3d.html").". " ;
00814 finp() ;
00815
00816 blockquote() ;
00817 $listeXsl5 = "films_lst_1.xsl films_lst_2a.xsl films_lst_2b.xsl films_lst_3a.xsl films_lst_3b.xsl films_lst_3c.xsl films_lst_3d.xsl" ;
00818 $liste5 = "$listeXsl5" ;
00819 montreListe($liste5,"visuListe5",20) ;
00820 finblockquote() ;
00821
00822 finsolution() ;
00823
00824 finblockquote() ;
00825
00826 ## -------------------------------------------------------------------------------------------
00827
00828 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Fichiers inclus, sous-programmes et variables en XSL
00829
00830 ## -------------------------------------------------------------------------------------------
00831
00832 blockquote() ;
00833
00834 p("texte") ;
00835 echo "Reprendre la transformation ".href("films_lst_3d.xsl")." : on mettra ".b("sdl").", ".b("debutPage")." et ".b("finPage")." dans " ;
00836 echo " le fichier ".b("stdWeb.xsl").". Le titre de la page, rapellé dans un ".b("<h1>")." en haut de page sera bien sûr passé " ;
00837 echo " en paramètre. " ;
00838 finp() ;
00839
00840 p("texte") ;
00841 echo "Ecrire une transformation $XSL qui produit un tableau $XHTML des films (en ignorant les roles et le résumé ; on mettra le titre en dernière colonne) " ;
00842 echo " et un tableau $XHTML des artistes, avec une table des matières en haut de page, comme dans la page ".href("fa.html").". ";
00843 echo " Pour que ce soit plus facile à lire, on définira les fichiers ".b("tabFilms.xsl")." et ".b("tabArtistes.xsl").". " ;
00844 echo " On modifiera ".href("stdWeb.xsl")." pour que la redite du titre en ".b("<h1>")." en haut de page soit facultative." ;
00845 finp() ;
00846
00847 p("texte") ;
00848 echo b("Attention :")." certains films n'ont pas de GENRE et certains artistes n'ont pas de ANNEENAISS." ;
00849 finp() ;
00850
00851 solution($numExo) ;
00852
00853 p("texte") ;
00854 echo "Pour inclure un fichier $XSL, on a le choix entre ".b("xsl:import")." et ".b("xsl:include").". " ;
00855 echo " Les parties à inclure sont des sous-progammes \"propres\", donc on utilise ".b("xsl:import")." qui doit " ;
00856 echo " être le premier enfant de ".b("xsl:stylesheet").". " ;
00857 echo " Les paramètres sont définis via ".b("xsl:param").", ils sont déclarés par ".b("xsl:with-param")." et on les utilise " ;
00858 echo " à l'aide de la notation ".b("\$")." un peu comme en PHP. " ;
00859 echo " Au final, le fichier à inclure est ".href("stdWeb.xsl").", la transformation est ".href("films_lst_4.xsl")." et son résultat ".href("films_lst_4.html")."." ;
00860 finp() ;
00861
00862 p("texte") ;
00863 echo "Pour produire deux tableaux, on définit deux \"templates\" qui chacune appellent ".b("debutTableau")." et ".b("finTableau").". " ;
00864 echo "Voici, à titre indicatif, via le fichier ".href("stdWeb2.xsl") ;
00865 echo " comment on peut paramétrer ces «sous-programmes» y compris la redite éventuelle de en ".b("<h1>")." en haut de page dans ".b("debutPage").". " ;
00866 finp() ;
00867
00868 pre_fichier("stdWeb2.xsl","cadre") ;
00869
00870 p("texte") ;
00871 echo "La programmation ".b("XSL")." est donc verbeuse, à défaut d'être difficile. Voici le «programme principal» qui est dans ".href("films_lst_5.xsl")." :" ;
00872 finp() ;
00873
00874 pre_fichier("films_lst_5.xsl","cadrebleu") ;
00875
00876 p("texte") ;
00877 echo "Et l'un des deux «sous-programmes» ".b("tableauDesFilms")." qui est dans ".href("tabFilms.xsl")." :" ;
00878 finp() ;
00879
00880 pre_fichier("tabFilms.xsl","cadrejaune") ;
00881
00882 p("texte") ;
00883 echo "Pour que la solution soit complète, il reste à consulter les deux autres fichiers importés, à savoir " ;
00884 echo href("presentation.xsl")." et " ;
00885 echo href("tabArtistes.xsl").". " ;
00886 echo " Au bout du compte, l'application de ".href("films_lst_5.xsl") ;
00887 echo " à ".href("films2.xml")." aboutit donc à ".href("fa.html").", soit, sur le serveur, " ;
00888 echo href("../internet/Xmpxml/perlXsl.php?xml=films2.xml&xsl=films_lst_5.xsl","films5xsl")." (sans images ni style, volontairement), " ;
00889 echo " ou encore : ".href("xslt.php?xml=films2.xml&xsl=films_lst_5.xsl","films2+tableaux").". " ;
00890 finp() ;
00891
00892 blockquote() ;
00893 $listeXsl6 = "stdWeb.xsl films_lst_4.xsl films_lst_5.xsl stdWeb2.xsl presentation.xsl tabFilms.xsl tabArtistes.xsl" ;
00894 $liste6 = "$listeXsl6" ;
00895 montreListe($liste6,"visuListe6",20) ;
00896 finblockquote() ;
00897
00898 finsolution() ;
00899
00900 finblockquote() ;
00901
00902 ## -------------------------------------------------------------------------------------------
00903
00904 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Deux transformations à peine plus complexes
00905
00906 ## -------------------------------------------------------------------------------------------
00907
00908 blockquote() ;
00909
00910 p("texte") ;
00911 echo "On voudrait transférer ".href("films2.xml")." dans une base de données FA (Films et Artistes), " ;
00912 echo " sans les roles ni le résumé. " ;
00913 echo " On dispose des instructions MySql suivantes pour recréer les tables de la base (fichier ".href("fa.mysql").") : " ;
00914 finp() ;
00915
00916 pre_fichier("fa.mysql","cadre") ;
00917
00918 p("texte") ;
00919 echo "Ecrire une transformation $XSL qui remplit la base. " ;
00920 finp() ;
00921
00922 p("texte") ;
00923 echo "Attention là encore au fait que certains films n'ont pas de GENRE et que certains artistes n'ont pas de ANNEENAISS." ;
00924 finp() ;
00925
00926 p("texte") ;
00927 echo "Et pour finir, reprendre l'exercice qui produit les deux tableaux $XHTML stricts (".href("fa.html").") et rajouter un lien " ;
00928 echo " vers le metteur en scène sous la date de parution. On générera des id pour chacun des metteurs en scène. " ;
00929 finp() ;
00930
00931
00932 solution($numExo) ;
00933
00934 p("texte") ;
00935 echo "Il n'y a pas vraiment de difficultés ici, sauf à définir le champ ".b("idFilm")." car pour la tables artistes, " ;
00936 echo " on dispose de la valeur de ".b("ARTISTE//@id").". ";
00937 echo "Au final, voici donc la solution dans ".href("fa.xsl").". " ;
00938 finp() ;
00939
00940 pre_fichier("fa.xsl","cadre") ;
00941
00942 p("texte") ;
00943 echo "Le fichier MySql produit est alors : ".href("remplit_fa.mysql") ;
00944 echo " obtenu par l'application de la transformation ".href("fa.xsl")." au fichier ".href("films2.xml").", " ;
00945 echo " soit ".href("../internet/Xmpxml/perlXsl.php?xml=films2.xml&xsl=fa.xsl","films2fa")." sur le serveur, " ;
00946 echo " ou encore : ".href("xslt.php?xml=films2.xml&xsl=fa.xsl&fmt=txt","films2+fa").". " ;
00947 finp() ;
00948
00949 finsolution() ;
00950
00951 finblockquote() ;
00952
00953 ## -------------------------------------------------------------------------------------------
00954
00955 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Deux transformations à peine plus complexes
00956
00957 ## -------------------------------------------------------------------------------------------
00958
00959 blockquote() ;
00960
00961 p("texte") ;
00962 echo "Quelles sont les différences entre $XSLT 1 et $XSLT 2 ?" ;
00963 finp() ;
00964
00965
00966 solution($numExo) ;
00967
00968 p("texte") ;
00969 echo "XSLT 1 a certaines lacunes que $XSLT 2 essaie de combler. En particulier $XSL2 utilise $XPATH 2. Il faut donc se préoccuper aussi des " ;
00970 echo " différences entre $XPATH 1 et $XPATH 2." ;
00971 finp() ;
00972
00973 p("texte") ;
00974 echo "Comme $XSL 1 et $XSL 2, $XPATH... font partie de la " ;
00975 echo href("http://www.w3.org/Style/XSL/","Extensible Stylesheet Language Family")." c'est au " ;
00976 echo href("http://www.w3.org/Style/XSL/","W3C/XSL")." qu'il faut aller pour voir " ;
00977 echo " les spécifications correspondantes :" ;
00978 finp() ;
00979
00980 ul() ;
00981
00982 debutli() ;
00983 p() ;
00984 echo href("http://www.w3.org/TR/xslt","XSLT 1 Specs") ;
00985 finp() ;
00986 finli() ;
00987
00988 debutli() ;
00989 p() ;
00990 echo href("http://www.w3.org/TR/xpath","XPATH 1 Specs") ;
00991 finp() ;
00992 finli() ;
00993
00994 debutli() ;
00995 p() ;
00996 echo href("http://www.w3.org/TR/xslt20/","XSLT 2 Specs") ;
00997 finp() ;
00998 finli() ;
00999
01000 debutli() ;
01001 p() ;
01002 echo href("http://www.w3.org/TR/xpath20req/","XPATH 2 Specs") ;
01003 finp() ;
01004 finli() ;
01005
01006 finul() ;
01007
01008
01009 p("texte") ;
01010 echo "On peut lire " ;
01011 echo href("http://www.codeproject.com/Articles/304467/XSLT-2-0-in-NET","XSLT-2-0-in-NET") ;
01012 echo " comme exemple concret de nouveauté $XSL 2. Pour plus de détails, il est possible de se reporter aux deux articles " ;
01013 echo href("http://www.xml.com/pub/a/2002/03/20/xpath2.html","What's New in XPath 2.0")." d'Evan LENZ. " ;
01014 echo " et " ;
01015 echo href("http://www.xml.com/pub/a/2002/04/10/xslt2.html","What's New in $XSLT 2.0") ;
01016 finp() ;
01017
01018
01019 p("texte") ;
01020 echo "La longue page sur les opérateurs communs de XQUERY 1 et $XPATH 2 est " ;
01021 echo href("http://www.w3.org/TR/2001/WD-xquery-operators-20011220/","ici").". " ;
01022 finp() ;
01023
01024 # http://www.codeproject.com/Articles/304467/XSLT-2-0-in-NET
01025 #http://www.w3.org/Style/XSL/
01026 #http://www.xml.com/pub/a/2002/04/10/xslt2.html
01027
01028
01029 finsolution() ;
01030
01031 finblockquote() ;
01032
01033 ## -------------------------------------------------------------------------------------------
01034
01035 finPageExercices(3) ; # contient finSection() et finPage() ;
01036
01037 ?>
Retour à la page principale de (gH)