Valid XHTML     Valid CSS2    

XML en M1 (2018), université d'Angers

    gilles.hunault@univ-angers.fr

 

T.P. numéro 2

 

Table des matières cliquable

  1. Compter des éléments ou des attributs dans un document XML

  2. Expressions XPATH

  3. Comprendre la transformation vide

  4. Réaliser une transformation minimale avec XSL

  5. Une transformation XSL élémentaire

  6. Une deuxième transformation XSL

  7. Transformations XSL avancées et statistiques

 

Il est possible d'afficher toutes les solutions via  ?solutions=1  et de les masquer via  ?solutions=0 .

1. Compter des éléments ou des attributs dans un document XML

On s'intéresse au fichier leadb880.xml suivant qui contient des données pour des protéines LEA :

Après avoir décrit la structure du fichier, donner une grammaire DTD minimale et raisonnable pour modéliser le contenu du fichier, puis compter le nombre de lignes, le nombre de lignes vides, d'élements et d'attributs. Vous pouvez utiliser tout outil logiciel qui vous parait adapté. Comment trouver le nombre d'éléments distincts ?

Solution :  

 

2. Expressions XPATH

On s'intéresse ici au document films2.xml qui contient des films et des artistes.

En voici la grammaire DTD :


     <!ELEMENT FILMSETARTISTES (FILMS,ARTISTES)>
     
     <!ELEMENT FILMS    (FILM)+>
     <!ELEMENT FILM     (TITRE,GENRE,PAYS,MES,ROLES,RESUME?)   >
     <!ELEMENT TITRE    (#PCDATA)                              >
     <!ELEMENT GENRE    (#PCDATA)                              >
     <!ELEMENT PAYS     (#PCDATA)                              >
     <!ELEMENT MES                                      EMPTY  >
     <!ELEMENT ROLES    (ROLE)*                                >
     <!ELEMENT RESUME   (#PCDATA)                              >
     
     <!ELEMENT ROLE     (PRENOM,NOM,INTITULE) >
     <!ELEMENT PRENOM   (#PCDATA)             >
     <!ELEMENT INTITULE (#PCDATA)             >
     <!ELEMENT NOM      (#PCDATA)             >
     
     <!ELEMENT ARTISTES   (ARTISTE)+                      >
     <!ELEMENT ARTISTE    (ARTNOM,ARTPRENOM,ANNEENAISS?)  >
     <!ELEMENT ARTNOM     (#PCDATA)                       >
     <!ELEMENT ARTPRENOM  (#PCDATA)                       >
     <!ELEMENT ANNEENAISS (#PCDATA)                       >
     
     <!ATTLIST ARTISTE xmlns CDATA #FIXED ''   id    CDATA #REQUIRED >
     <!ATTLIST FILM    xmlns CDATA #FIXED ''   Annee CDATA #REQUIRED >
     <!ATTLIST MES     xmlns CDATA #FIXED ''   idref CDATA #REQUIRED >
     

On fournit aussi la structure explicite du fichier (éléments seulement) obtenue à l'aide de la commande xmlstarlet el -u films2.xml :


     FILMSETARTISTES
     
     FILMSETARTISTES/ARTISTES
     FILMSETARTISTES/ARTISTES/ARTISTE
     FILMSETARTISTES/ARTISTES/ARTISTE/ANNEENAISS
     FILMSETARTISTES/ARTISTES/ARTISTE/ARTNOM
     FILMSETARTISTES/ARTISTES/ARTISTE/ARTPRENOM
     
     FILMSETARTISTES/FILMS
     FILMSETARTISTES/FILMS/FILM
     FILMSETARTISTES/FILMS/FILM/GENRE
     FILMSETARTISTES/FILMS/FILM/MES
     FILMSETARTISTES/FILMS/FILM/PAYS
     FILMSETARTISTES/FILMS/FILM/RESUME
     FILMSETARTISTES/FILMS/FILM/ROLES
     FILMSETARTISTES/FILMS/FILM/ROLES/ROLE
     FILMSETARTISTES/FILMS/FILM/ROLES/ROLE/INTITULE
     FILMSETARTISTES/FILMS/FILM/ROLES/ROLE/NOM
     FILMSETARTISTES/FILMS/FILM/ROLES/ROLE/PRENOM
     FILMSETARTISTES/FILMS/FILM/TITRE
     

Trouver comment on peut produire la liste des attributs uniques du fichier, ce que ne sait pas faire xmlstarlet. Voici ce qu'on s'attend à voir :


     FILMSETARTISTES/ARTISTES/ARTISTE/@id
     FILMSETARTISTES/FILMS/FILM/@Annee
     FILMSETARTISTES/FILMS/FILM/MES/@idref
     

A l'aide de xmllint en mode «shell», essayer ensuite de répondre aux questions suivantes :

  • Quels sont tous les titres de films ?

  • Quel est le titre du neuvième film ?

  • En quelle année est sorti le film Blade Runner ?

  • Quel en est le metteur en scène ?

  • Combien y a-t-il de films ?

  • Quels éléments contiennent le texte "Bruce" ?

Essayer enfin à l'aide de PHP via le module SimpleXML d'afficher tous les numéros de films avec leur numéro, comme ci-dessous :


     Voici tous les titres de films
       1. Vertigo
       2. Alien
       3. Titanic
       4. Sacrifice
       5. Volte/Face
       6. Sleepy Hollow
       7. American Beauty
       8. Impitoyable
       9. Gladiator
      10. Blade Runner
      11. Piège de cristal
      12. 58 minutes pour vivre
      13. Van Gogh
      14. Seven
      15. L'armée des douze singes
      16. Le nom de la rose
      17. Pulp fiction
      18. Mary à tout prix
      19. Terminator
      20. Les dents de la mer
      21. Le silence des agneaux
      22. Le prince d'Egypte
      23. Godzilla
      24. Matrix
      25. Mission: Impossible
      26. Kagemusha
      27. Les pleins pouvoirs
      28. Le gendarme et les extra-terrestres
      29. Les frères pétards
      30. Le monde perdu
      31. Rain Man
      32. Top Gun
      33. Les bronzés font du ski
      34. MICROCOSMOS
      35. Psychose
      36. Le retour du Jedi
      37. Les oiseaux
      38. Reservoir dogs
      39. Eyes Wide Shut
      40. Shining
      41. Pas de printemps pour Marnie
      42. Fenêtre sur cour
      43. La mort aux trousses
      44. Jeanne d'Arc
      45. Le cinquième élément
      46. Léon
      47. Nikita
      48. Le grand bleu
     

Solution :  

 

3. Comprendre la transformation vide

Que produit la transformation vide définie dans le fichier vide.xsl si on l'applique aux fichiers eau.xml, eau2.xml, trajets.xml et firefox.svg du T.P. 1 ?


     <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version="1.0">
     <xsl:output method="text" encoding="UTF-8" />
     </xsl:stylesheet>
     

Quelle est, pour ces fichiers, la différence avec la transformation minimaliste nommée minimaliste.xsl ?


     <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version="1.0">
     <xsl:output method="text" encoding="UTF-8" />
     <xsl:template match="/"><xsl:apply-templates /></xsl:template>
     </xsl:stylesheet>
     

Solution :  

 

4. Réaliser une transformation minimale avec XSL

Que faut-il ajouter à la transformation minimaliste définie dans le fichier minimaliste.xsl pour qu'elle n'affiche que les noms d'atome si on l'applique au fichier eau2.xml ?

Solution :  

 

5. Une transformation XSL élémentaire

On voudrait compter le nombre de protéines du fichier leadb880.xml et vérifier que chaque protéine a bien un attribut length. Trouver une solution en ligne de commandes puis à l'aide d'une transformation XSL. Comment peut-on trouver la plus petite longueur de protéine et la plus grande via XSL ?

Ecrire ensuite un script PHP qui trouve la plus petite longueur de protéine et la plus grande.

Solution :  

 

6. Une deuxième transformation XSL

Dans le document films2.xml, combien y a-t-il de films ? Et d'artistes ? Combien de références pour combien de metteurs en scène ? On écrira une transformation XSL qui affichera ces résultats en mode texte qu'on exécutera avec xmlstarlet avant de modifier le document pour avoir un rendu dans une page Web valide pour la grammaire XHTML Strict.

Remarque : on pourra utiliser le fichier stdWeb2.xsl qui contient des sous-programmes XSL adaptés à la production de pages Web.

Fichier stdWeb2.xsl

Solution :  

 

7. Transformations XSL avancées et statistiques

On voudrait effectuer des calculs statistiques et tracer des graphiques pour étudier statistiquement la longueur des protéines du fichier leadb880.xml. Que peut-on calculer et tracer via XSL ?

Est-ce qu'écrire un script PHP est ici adapté ?

Solution :  

 

Questions sans réponse affichée dans le navigateur (donc venez en TP !)

  • Pourquoi est-ce difficile de construire une grammaire XSD fine et précise pour les protéines LEA si on n'est pas biologiste ?

  • Comment faire pour trouver les attributs uniques si on ne connait pas l'option -u de la commande sort ?

  • Peut-on compter des "non-éléments" ou des éléments sans attributs ? Par exemple, pour films2.xml combien manque-t-il de résumés ? et de dates de naissance ?

  • Pourquoi faut-il compter les attributs avec /@ plutôt qu'avec seulement @  ?

 

Code-source php de cette page.

 

 

retour gH    Retour à la page principale de   (gH)