Valid XHTML     Valid CSS2    

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&nbsp;:" ;
        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&nbsp;?" ;
        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&nbsp;:" ;
        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&nbsp;:") ;
        finp() ;
        
        pre_fichier("leadb_dtd.txt","cadrebleu") ;
        
        p("texte") ;
        echo " Avec la commande ".b("xmlstarlet&nbsp;el&nbsp;-u")." on dispose de la structure des données &nbsp;:" ;
        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&nbsp;:" ;
        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")."&nbsp;:" ;
        finp() ;
        
        pre_fichier("films2_stru.txt","cadrejaune") ;
        
        p("texte") ;
        echo "A l'aide de ".b("xmllint")." en mode ".em("&laquo;shell&raquo;").", essayer de répondre aux questions suivantes&nbsp;:" ;
        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&nbsp;?" ;
        finp() ; finli() ;
        
        debutli() ; p("texte") ;
          echo "Quel est le titre du neuvième film&nbsp;?" ;
        finp() ; finli() ;
        
        debutli() ; p("texte") ;
          echo "En quelle année est sorti le film ".em("Blade Runner")."&nbsp;?" ;
        finp() ; finli() ;
        
        debutli() ; p("texte") ;
          echo "Quel en est le metteur en scène&nbsp;?" ;
        finp() ; finli() ;
        
        finul() ;
        
        solution($numExo,$numSerie) ;
        
        p("texte") ;
        echo " Voici les instructions à exécuter pour répondre aux questions&nbsp;:" ;
        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&nbsp;?" ;
        finp() ;
        
        solution($numExo,$numSerie) ;
        
        p("texte") ;
        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. " ;
        echo " L'attribut ".b("length").", lui, peut se repérer gr&acirc;ce à l'expression ".b("&lt;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&nbsp;:" ;
        finp() ;
        
        pre_fichier("leadb_prot.txt","cadrebleu") ;
        
        
        p("texte") ;
        echo "Pour effectuer une transformation $XSL qui réalise les m&ecirc;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")."&nbsp;:") ;
        finp() ;
        
        pre_fichier("proteines.xsl","cadrebleu") ;
        
        p("texte") ;
        echo "Pour exécuter cette transformation, on peut utiliser ".b("xsltproc")."&nbsp;:" ;
        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")."&nbsp;:"  ;
        finp() ;
        
        pre_fichier("proteines_sh2.txt","cadrebleu") ;
        
        
        p("texte") ;
        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 " ;
        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&nbsp;? Et d'artistes&nbsp;? Combien de références pour combien de metteurs en scène&nbsp;? " ;
        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)&nbsp;:" ;
        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&nbsp;?" ;
        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&nbsp;:" ;
        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")."&nbsp;:" ;
        finp() ;
        
        pre_fichier("prot_export.csv","cadrejaune") ;
        
        finsolution() ;
        
        finblockquote() ;
        
        ## -------------------------------------------------------------------------------------------
        
        /*
        
        h2("Questions sans réponse écrite (donc venez en TP&nbsp;!)") ;
        
        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")."&nbsp;?" ;
          finp() ; finli() ;
        
          debutli() ; p("texte") ;
           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 " ;
           echo " valide pour la grammaire indiquée en début de document&nbsp;?" ;
          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&nbsp;?" ;
          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 gH    Retour à la page principale de   (gH)