Valid XHTML     Valid CSS2    

Listing du fichier l2xml_6_tp2.php

 

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

La coloration syntaxique est réalisée par un enrobage de la function php nommée highlight_file

mais si vous préférez, vous pouvez utiliser celle de SyntaxHighlighter ou même celle de geshi.

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

 

 

retour gH    Retour à la page principale de   (gH)