Valid XHTML     Valid CSS2    

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 
;
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 
;
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")."&nbsp;? " ;
00083     finp
() ;
00084     
00085     p
("texte") ;
00086     echo "Quelle est la différence entre "
.vert("/*")." et ".vert("//*")."&nbsp;? 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")."&nbsp;? " ;
00095     echo " Trouvez une expression 
$XPATH plus concise qui fournit le m&ecirc;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&nbsp;? " ;
00104     finp
() ;
00105     
00106     p
("texte") ;
00107     echo "Quel metteur en scène correspond à la référence 3&nbsp;? " 
;
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&nbsp;:" ;
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&nbsp;:" ;
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&ecirc;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&ecirc;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&nbsp;:" 
;
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&nbsp;:" 
;
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&nbsp;? De façon lisible&nbsp;? " 
;
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-&ecirc;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|")."&nbsp;? " ;
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&ucirc;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&nbsp;: " ;
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&ecirc;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&nbsp;:" 
;
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&nbsp;:" 
;
00289     finp
() ;
00290     
00291     pre_fichier
("ncbi_res1.txt","cadre") ;
00292     
00293     p
("texte") ;
00294     echo b
("Remarque&nbsp;: ") ;
00295     echo " on aurait pu utiliser " 
;
00296     echo b
("xsltproc&nbsp;ncbi_gi_1.xsl&nbsp;AAA18335.xml") ;
00297     echo " et " 
;
00298     echo b
("xsltproc&nbsp;ncbi_gi_2.xsl&nbsp;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&nbsp;!" ;
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 ;
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&amp;rettype=gpamp;&amp;retmode=xml&amp;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 &laquo;quelque part&raquo; 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 ;
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&nbsp;: 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&nbsp;: " ;
00385     echo vert
("//Dbtag[Dbtag_db='CDD']/Dbtag_tag/Object-id/Object-id_id")."&nbsp;: " ;
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&nbsp;:" 
;
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&nbsp;:" 
;
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&nbsp;:" ;
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&nbsp;? " ;
00477     echo " Et d'artistes&nbsp;? Et de metteurs en scène&nbsp;? " 
## D'acteurs non metteurs en scène&nbsp;?
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)&nbsp;:" ;
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é&nbsp;! 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("&lt;MES idref=\"3\"&gt;&lt;/MES&gt;")." et ".rouge("&lt;ARTISTE id=\"51\"&gt;").", " ;
00561     echo " on devra avoir&nbsp;: "
.vert("&lt;MES idref=\"art3\"&gt;&lt;/MES&gt;")." et ".vert("&lt;ARTISTE id=\"art51\"&gt;")."." ;
00562     finp
() ;
00563     
00564     solution
($numExo) ;
00565     
00566     $sousExo 
;
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")."&nbsp;:" ;
00577     finp
() ;
00578     
00579     pre_fichier
("aea1.xsl","cadre") ;
00580     
00581     p
("texte") ;
00582     echo "Résultat&nbsp;:" 
;
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")."&nbsp;:" ;
00589     finp
() ;
00590     
00591     pre_fichier
("aea2.xsl","cadre") ;
00592     
00593     p
("texte") ;
00594     echo "Résultat&nbsp;:" 
;
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&ecirc;me pricipe; ajoutons maintenant un attribut age pour "
.href("pers01.xml")."&nbsp;:" ;
00601     finp
() ;
00602     
00603     pre_fichier
("aea3.xsl","cadre") ;
00604     
00605     p
("texte") ;
00606     echo "Résultat&nbsp;:" 
;
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")."&nbsp;:" ;
00613     finp
() ;
00614     
00615     pre_fichier
("aea4.xsl","cadre") ;
00616     
00617     p
("texte") ;
00618     echo "Résultat&nbsp;:" 
;
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&nbsp;:" 
;
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&nbsp;? " ;
00654     echo " Et d'artistes&nbsp;? Et de metteurs en scène&nbsp;? " 
## D'acteurs non metteurs en scène&nbsp;?
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&nbsp;?" 
;
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&ecirc;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&nbsp;:" ;
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")."&nbsp;: " ;
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 &lt;".b("body")."&gt; " ;
00723     echo " d'une page 
$XHTML valide. On pourra utiliser ".href("page.html")." qui devra &ecirc;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
("&lt;html&gt;")." et ".vert("&lt;body&gt;")." nommé ".b("debutPage")." puis un sous-programme pour " ;
00776     echo vert
("&lt;/body&gt;")." et ".vert("&lt;/html;")." nommé ".b("finPage").", soit ".href("films_lst_2b1.xsl") ;
00777     echo " mais malheureusement, cela n'est pas possible car il faudrait laisser "
.vert("&lt;body&gt;")." 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")."&nbsp;: 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("&lt;h1&gt;")." en haut de page sera bien s&ucirc;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é&nbsp;; 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("&lt;h1&gt;")." en haut de page soit facultative." ;
00845     finp
() ;
00846     
00847     p
("texte") ;
00848     echo b
("Attention&nbsp;:")." 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 " &ecirc;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 &laquo;sous-programmes&raquo; y compris la redite éventuelle de en "
.b("&lt;h1&gt;")." 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'&ecirc;tre difficile. Voici le &laquo;programme principal&raquo; qui est dans ".href("films_lst_5.xsl")."&nbsp;:" ;
00872     finp
() ;
00873     
00874     pre_fichier
("films_lst_5.xsl","cadrebleu") ;
00875     
00876     p
("texte") ;
00877     echo "Et l'un des deux &laquo;sous-programmes&raquo; "
.b("tableauDesFilms")." qui est dans ".href("tabFilms.xsl")."&nbsp;:" ;
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&amp;xsl=films_lst_5.xsl","films5xsl")." (sans images ni style, volontairement), " ;
00889     echo " ou encore&nbsp;: "
.href("xslt.php?xml=films2.xml&amp;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").")&nbsp;: " ;
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&nbsp; 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&amp;xsl=fa.xsl","films2fa")." sur le serveur, " ;
00946     echo " ou encore&nbsp;: "
.href("xslt.php?xml=films2.xml&amp;xsl=fa.xsl&amp;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&nbsp;?" ;
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&nbsp;:" 
;
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 gH    Retour à la page principale de   (gH)