Valid XHTML     Valid CSS2    

Listing du fichier l2xml_6_tp4.php

 

00001     <?php
00002     
# # (gH) -_- l2xml_6_tp4.php ; TimeStamp (unix) : 11 F&eacute;vrier 2018 vers 16:32
00003     
include("std.php") ;
00004     include(
"l2xml_6_inc.php") ;
00005     
00006     
$HTML
= s_span("HTML" ,"grouge") ;
00007     
$XHTML
= s_span("XHTML","grouge") ;
00008     
$XML
= s_span("XML" ,"grouge") ;
00009     
$XSL
= s_span("XSL" ,"grouge") ;
00010     
$XPATH
= s_span("XPATH","grouge") ;
00011     
$DTD
= s_span("DTD" ,"grouge") ;
00012     
$XSD
= s_span("XSD" ,"grouge") ;
00013     
$CSS
= s_span("CSS" ,"grouge") ;
00014     
$CSV
= s_span("CSV" ,"grouge") ;
00015     
$Excel
= s_span("Excel" ,"grouge") ;
00016     
$JavaScript
= s_span("JavaScript" ,"grouge") ;
00017     
$R
= s_span("R" ,"grouge") ;
00018     
$PHP
= s_span("PHP" ,"grouge") ;
00019     
00020     
$numSerie
= 4 ;
00021     
00022     if (!isset(
$_GET
["standalone"])) { debutPage("XML en L2, TP $numSerie","strict","","l2xml.js") ; } ;
00023     
00024     
debutSection() ;
00025     
h1
("$XML en L2, universit&eacute; d'Angers ") ;
00026     
h2
(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00027     
pvide() ;
00028     
h2
(s_span("T.P. num&eacute;ro $numSerie","gbleu")."&nbsp;:&nbsp; transformation") ;
00029     
pvide() ;
00030     
00031     
###########################################################################################
00032     
00033     
$tableauDesRubriques = array() ;
00034     
$idr
= 0 ;
00035     
$idr
++; $tableauDesRubriques[$idr] = "Expressions $XPATH " ;
00036     
$idr
++; $tableauDesRubriques[$idr] = "Comprendre la transformation vide" ;
00037     
$idr
++; $tableauDesRubriques[$idr] = "R&eacute;aliser une transformation minimale avec $XSL" ;
00038     
$idr
++; $tableauDesRubriques[$idr] = "Une transformation $XSL &eacute;l&eacute;mentaire" ;
00039     
$idr
++; $tableauDesRubriques[$idr] = "Une deuxi&egrave;me transformation $XSL pour ajouter des informations " ;
00040     
$idr
++; $tableauDesRubriques[$idr] = "Une troisi&egrave;me transformation $XSL pour un rendu en page Web" ;
00041     
$idr
++; $tableauDesRubriques[$idr] = "Transformations $XSL avanc&eacute;es et statistiques" ;
00042     
$tdmCRLM
= new tdm($tableauDesRubriques) ;
00043     
$tdmCRLM
->titre() ;
00044     
$tdmCRLM
->menu("oui","oui","nou") ;
00045     
00046     
pvide() ;
00047     
$numExo
= 0 ;
00048     
$numSerie
= 4 ;
00049     
direAfficherSolutions
($numSerie) ;
00050     
pvide() ;
00051     
00052     
## -------------------------------------------------------------------------------------------
00053     
00054     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Expressions XPATH
00055     
00056     ## -------------------------------------------------------------------------------------------
00057     
00058     
blockquote() ;
00059     
00060     
p
("texte") ;
00061     echo
" On s'int&eacute;resse ici au document "
.href("films2.xml")." qui contient des films et des artistes. " ;
00062     
finp() ;
00063     
00064     
blockquote() ;
00065     
p() ;
00066     
textarea_fichier
("films2","tajaunec",25,80,"films","films2.xml","") ;
00067     
finp() ;
00068     
finblockquote() ;
00069     
00070     
p
("texte") ;
00071     echo
"En voici la grammaire
$DTD&nbsp;:" ;
00072     
finp() ;
00073     
00074     
pre_fichier
("films2.dtd","cadrebleu") ;
00075     
00076     
p
("texte") ;
00077     echo
"On fournit aussi la structure explicite du fichier (&eacute;l&eacute;ments seulement) obtenue &agrave; l'aide de la commande "
.b("xmlstarlet el -u films2.xml")."&nbsp;:" ;
00078     
finp() ;
00079     
00080     
pre_fichier
("films2_stru.txt","cadrejaune") ;
00081     
00082     
p
("texte") ;
00083     echo
" On liste &eacute;galement la liste des attributs uniques du fichier&nbsp;:" ;
00084     
finp() ;
00085     
00086     
pre_fichier
("films2_att.txt","cadrejaune") ;
00087     
00088     
p
("texte") ;
00089     echo
"A l'aide de "
.b("xmllint")." en mode ".em("&laquo;shell&raquo;").", essayer ensuite de r&eacute;pondre aux questions suivantes&nbsp;:" ;
00090     
finp() ;
00091     
00092     
ul() ;
00093     
00094     
# grep TITRE films2.xml | head -n 9 | tail -n 1 ; 95:<TITRE>Gladiator</TITRE>
00095     
00096     
debutli
() ; p("texte") ;
00097      echo
"Quels sont tous les titres de films&nbsp;?" ;
00098     
finp
() ; finli() ;
00099     
00100     
debutli
() ; p("texte") ;
00101      echo
"Quel est le neuvi&egrave;me titre de film&nbsp;?" ;
00102     
finp
() ; finli() ;
00103     
00104     
debutli
() ; p("texte") ;
00105      echo
"En quelle ann&eacute;e est sorti le film "
.em("Blade Runner")."&nbsp;?" ;
00106     
finp
() ; finli() ;
00107     
00108     
debutli
() ; p("texte") ;
00109      echo
"Quel en est le metteur en sc&egrave;ne&nbsp;?" ;
00110     
finp
() ; finli() ;
00111     
00112     
debutli
() ; p("texte") ;
00113      echo
"Combien y a-t-il de films&nbsp;?" ;
00114     
finp
() ; finli() ;
00115     
00116     
debutli
() ; p("texte") ;
00117      echo
"Quels &eacute;l&eacute;ments contiennent le texte \"Bruce\"&nbsp;?" ;
00118     
finp
() ; finli() ;
00119     
00120     
finul() ;
00121     
00122     
p
("texte") ;
00123     echo
b
("Remarque&nbsp;:") ;
00124     echo
" il faut peut-&ecirc;tre utiliser la commande "
.b("rlwrap xmllint --shell films2.xml") ;
00125     echo
" au lieu de la simple commande "
.b("xmllint --shell films2.xml")." si le terminal n'est pas bien configuré afin de pouvoir " ;
00126     echo
" facilement éditer la ligne de commandes sous xmllint." ;
00127     
finp() ;
00128     
00129     
solution
($numExo,$numSerie) ;
00130     
00131     
p
("texte") ;
00132     echo
" Voici les instructions &agrave; ex&eacute;cuter dans le shell de "
.b("XMLLINT")." pour r&eacute;pondre aux questions pos&eacute;es&nbsp;:" ;
00133     
finp() ;
00134     
00135     
pre_fichier
("films2_sh.txt","cadrebleu") ;
00136     
00137     
finsolution() ;
00138     
00139     
finblockquote() ;
00140     
00141     
## -------------------------------------------------------------------------------------------
00142     
00143     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Comprende la transformation vide
00144     
00145     ## -------------------------------------------------------------------------------------------
00146     
00147     
blockquote() ;
00148     
00149     
p
("texte") ;
00150     echo
" Que produit la "
.b("transformation vide")." d&eacute;finie dans le fichier ".href("vide.xsl") ;
00151     echo
" si on l'applique aux fichiers " ;
00152     echo
href
("eau.xml").", " ;
00153     echo
href
("eau2.xml").", " ;
00154     echo
href
("trajets.xml")." et " ;
00155     echo
href
("firefox.svg") ;
00156     echo
" du T.P. 1&nbsp;?" ;
00157     
finp() ;
00158     
00159     
pre_fichier
("vide.xsl","cadrebleu") ;
00160     
00161     
p
("texte") ;
00162     echo
"Quelle est, pour ces fichiers, la diff&eacute;rence avec la transformation minimaliste nomm&eacute;e "
.href("minimaliste.xsl")."&nbsp;?" ;
00163     
finp() ;
00164     
00165     
pre_fichier
("minimaliste.xsl","cadrebleu") ;
00166     
00167     
solution
($numExo,$numSerie) ;
00168     
00169     
p
("texte") ;
00170     echo
" La transformation vide affiche les contenus textuels des &eacute;l&eacute;ments et ignore les attributs. " ;
00171     echo
" Pour le fichier "
.href("eau.xml")." on r&eacute;cup&egrave;re donc trois lignes pratiquement vides (en fait on r&eacute;cup&egrave;re les espaces d'indentation et les sauts de ligne, ";
00172     echo
" ce qui fait qu'&agrave; l'&eacute;cran on ne voit rien. " ;
00173     echo
" Pour le fichier "
.href("eau2.xml")." on r&eacute;cup&egrave;re les noms et les nombres d'atomes. " ;
00174     echo
" Au niveau de "
.href("trajets.xml").", le type de train, le nom des gares de d&eacute;part et d'arriv&eacute;e sont affich&eacute;s." ;
00175     
finp() ;
00176     
00177     
p
("texte") ;
00178     echo
"Pour le dessin du renard, il y a beaucoup de lignes vides affich&eacute;es, ce qui fait qu'on risque de manquer le d&eacute;but de " ;
00179     echo
" l'affichage. Heureusement, "
.b("grep")." est notre ami&nbsp;! " ;
00180     echo
" On r&eacute;cup&egrave;re donc comme seules lignes de texte le contenu des &eacute;l&eacute;ments "
.b("title")." et ".b("desc").". " ;
00181     
finp() ;
00182     
00183     
pre_fichier
("tf_vides.txt","cadre") ;
00184     
00185     
00186     
p
("texte") ;
00187     echo
"Il n'y a en principe aucune diff&eacute;rence entre les transformations " ;
00188     echo
href
("vide.xsl") ;
00189     echo
" et " ;
00190     echo
href
("minimaliste.xsl") ;
00191     echo
" parce que la transformation vide applique toutes les r&egrave;gles par d&eacute;faut &agrave; partir de la racine." ;
00192     
finp() ;
00193     
00194     
finsolution() ;
00195     
00196     
finblockquote() ;
00197     
00198     
## -------------------------------------------------------------------------------------------
00199     
00200     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # R&eacute;aliser une transformation minimale avec XSL
00201     
00202     ## -------------------------------------------------------------------------------------------
00203     
00204     
blockquote() ;
00205     
00206     
p
("texte") ;
00207     echo
" Que faut-il ajouter &agrave; la "
.b("transformation minimaliste")." d&eacute;finie dans le fichier ".href("minimaliste.xsl") ;
00208     echo
" pour qu'elle n'affiche que les noms d'atome si on l'applique au fichier " ;
00209     echo
href
("eau2.xml") ;
00210     echo
"&nbsp;?" ;
00211     
finp() ;
00212     
00213     
solution
($numExo,$numSerie) ;
00214     
00215     
p
("texte") ;
00216     echo
" Une premi&egrave;re solution consiste &agrave; d&eacute;finir deux r&egrave;gles, l'une pour l'&eacute;l&eacute;ment "
.b("nom")." et l'autre pour l'&eacute;l&eacute;ment ".b("nombre").". " ;
00217     echo
" Pour "
.b("nom")." on veut afficher le contenu alors que pour ".b("nombre")." on ne veut rien faire (puisqu'on ne veut pas afficher)".". " ;
00218     echo
" Voici donc la solution dans "
.href("mineau2.xsl")."&nbsp;:" ;
00219     
finp() ;
00220     
00221     
pre_fichier
("mineau2.xsl","cadrejaune") ;
00222     
00223     
p
("texte") ;
00224     echo
"Une meilleure solution est sans doute de ne demander que de d&eacute;clencher les r&egrave;gles pour les &eacute;l&eacute;ments "
.b("noms").", " ;
00225     echo
" soit le code du fichier "
.href("mineau3.xsl")."&nbsp;:" ;
00226     
finp() ;
00227     
00228     
pre_fichier
("mineau3.xsl","cadrejaune") ;
00229     
00230     
p
("texte") ;
00231     echo
" Enfin, la solution la plus courte est d'intercepter la règle sur l'élément nombre, " ;
00232     echo
" soit le code du fichier "
.href("mineau4.xsl")."&nbsp;:" ;
00233     
finp() ;
00234     
00235     
pre_fichier
("mineau4.xsl","cadrejaune") ;
00236     
00237     
finsolution() ;
00238     
00239     
finblockquote() ;
00240     
00241     
## -------------------------------------------------------------------------------------------
00242     
00243     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Une transformation XSL &eacute;l&eacute;mentaire
00244     
00245     ## -------------------------------------------------------------------------------------------
00246     
00247     
blockquote() ;
00248     
00249     
p
("texte") ;
00250     echo
" On voudrait compter le nombre de prot&eacute;ines du fichier "
.href("leadb880.xml")." et v&eacute;rifier que chaque prot&eacute;ine a bien un attribut ".b("length").". " ;
00251     echo
" Trouver une solution en ligne de commandes puis &agrave; l'aide d'une transformation
$XSL." ;
00252     
finp() ;
00253     
00254     
p
("texte") ;
00255     echo
" Comment peut-on trouver la plus petite longueur de prot&eacute;ine et la plus grande via
$XSL&nbsp;?" ;
00256     
finp() ;
00257     
00258     
/*
00259     p("texte") ;
00260     echo " Ecrire ensuite un script $PHP qui trouve la plus petite longueur de prot&eacute;ine et la plus grande." ;
00261     finp() ;
00262     */
00263     
00264     
solution
($numExo,$numSerie) ;
00265     
00266     
p
("texte") ;
00267     echo
" Une prot&eacute;ine correspond &agrave; un &eacute;l&eacute;ment "
.b("protein")." donc il suffit de compter les chaines ".b("&lt;protein&gt;")." pour les d&eacute;nombrer. " ;
00268     echo
" L'attribut "
.b("length").", lui, peut se rep&eacute;rer gr&acirc;ce &agrave; l'expression ".b("&lt;fasta length=").". " ;
00269     echo
" Dans les deux cas, on trouve 880 lignes correspondantes, mais cela ne prouve sans doute pas que chaque prot&eacute;ine a bien un attribut "
.b("length") ;
00270     echo
" dans un sous-&eacute;l&eacute;ment "
.b("fasta")." sauf &agrave; valider le fichier pour la grammaire " ;
00271     echo
href
("leadb_dtd.txt","leadb.dtd")." du T.P. numéro 1 " ;
00272     echo
" (ou &agrave; savoir bien compter, car 3521 = 1 + 4x880). " ;
00273     echo
" Par contre rechercher toutes les expressions "
.b("proteins/protein/fasta/@length")." dans la sortie de ".b("xmlstarlet el -a")." peut le prouver. ";
00274     echo
" Voici les commandes &agrave; utiliser&nbsp;:" ;
00275     
finp() ;
00276     
00277     
pre_fichier
("leadb_prot.txt","cadrebleu") ;
00278     
00279     
00280     
p
("texte") ;
00281     echo
"Pour effectuer une transformation
$XSL qui r&eacute;alise les m&ecirc;mes comptages, il suffit de mettre une seule r&egrave;gle sur " ;
00282     echo
" la racine du document et d'utiliser la fonction
$XPATH nomm&eacute;e " ;
00283     echo
href
("http://forge.info.univ-angers.fr/~gh/selfhtml_fr/xml/representation/fonctionsxpath.htm#count","count()").". " ;
00284     
finp() ;
00285     
00286     
p() ;
00287     echo
b
("Transformation ".href("proteines.xsl")."&nbsp;:") ;
00288     
finp() ;
00289     
00290     
pre_fichier
("proteines.xsl","cadrebleu") ;
00291     
00292     
p
("texte") ;
00293     echo
"Pour ex&eacute;cuter cette transformation, on peut utiliser "
.b("xsltproc")."&nbsp;:" ;
00294     
finp() ;
00295     
00296     
pre_fichier
("proteines_sh1.txt","cadrebleu") ;
00297     
00298     
p
("texte") ;
00299     echo
"mais ce n'est pas le seul choix possible. Par exemple on peut utiliser "
.b("xmlstarlet")."&nbsp;:" ;
00300     
finp() ;
00301     
00302     
pre_fichier
("proteines_sh2.txt","cadrebleu") ;
00303     
00304     
00305     
p
("texte") ;
00306     echo
" On peut aussi mettre l'appel du fichier
$XSL dans l'en-t&ecirc;te du fichier $XML et faire ex&eacute;cuter la transformation " ;
00307     echo
" par le navigateur, comme "
.href("leadb880tr.xml","ici").". " ;
00308     
finp() ;
00309     
00310     
p
("texte") ;
00311     echo
"Pour trouver la longueur minimale et la longueur maximale, on peut se contenter de trier par ordre croissant ou d&eacute;croissant et de garder la premi&egrave;re valeur, soit " ;
00312     echo
" le code
$XSL suivant&nbsp;:" ;
00313     
finp() ;
00314     
00315     
pre_fichier
("prot_max1.xsl","cadrebleu") ;
00316     
00317     
p
("texte") ;
00318     echo
" dont le rendu est " ;
00319     
finp() ;
00320     
00321     
pre_fichier
("prot_max1.sor","cadrejaune") ;
00322     
00323     
finsolution() ;
00324     
00325     
finblockquote() ;
00326     
00327     
## -------------------------------------------------------------------------------------------
00328     
00329     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Une deuxi&egrave;me transformation XSL pour ajouter des informations
00330     
00331     ## -------------------------------------------------------------------------------------------
00332     
00333     
blockquote() ;
00334     
00335     
p
("texte") ;
00336     echo
"Ecrire des transformations "
.b("ajouteAge")." qui calculent et ajoutent l'age aux personnes dont " ;
00337     echo
" on connait la date de naissance. On ajoutera un &eacute;l&eacute;ment age lorsque la ddn est un &eacute;l&eacute;ment, un attribut age " ;
00338     echo
" si la ddn est un attribut. Effectuez ensuite les transformations inverses, &agrave; savoir mettre un attribut quand on " ;
00339     echo
" a un &eacute;l&eacute;ment et r&eacute;ciproquement. " ;
00340     echo
" On utilisera les fichiers "
.href("pers01.xml")." et ".href("pers02.xml")." pour tester les transformations." ;
00341     
finp() ;
00342     
00343     
p
("texte") ;
00344     echo
"Nous avons vu dans la s&eacute;rie d'exercices sur la structuration des fichiers
$XML qu'un attribut tout num&eacute;rique ne pouvait pas servir d'".b("ID")." et donc d'".b("IDREF")." non plus. " ;
00345     echo
" Ecrire une transformation "
.b("ajouteArt")." qui modifie les attributs ".ghBleu("id")." et ".ghBleu("idref")." des &eacute;l&eacute;ments " ;
00346     echo
ghBleu
("MES")." (metteurs en sc&egrave;ne) et ".ghBleu("ARTISTES")." de ".href("films2.xml")." par l'ajout " ;
00347     echo
" de "
.b("\"art\"").". Ainsi au lieu de ".ghRouge("&lt;MES idref=\"3\"&gt;&lt;/MES&gt;")." et ".ghRouge("&lt;ARTISTE id=\"51\"&gt;").", " ;
00348     echo
" on devra avoir&nbsp;: "
.ghVert("&lt;MES idref=\"art3\"&gt;&lt;/MES&gt;")." et ".ghVert("&lt;ARTISTE id=\"art51\"&gt;")."." ;
00349     
finp() ;
00350     
00351     
solution
($numExo,$numSerie) ;
00352     
00353     
$sousExo
= 0 ;
00354     
/*
00355     p("texte") ;
00356     echo "Exercice volontairement non corrig&eacute;." ;
00357     finp() ;
00358     */
00359     
00360     
p
("texte") ;
00361     echo
" Il n'y a aucune difficuté à ajouter des éléments ou des attributs à un document
$XML. " ;
00362     echo
" On commence par préciser dans "
.b("xsl:output")." que la sortie est du $XML, puis on se sert de " ;
00363     echo
" la fonction "
.href("http://fsajous.free.fr/xml/xslt/instr_copy-of.html","xsl:copy-of") ;
00364     echo
" pour recopier chaque élément "
.b("personne")." avec son sous-arbre. " ;
00365     echo
" Au passage, on crée un nouvel élément "
.b("age")." ou on rajoute un attribut ".b("age").". " ;
00366     
finp() ;
00367     
00368     
$sousExo
++ ; h3("$numExo".".".$sousExo." Ajout de l'age") ;
00369     
00370     
00371     
p
("texte") ;
00372     echo
"Commen&ccedil;ons par ajouter un &eacute;l&eacute;ment age pour "
.href("pers01.xml")."&nbsp;:" ;
00373     
finp() ;
00374     
00375     
pre_fichier
("aea1.xsl","cadre") ;
00376     
00377     
p
("texte") ;
00378     echo
"R&eacute;sultat&nbsp;:" ;
00379     
finp() ;
00380     
00381     
pre_fichier
("aea1.res","cadrebleu",0,1) ; # produit par exsl pers01.xml aea1.xsl > aea1.res
00382     
00383     
p
("texte") ;
00384     echo
"Ajoutons maintenant un attribut age pour "
.href("pers02.xml")."&nbsp;:" ;
00385     
finp() ;
00386     
00387     
pre_fichier
("aea2.xsl","cadre") ;
00388     
00389     
p
("texte") ;
00390     echo
"R&eacute;sultat&nbsp;:" ;
00391     
finp() ;
00392     
00393     
pre_fichier
("aea2.res","cadrebleu",0,1) ; # produit par exsl pers02.xml aea2.xsl > aea2.res
00394     
00395     
p
("texte") ;
00396     echo
"Sur le m&ecirc;me pricipe; ajoutons maintenant un attribut age pour "
.href("pers01.xml")."&nbsp;:" ;
00397     
finp() ;
00398     
00399     
pre_fichier
("aea3.xsl","cadre") ;
00400     
00401     
p
("texte") ;
00402     echo
"R&eacute;sultat&nbsp;:" ;
00403     
finp() ;
00404     
00405     
pre_fichier
("aea3.res","cadrebleu",0,1) ; # produit par exsl pers01.xml aea3.xsl > aea3.res
00406     
00407     
p
("texte") ;
00408     echo
"Et enfin voici un &eacute;l&eacute;ment age pour "
.href("pers02.xml")."&nbsp;:" ;
00409     
finp() ;
00410     
00411     
pre_fichier
("aea4.xsl","cadre") ;
00412     
00413     
p
("texte") ;
00414     echo
"R&eacute;sultat&nbsp;:" ;
00415     
finp() ;
00416     
00417     
pre_fichier
("aea4.res","cadrebleu",0,1) ; # produit par exsl pers02.xml aea4.xsl > aea4.res
00418     
00419     /*
00420     # une pI (processing instruction pour avoir l'ann&eacute;e courante dans une variable ?
00421     
00422     $sousExo++ ; h3("$numExo".".".$sousExo." Ajout de la longueur dans les s&eacute;quences Fasta") ;
00423     
00424     p("texte") ;
00425     echo "Voici deux possibilit&eacute;s d'ajout, d'abord en &eacute;l&eacute;ment puis en attribut&nbsp;:" ;
00426     finp() ;
00427     
00428     pre_fichier("eltaddlng.xsl","cadrebleu",0,1) ;
00429     pre_fichier("attaddlng.xsl","cadrejaune",0,1) ;
00430     */
00431     
00432     
$sousExo
++ ; h3("$numExo".".".$sousExo." Ajout de \"art\" pour les id et idrefs") ;
00433     
00434     
p
("text") ;
00435     echo
b
("Attention&nbsp;:") ;
00436     echo
" ici, il ne faut pas ajouter un élément ou un attribut, mais le modifier, en lui concaténant les trois lettres "
.b("art") ;
00437     echo
" en début de chaine. Heureusement, il y a une fonction
$XSL nommée " ;
00438     echo
href
("http://www.java2s.com/Tutorial/XML/0100__XSLT-stylesheet/concatfunction.htm","xsl:concat").". " ;
00439     
finp() ;
00440     
00441     
pre_fichier
("ajoutart.xsl","cadre") ;
00442     
00443     
# plus robuste si {name}="MES" que position 4 ???
00444     
00445     
00446     
finsolution() ;
00447     
00448     
finblockquote() ;
00449     
00450     
## -------------------------------------------------------------------------------------------
00451     
00452     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Une troisi&egrave;me transformation XSL pour un rendu en page Web
00453     
00454     ## -------------------------------------------------------------------------------------------
00455     
00456     
blockquote() ;
00457     
00458     
p
("texte") ;
00459     echo
" Dans le document "
.href("films2.xml").", combien y a-t-il de films&nbsp;? Et d'artistes&nbsp;? Combien de r&eacute;f&eacute;rences pour combien de metteurs en sc&egrave;ne&nbsp;? " ;
00460     echo
" On &eacute;crira une transformation
$XSL qui affichera ces r&eacute;sultats en mode texte qu'on ex&eacute;cutera avec ".b("xmlstarlet")." avant " ;
00461     echo
" de modifier le document pour avoir un rendu dans une "
.b("page Web")." valide pour la grammaire ".b("XHTML Strict")."." ;
00462     
finp() ;
00463     
00464     
p
("texte") ;
00465     echo
ghRouge
("Remarque&nbsp;:") ;
00466     echo
" on pourra utiliser le fichier "
.href("stdWeb2.xsl")." qui contient des sous-programmes $XSL adapt&eacute;s &agrave; la production de pages ".b("Web").". " ;
00467     
finp() ;
00468     
00469     
blockquote() ;
00470     
00471     
p() ;
00472     echo
b
("Fichier stdWeb2.xsl") ;
00473     
finp() ;
00474     
00475     
p() ;
00476     
textarea_fichier
("stdweb2","tajaunec",25,80,"stdweb","stdWeb2.xsl","") ;
00477     
finp() ;
00478     
00479     
finblockquote() ;
00480     
00481     
solution
($numExo,$numSerie) ;
00482     
00483     
p
("texte") ;
00484     echo
"Compter avec
$XSL se fait &agrave; l'aide de la fonction ".b("count()")." dans un attribut ".b("select")." d'un &eacute;l&eacute;ment ".b("xsl:value-of").". " ;
00485     echo
" Encore faut-il trouver les noeuds correspondants. Pour les films et les artistes, c'est assez simple car les &eacute;l&eacute;ments "
.ghBleu("FILM")." et " ;
00486     echo
" "
.ghBleu("ARTISTE")." identifient de fa&ccedil;on unique ce qu'on cherche donc il suffit de compter ".ghBleu("//FILM")." et ".ghBleu("//ARTISTE").". " ;
00487     
finp() ;
00488     
00489     
p
("texte") ;
00490     echo
"Pour trouver les metteurs en sc&egrave;ne, il faut retenir les attributs "
.b("id")." de ".ghBleu("ARTISTE") ;
00491     echo
" qui correspondent &agrave; un attribut "
.b("idref")." de ".ghBleu("MES").", " ;
00492     echo
" soit le filtre "
.ghBleu("ARTISTE[@id=//MES/@idref]")." -- bien noter le double slash devant ".b("MES").". " ;
00493     echo
" Nous avons rajout&eacute; dans la solution des "
.b("xsl:text")." pour rendre les " ;
00494     echo
" affichages plus lisibles (avec des indications de solution "
.ghRouge("XSL 2").")&nbsp;:" ;
00495     
finp() ;
00496     
00497     
pre_fichier
("nbfa1.xsl","cadrebleu") ;
00498     
pre_fichier
("nbfa1_sor.txt","cadrejaune") ;
00499     
00500     
p
("texte") ;
00501     echo
"Produire une page Web r&eacute;sultat est un peu plus compliqu&eacute; car il faut aussi produire du code
$HTML " ;
00502     echo
" ce qui signifie qu'il faut sans doute utiliser deux espaces de noms distincts. " ;
00503     
finp() ;
00504     
00505     
p
("texte") ;
00506     echo
" Voici la solution&nbsp;:" ;
00507     
finp() ;
00508     
00509     
pre_fichier
("films2.xsl","cadrebleu") ;
00510     
00511     
p
("texte") ;
00512      echo
"Le rendu correspondant est "
.href("films2_xsl.html","ici").". " ;
00513     
finp() ;
00514     
00515     
finsolution() ;
00516     
00517     
finblockquote() ;
00518     
00519     
## -------------------------------------------------------------------------------------------
00520     
00521     
$tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Transformations XSL avanc&eacute;es
00522     
00523     ## -------------------------------------------------------------------------------------------
00524     
00525     
blockquote() ;
00526     
00527     
p
("texte") ;
00528     echo
" On voudrait effectuer des calculs statistiques et tracer des graphiques pour &eacute;tudier statistiquement la longueur des prot&eacute;ines " ;
00529     echo
" du fichier "
.href("leadb880.xml").". Que peut-on calculer et tracer via $XSL&nbsp;?" ;
00530     
finp() ;
00531     
00532     
p
("texte") ;
00533     echo
" Est-ce qu'&eacute;crire un script
$PHP est ici adapt&eacute;&nbsp;?" ;
00534     
finp() ;
00535     
00536     
solution
($numExo,$numSerie) ;
00537     
00538     
p
("texte") ;
00539     echo
"
$XSL ne peut pas grand chose pour nous ici car $XSL est con&ccedil;u pour transformer du texte, pas pour calculer. " ;
00540     echo
"
$PHP n'est pas vraiment non plus pr&eacute;vu pour r&eacute;aliser des traitements statistiques. " ;
00541     echo
" Par contre
$XSL peut nous aider &agrave; produire un fichier $CSV utilisable par $Excel, le logiciel $R ou tout autre logiciel statistique. " ;
00542     echo
" Pour cela, il suffit d'exporter le nom de chaque prot&eacute;ine, sa classe et sa longueur. C'est ce que fait la transformation suivante&nbsp;:" ;
00543     
finp() ;
00544     
00545     
pre_fichier
("prot_export.xsl","cadrebleu") ;
00546     
00547     
# xsltproc prot_export.xsl leadb880.xml | grep -v "^$" | head
00548     
00549     
p
("texte") ;
00550     echo
"On pourra v&eacute;rifier que les donn&eacute;es obtenues par la commande " ;
00551     echo
b
("xsltproc prot_export.xsl leadb880.xml | grep -v \"^$\" | head") ;
00552     echo
" soit le fichier "
.href("prot_export.csv")." est utilisable par ".b("Microsoft Office Excel")." ou par ".b("Libre Office Calc")."&nbsp;:" ;
00553     
finp() ;
00554     
00555     
blockquote() ;
00556     
p() ;
00557     
textarea_fichier
("leadb880exp","tajaunec",25,80,"leadbExp","prot_export.csv","") ;
00558     
finp() ;
00559     
finblockquote() ;
00560     
00561     
p
("texte") ;
00562     echo
"On peut alors analyser ces donn&eacute;es via le script
$R suivant" ;
00563     
finp() ;
00564     
00565     
pre_fichier
("prot_export.r","cadre") ;
00566     
00567     
p
("texte") ;
00568     echo
"qui produit les r&eacute;sultats ci-dessous" ;
00569     
finp() ;
00570     
00571     
pre_fichier
("prot_export.sor","cadrebleu") ;
00572     
00573     
p
("texte") ;
00574     echo
"ainsi que le graphique suivant&nbsp;:" ;
00575     
finp() ;
00576     
00577     
p() ;
00578     
$img
= "protLng.png" ;
00579     echo
href
($img,img($img,"",400)) ;
00580     
finp() ;
00581     
00582     
p
("texte") ;
00583     echo
"Nous laissons le soin au lecteur de r&eacute;diger le commentaire statistique associ&eacute;." ;
00584     echo
" Le script
$R utilise notre fonction ".b("decritQT()")." d&eacute;crite " ;
00585     echo
href
("http://forge.info.univ-angers.fr/~gh/wstat/statghfns.php?lafns=decritQT&amp;montrer=montrer","ici").". " ;
00586     
finp() ;
00587     
00588     
finsolution() ;
00589     
00590     
finblockquote() ;
00591     
00592     
## -------------------------------------------------------------------------------------------
00593     
00594     
h2
("Questions sans r&eacute;ponse affich&eacute;e dans le navigateur (donc venez en TP&nbsp;!)") ;
00595     
00596     
blockquote() ;
00597     
ul() ;
00598     
debutli
() ; p("texte") ;
00599      echo
"Pourquoi est-ce difficile de construire une grammaire
$XSD fine et pr&eacute;cise pour les prot&eacute;ines LEA si on n'est pas biologiste&nbsp;?" ;
00600     
finp
() ; finli() ;
00601     
00602     
# il est difficile de d&eacute;finir une longueur minimale (et sans doute maximale) de prot&eacute;ine, de savoir &agrave; quoi correspond une classe,
00603      # savoir quelle expression r&eacute;guli&egrave;re correspond aux num&eacute;ros d'accession est un vrai casse-tete
00604     
00605     
debutli
() ; p("texte") ;
00606      echo
"Comment faire pour trouver les attributs uniques si on ne connait pas l'option "
.b("-u")." de la commande ".b("sort")."&nbsp;?" ;
00607     
finp
() ; finli() ;
00608     
00609     
# on peut utiliser la commande unique d'Unix ; exemple :
00610      # (rm -f films_att.txt ; xmlstarlet el -a films2.xml | grep "@" | sort > films.att ; unique films_att.txt < films.att).
00611     
00612     
debutli
() ; p("texte") ;
00613      echo
"Peut-on compter des \"non-&eacute;l&eacute;ments\" ou des &eacute;l&eacute;ments sans attributs&nbsp;?" ;
00614      echo
" Par exemple, pour "
.href("films2.xml")." combien manque-t-il de r&eacute;sum&eacute;s&nbsp;? et de dates de naissance&nbsp;?" ;
00615     
finp
() ; finli() ;
00616     
00617     
# xpath count(//FILM//RESUME) soit 41 films sur 48 n'est sans doute pas suffisant
00618      # xpath count(//ARTISTE[./ANNEENAISS=""]) # 40 &eacute;l&eacute;ments
00619      # xpath count(//ARTISTE[./ANNEENAISS!=""]) # 77 &eacute;l&eacute;ments
00620     
00621     
debutli
() ; p("texte") ;
00622      echo
"Pourquoi faut-il compter les attributs avec "
.b("/@")." plut&ocirc;t qu'avec seulement ".b("@")."&nbsp;&nbsp;?" ;
00623     
finp
() ; finli() ;
00624     
00625     
# il pourrait y avoir des adresses emails avec le symbole @
00626     
00627     
finul() ;
00628     
finblockquote() ;
00629     
00630     
## -------------------------------------------------------------------------------------------
00631     
00632     
pvide() ;
00633     
00634     
###########################################################################################
00635     
00636     
p() ;
00637     echo
href
("montresource.php?nomfic=l2xml_6_tp4.php","Code-source php de cette page","orange_stim nou")."." ;
00638     
finp() ;
00639     
00640     
finSection() ;
00641     
00642     if (!isset(
$_GET
["standalone"])) { finPage() ; } ;
00643     
?>

Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.

 

 

retour gH    Retour à la page principale de   (gH)