Listing du fichier l2xml_6_tp2.php avec syntaxhighlighter
<?php # # (gH) -_- l2xml_6_tp2.php ; TimeStamp (unix) : 29 Juillet 2017 vers 21:47 include("std.php") ; include("l2xml_6_inc.php") ; $HTML = s_span("HTML" ,"grouge") ; $XHTML = s_span("XHTML","grouge") ; $XML = s_span("XML" ,"grouge") ; $XSL = s_span("XSL" ,"grouge") ; $XPATH = s_span("XPATH","grouge") ; $DTD = s_span("DTD" ,"grouge") ; $XSD = s_span("XSD" ,"grouge") ; $CSS = s_span("CSS" ,"grouge") ; $CSV = s_span("CSV" ,"grouge") ; $JavaScript = s_span("JavaScript" ,"grouge") ; $numSerie = 2 ; debutPage("XML en L2","strict","","l2xml.js") ; debutSection() ; h1("$XML en L2, université d'Angers ") ; h2(s_nbsp(4).href("../","gilles.hunault@univ-angers.fr","gvert nou")) ; pvide() ; h2("T.P. numéro $numSerie","gbleu") ; pvide() ; ########################################################################################### $tableauDesRubriques = array() ; $idr = 0 ; $idr++; $tableauDesRubriques[$idr] = "Compter des éléments ou des attributs dans un document $XML" ; $idr++; $tableauDesRubriques[$idr] = "Expressions $XPATH " ; $idr++; $tableauDesRubriques[$idr] = "Une transformation $XSL élémentaire" ; $idr++; $tableauDesRubriques[$idr] = "Une deuxième transformation $XSL" ; $idr++; $tableauDesRubriques[$idr] = "Transformations $XSL avancées" ; $tdmCRLM = new tdm($tableauDesRubriques) ; $tdmCRLM->titre() ; $tdmCRLM->menu("oui","oui","nou") ; pvide() ; $numExo = 0 ; $numSerie = 2 ; direAfficherSolutions($numSerie) ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # "Compter des éléments ou des attributs dans un document XML ## ------------------------------------------------------------------------------------------- blockquote() ; p("texte") ; echo " On s'intéresse au fichier ".href("leadb880.xml")." suivant :" ; finp() ; p() ; textarea_fichier("leadb880","tajaunec",25,80,"leadb","leadb880.xml","") ; finp() ; p("texte") ; 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. " ; echo " On pourra utiliser tout outil logiciel. Comment trouver le nombre d'élements distincts ?" ; finp() ; solution($numExo,$numSerie) ; p("texte") ; echo "On peut facilement obtenir le nombre de lignes avec la commande système nommée ".b("wc").". " ; echo " Pour le nombre de lignes vides, chainer ".b("grep")." et ".b("wc")." est sans doute un bon choix. " ; echo " Pour le nombre d'élements distincts et la structure, ".b("xmlstarlet")." et ".b("trang")." sont des outils biens adaptés. " ; echo " Enfin, pour le nombre d'éléments en tout, on peut chainer ".b("xmlstarlet")." et ".b("wc")." alors que " ; echo " pour le nombre d'attributs en tout, il faut chainer ".b("xmlstarlet").", ".b("grep")." et ".b("wc")." alors que " ; echo " Voici le détail des commandes associées :" ; finp() ; pre_fichier("leadb880_sh.txt","cadrejaune") ; p("texte") ; echo " Une grammaire ".em("raisonnable")." pour ces données est fournie par le fichier suivant nommé ".href("leadb_dtd.txt","leadb.dtd")."." ; finp(); p() ; echo b("Grammaire leadb.dtd :") ; finp() ; pre_fichier("leadb_dtd.txt","cadrebleu") ; p("texte") ; echo " Avec la commande ".b("xmlstarlet el -u")." on dispose de la structure des données :" ; finp(); pre_fichier("leadb_stru.txt","cadrebleu") ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Expressions XSL ## ------------------------------------------------------------------------------------------- blockquote() ; p("texte") ; echo " On s'intéresse ici au document ".href("films2.xml")." qui contient des films et des artistes. En voici la grammaire $DTD :" ; finp() ; pre_fichier("films2.dtd","cadrebleu") ; p("texte") ; echo "On fournit aussi la structure explicite du fichier (éléments seulement) obtenue à l'aide de la commande ".b("xmlstarlet el -u films2.xml")." :" ; finp() ; pre_fichier("films2_stru.txt","cadrejaune") ; p("texte") ; echo "A l'aide de ".b("xmllint")." en mode ".em("«shell»").", essayer de répondre aux questions suivantes :" ; finp() ; ul() ; # grep TITRE films2.xml | head -n 9 | tail -n 1 ; 95:<TITRE>Gladiator</TITRE> debutli() ; p("texte") ; echo "Quels sont tous les titres de films ?" ; finp() ; finli() ; debutli() ; p("texte") ; echo "Quel est le titre du neuvième film ?" ; finp() ; finli() ; debutli() ; p("texte") ; echo "En quelle année est sorti le film ".em("Blade Runner")." ?" ; finp() ; finli() ; debutli() ; p("texte") ; echo "Quel en est le metteur en scène ?" ; finp() ; finli() ; finul() ; solution($numExo,$numSerie) ; p("texte") ; echo " Voici les instructions à exécuter pour répondre aux questions :" ; finp() ; pre_fichier("films2_sh.txt","cadrebleu") ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Une transformation XSL élémentaire ## ------------------------------------------------------------------------------------------- blockquote() ; p("texte") ; 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").". " ; echo " Trouver une solution en ligne de commandes puis à l'aide d'une transformation XSL." ; echo " Comment peut-on trouver la plus petite longueur de protéine et la plus grande ?" ; finp() ; solution($numExo,$numSerie) ; p("texte") ; echo " Une protéine correspond à un élément ".b("protein")." donc il suffit de compter les chaines ".b("<protein>")." pour les dénombrer. " ; echo " L'attribut ".b("length").", lui, peut se repérer grâce à l'expression ".b("<fasta length=").". " ; 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") ; echo " dans un sous-élément ".b("fasta")." sauf à valider le fichier pour la grammaire de la question 1. " ; echo " Par contre rechercher toutes les expressions ".b("proteins/protein/fasta/@length")." dans la sortie de ".b("xmlstarlet el -a")." peut le prouver. "; echo " Voici les commandes à utiliser :" ; finp() ; pre_fichier("leadb_prot.txt","cadrebleu") ; p("texte") ; echo "Pour effectuer une transformation $XSL qui réalise les mêmes comptages, il suffit de mettre une seule règle sur " ; echo " la racine du document et d'utiliser la fonction $XPATH nommée " ; echo href("http://forge.info.univ-angers.fr/~gh/selfhtml_fr/xml/representation/fonctionsxpath.htm#count","count()").". " ; finp() ; p() ; echo b("Transformation ".href("proteines.xsl")." :") ; finp() ; pre_fichier("proteines.xsl","cadrebleu") ; p("texte") ; echo "Pour exécuter cette transformation, on peut utiliser ".b("xsltproc")." :" ; finp() ; pre_fichier("proteines_sh1.txt","cadrebleu") ; p("texte") ; echo "mais ce n'est pas le seul choix possible. Par exemple on peut utiliser ".b("xmlstarlet")." :" ; finp() ; pre_fichier("proteines_sh2.txt","cadrebleu") ; p("texte") ; echo " On peut aussi mettre l'appel du fichier $XSL dans l'en-tête du fichier $XML et faire exécuter la transformation " ; echo " par le navigateur, comme ".href("leadb880tr.xml","ici").". " ; finp() ; p("texte") ; echo "Pour trouver la longueur minimale et la longueur maximale ??? " ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Une deuxième transformation XSL ## ------------------------------------------------------------------------------------------- blockquote() ; p("texte") ; echo " Dans le document ".href("films2.xml").", combien y a-t-il de films ? Et d'artistes ? Combien de références pour combien de metteurs en scène ? " ; echo " On écrira une transformation $XSL qui affichera ces résultats en mode texte qu'on exécutera avec ".b("xmlstarlet")." avant " ; echo " de modifier le document pour avoir un rendu dans une page Web." ; finp() ; solution($numExo,$numSerie) ; p("texte") ; 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").". " ; echo " Encore faut-il trouver les noeuds correspondants. Pour les films et les artistes, c'est assez simple car les éléments FILM et " ; echo " ARTISTE identifient de façon unique ce qu'on cherche donc il suffit de compter //FILM et //ARTISTE. " ; finp() ; p("texte") ; echo "Pour trouver les metteurs en scène, il faut retenir les attributs id de ARTISTE qui correspondent à un attribut idref de MES, " ; echo " soit le filtre ARTISTE[@id=//MES/@idref]. Nous avons rajouté dans la solution des xsl:text pour rendre les " ; echo " affichages plus lisibles et nous avons mis le nom des metteurs en majuscules (avec des indications de solution $XSL 2) :" ; finp() ; pre_fichier("nbfa1.xsl","cadrebleu") ; pre_fichier("nbfa1_sor.txt","cadrejaune") ; p("texte") ; echo "Produire une page Web résultat est un peu plus compliqué car ???" ; finp() ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # Transformations XSL avancées ## ------------------------------------------------------------------------------------------- blockquote() ; p("texte") ; echo " On voudrait effectuer des calculs statistiques et tracer des graphiques pour étudier la longueur des protéines " ; echo " du fichier ".href("leadb880.xml").". Que peut-on calculer et tracer via $XSL ?" ; finp() ; solution($numExo,$numSerie) ; p("texte") ; echo " $XSL ne peut pas grand chose pour nous ici car $XSL est conçu pour transformer du texte, pas pour calculer. " ; echo " Par contre $XSL peut nous aider à produire un fichier $CSV utilisable par Excel, le logiciel R ou tout autre logiciel statistique. " ; 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 :" ; finp() ; pre_fichier("prot_export.xsl","cadrebleu") ; p("texte") ; 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")." :" ; finp() ; pre_fichier("prot_export.csv","cadrejaune") ; finsolution() ; finblockquote() ; ## ------------------------------------------------------------------------------------------- /* h2("Questions sans réponse écrite (donc venez en TP !)") ; blockquote() ; ul() ; debutli() ; p("texte") ; 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 " ; echo " des accents, que ce soit avec un encodage " ; echo href("https://www.alsacreations.com/astuce/lire/83-codages-ascii-latin1-etc.html","latin1") ; echo " ou " ; echo href("https://www.w3.org/International/questions/qa-changing-encoding.fr.html","UTF")." ?" ; finp() ; finli() ; debutli() ; p("texte") ; echo "Est-ce qu'un navigateur peut être ".b("validant")." c'est-à-dire refuser l'affichage d'un document $XML s'il n'est pas " ; echo " valide pour la grammaire indiquée en début de document ?" ; finp() ; finli() ; debutli() ; p("texte") ; echo "" ; finp() ; finli() ; debutli() ; p("texte") ; echo "" ; finp() ; finli() ; debutli() ; p("texte") ; echo "Après avoir vérifié qu'un document " ; echo s_span("DOCX","grouge") ; echo " ou " ; echo s_span("ODT","grouge") ; echo " est une archive (lisible par exemple par ".b("zip")."), chercher comment on peut lister tous les espaces de noms " ; echo " associés. Où trouve-t-on les grammaires pour ces documents ?" ; finp() ; finli() ; finul() ; finblockquote() ; */ ## ------------------------------------------------------------------------------------------- pvide() ; ########################################################################################### p() ; echo href("montresource.php?nomfic=l2xml_6_tp2.php","Code-source php de cette page","orange_stim nou")."." ; finp() ; finSection() ; finPage() ; ?>La coloration syntaxique est réalisée par : SyntaxHighlighter.
Si vous préférez, vous pouvez utiliser celle de geshi ou même celle construite autour de la fonction highlight_file.
Retour à la page principale de (gH)