site de Fabien Torre, université de Lille


Corrections des travaux pratiques sur XML

Des corrections, exemples pour les différents exercices sur les DTD, XPath, XSLT, SAX, etc.

Modélisation et documents XML

Éléments de correction pour les exercices de modélisation.

Les articles

Les brèves

Le championnat de football

Les acteurs de cinéma

Les films de cinéma

Les bandes dessinées de Florent

La CDthèque

Requêtes XPath

Éléments de correction pour les exercices sur XPath.

Les articles

  1. /
    
    ou pour l'élément racine :
    
    /child::*
    /*
    
  2. /descendant::node()
    //node()
    
    ou à partir de l'élément racine :
    
    /child::*/descendant::node()
    /*//node()
    
  3. /descendant::*/attribute::*
    //@*
    
  4. /descendant::text()
    //text()
    
  5. /descendant::processing-instruction()
    //processing-instruction()
    
  6. /descendant::processing-instruction('xml-stylesheet')
    //processing-instruction('xml-stylesheet')
    
  7. /descendant::p/child::text()
    //p/text()
    
  8. /descendant::p[child::important]
    //p[important]
    
  9. /descendant::référence[attribute::code='siteMarc']
    //référence[@code='siteMarc']
    
  10. /descendant::*/child::auteur[position()=2]
    //*/auteur[2]
    
    /descendant::auteur[count(preceding::auteur)=1]
    //auteur[count(preceding::auteur)=1]
    
    /descendant::auteur[(preceding::auteur) and not(preceding::auteur/preceding::auteur)]
    //auteur[(preceding::auteur) and not(preceding::auteur/preceding::auteur)]
    

Les acteurs de cinéma

  1. /child::liste_acteurs/child::acteur
    /liste_acteurs/acteur
    /descendant::acteur
    //acteur
    
  2. count(/child::liste_acteurs/child::acteur)
    count(/liste_acteurs/acteur)
    count(/descendant::acteur)
    count(//acteur)
    
  3. /descendant::comment()
    //comment()
    
  4. /descendant::comment()[position()=2]
    //comment()[2] NON !!!
    
  5. /descendant::acteur[position()=1]/node()[position()=1]
    //acteur[1]/node()[1]
    
  6. /descendant::acteur[position()=2]/node()[position()=1]
    //acteur[2]/node()[1]
    
  7. /descendant::acteur/*[position()=1 or position()=2]
    //acteur/*[position()<=2]
    
  8. /descendant::acteur/*[position()=last()]
    //acteur/*[last()]
    
  9. /descendant::acteur[attribute::id='clint']
    //acteur[@id='clint']
    
  10. /descendant::acteur[child::prenom/text()='Clint']
    //acteur[prenom='Clint']
    
  11. /descendant::acteur/child::biographie/child::p[last()=2]/parent::biographie/parent::acteur/child::nom/text()
    //acteur/biographie/p[last()=2]/../../nom/text()
    /descendant::acteur/child::biographie/child::p[last()=2]/ancestor::acteur/child::nom/text()
    
    /descendant::acteur/child::nom/child::text()[count(ancestor::acteur/child::biographie/child::p)=2]
    //acteur/nom/text()[count(../../biographie/p)=2]
    

Le championnat de football

  1. /descendant::JOURNEE[attribute::NUMERO < 8]      
    //JOURNEE[@NUMERO < 8]
    
    /descendant::JOURNEE[attribute::NUMERO=8]/preceding-sibling::JOURNEE 
    //JOURNEE[@NUMERO=8]/preceding-sibling::JOURNEE
    
  2. /descendant::JOURNEE[attribute::NUMERO=4]/child::RENCONTRE
    //JOURNEE[@NUMERO=4]/RENCONTRE
    
  3. /descendant::JOURNEE/child::RENCONTRE[position()=1]
    //JOURNEE/RENCONTRE[1]
    
  4.   /descendant::JOURNEE[attribute::NUMERO=10]/child::RENCONTRE[attribute::DOMICILE='Bastia']/attribute::EXTERIEUR
    | /descendant::JOURNEE[attribute::NUMERO=10]/child::RENCONTRE[attribute::EXTERIEUR='Bastia']/attribute::DOMICILE
    
      //JOURNEE[@NUMERO=10]/RENCONTRE[@DOMICILE='Bastia']/@EXTERIEUR
    | //JOURNEE[@NUMERO=10]/RENCONTRE[@EXTERIEUR='Bastia']/@DOMICILE
    
  5.   /descendant::RENCONTRE[attribute::DOMICILE='Bastia']/attribute::EXTERIEUR
    | /descendant::RENCONTRE[attribute::EXTERIEUR='Bastia']/attribute::DOMICILE
    //RENCONTRE[@DOMICILE='Bastia']/@EXTERIEUR | //RENCONTRE[@EXTERIEUR='Bastia']/@DOMICILE
    
  6. /descendant::RENCONTRE[attribute::SCORED='-']
    //RENCONTRE[@SCORED='-']
    
  7. /descendant::RENCONTRE[attribute::DOMICILE='Bastia' and attribute::SCORED!='-'
                       and attribute::SCORED=attribute::SCOREE]
    //RENCONTRE[@DOMICILE='Bastia' and @SCORED!='-' and @SCORED=@SCOREE]
    
  8. count(/descendant::RENCONTRE[attribute::SCORED!='-' and attribute::SCORED=attribute::SCOREE])
    count(//RENCONTRE[@SCORED!='-' and @SCORED=@SCOREE])
    
    100 .* count(/descendant::RENCONTRE[attribute::SCORED!='-' and attribute::SCORED=attribute::SCOREE])
       div count(/descendant::RENCONTRE[attribute::SCORED!='-'])
    100*count(//RENCONTRE[@SCORED!='-' and @SCORED=@SCOREE]) div count(//RENCONTRE[@SCORED!='-'])
    
  9. count(/descendant::RENCONTRE[attribute::SCORED>attribute::SCOREE])
    count(//RENCONTRE[@SCORED>@SCOREE])
    
    100 * count(/descendant::RENCONTRE[attribute::SCORED>attribute::SCOREE])
      div count(/descendant::RENCONTRE[attribute::SCORED!='-'])
    100*count(//RENCONTRE[@SCORED>@SCOREE]) div count(//RENCONTRE[@SCORED!='-'])
    
  10. count(/descendant::RENCONTRE[attribute::SCORED<attribute::SCOREE])
    count(//RENCONTRE[@SCORED<@SCOREE])
    
    100 * count(/descendant::RENCONTRE[attribute::SCORED<attribute::SCOREE])
      div count(/descendant::RENCONTRE[attribute::SCORED!='-'])
    100*count(//RENCONTRE[@SCORED<@SCOREE]) div count(//RENCONTRE[@SCORED!='-'])
    

Les brèves

Correction fournie par Grégoire Laurence, merci à lui !

  1. /descendant-or-self::node()
    //node() Il en manque, non ?
    
  2. /descendant::*
    //*
    
  3. soit uniquement les attributs href :

    /descendant::*/attribute::href
    //@href
    

    soit tous les attributs dont le contenu commence par http :

    /descendant::*/attribute::*[starts-with (self::node(),'http')]
    //@*[starts-with (.,'http')]
    
  4. count(/descendant::breve)
    count(//breve)
    
  5. /descendant::breve/child::titre/child::text()
    //breve/titre/text()
    
  6. /descendant::breve[attribute::theme="sport"]
    //breve[@theme="sport"]
    
  7. /descendant::breve[child::photo]
    //breve[photo]
    
  8. /descendant::breve[starts-with(child::titre/child::text(),"D")]
    //breve[starts-with(titre/text(),"D")]
    
  9. /descendant::breve[contains(child::texte/child::text(),"marathon")]
    //breve[contains(texte/text(),"marathon")]
    
  10. /descendant::breve[attribute::theme="actu"]/following::*
    //breve[@theme="actu"]/following::*
    

Les films

Correction fournie par Grégoire Laurence, merci à lui !

  1. count(/descendant::film)
    count(//film)
    
  2. /descendant::comment()
    //comment()
    
  3. /child::films/child::film[position()=2]/child::casting/child::acteur
    //film[2]//acteur
    
  4. /descendant::film[attribute::lang="en"]/child::titre/child::text()
    //film[@lang="en"]/titre/text()
    
  5. /descendant::acteur[attribute::id="lukemonfils"]/attribute::personnage
    //acteur[@id="lukemonfils"]/@personnage
    
  6. /descendant::film[child::annee="1981"]/child::titre/child::text()
    //film[annee/text()="1981"]/titre/text()
    
  7. count(/descendant::perso[attribute::ref="indy"])
    count(//perso[@ref="indy"])
    
  8. /descendant::film[count(child::casting/child::acteur)=0]
    //film[count(.//acteur)=0]
    
  9. /descendant::film[contains(child::realisateur,",")]
    //film[contains(realisateur,",")]
    mauvaise DTD ?
    
  10. /descendant::film[contains(child::synopsis,"believe")]
    //film[contains(synopsis,"believe")]
    

Les TODO list

  1. /descendant::*/attribute::*
    //@*
    
  2. /descendant-or-self::comment()
    //comment()
    
  3. /descendant-or-self::text()
    //text()
    
  4. /descendant::*[attribute::deadline][position()=2]/attribute::deadline
    //*[@deadline][2]/@deadline
    
  5. /descendant::item[position()=1]
    -
    
  6. /descendant::items/child::item[position()=1]
    //item[1]
    
  7. /descendant::item[attribute::level='critic']/parent::items/parent::todo/child::title/text()
    //todo[.//@level='critic']/title/text()
    
  8. /descendant::todo[not(child::commentaires)]/child::title/child::text()
    //todo[not(.//commentaires)]/title/text()
    
  9. /descendant::*/attribute::url
    .//@url
    
  10. count(/descendant::todo[position()=2]/child::commentaires/child::par)
    count(//todo[2]/commentaires/par)
    
  11. /descendant::todo[attribute::illustration='sapin.jpg']/child::title/child::text()
    //todo[@illustration='sapin.jpg']/title/text()
    

Les bandes dessinées

Correction fournie par Grégoire Laurence, merci à lui !

  1. count(/child::bdtheque/child::collection/descendant::bd)
    count(//collection//bd)
    
  2. /child::bdtheque/child::collection/child::bd
    //bd[not(ancestor::serie)]
    
  3. /descendant::titreserie
    //titreserie
    

    et si titreserie n'était pas propre aux séries :

    /descendant::serie/child::titreserie
    //serie/titreserie
    
  4. count(/descendant::serie[child::titreserie/child::text()="Lanfeust de Troy"]/child::bd)
    count(//serie[titreserie/text()="Lanfeust de Troy"]/bd)
    
  5. /descendant::*/attribute::illustration
    //@illustration
    
  6. /descendant::bd[child::illustrateur/attribute::ref=/descendant::personne[child::nom="Larcenet"
                                                                         and child::prenom="Manu"]/attribute::id]
    
    //bd[illustrateur/@ref=//personne[nom="Larcenet" and prenom="Manu"]/@id]
    

    explication : d'abord on cherche l'identifiant de "Manu Larcenet" //personne[nom="Larcenet" and prenom="Manu"]/@id et ensuite on cherche les bd référençant cet illustrateur... en plus simple si l'on connait déjà l'identifiant :

    /descendant::bd[child::illustrateur/attribute::ref="Larcenet"]
    //bd[illustrateur/@ref="Larcenet"]
    
  7. /descendant::personne[child::prenom="Riad"]/attribute::id
    //personne[prenom="Riad"]/@id
    
  8. /descendant::personne[child::nom="Larcenet" and child::prenom="Manu"]/preceding-sibling::*
    //personne[nom="Larcenet" and prenom="Manu"]/preceding-sibling::*
    

    les autres personnes définies étant des frères de l'élément sélectionné ; ou pour être plus prudent :

    /descendant::personne[child::nom="Larcenet" and child::prenom="Manu"]/preceding-sibling::personne
    //personne[nom="Larcenet" and prenom="Manu"]/preceding::personne
    
  9. /descendant::bd[starts-with(child::titre,"L")]/child::sortie/child::text()
    //bd[starts-with(titre,"L")]/sortie/text()
    
  10. /descendant::bd[contains(child::resume,"oiseau")]
    //bd[contains(resume,"oiseau")]
    
  11. /descendant-or-self::bd[position()=2]
    /descendant-or-self::bd[2]
    attention ! différent de //bd[2].
    

Transformations XSLT

Éléments de correction pour les exercices sur le langage XSLT.

Les brèves

Le championnat de football

Les acteurs de cinéma

Les films de cinéma

Les sujets abordés dans une formation

Transformation des TODO list

Les sujets abordés dans une formation (épisode 2, le retour)

Tourner les tables

  • la feuille XSLT provoquant le retournement des tables : voir, récupérer ;

Coloration syntaxique d'un fichier XML

Calcul de la fonction factorielle

Résolution des tours de Hanoï

Tester la conjecture de Syracuse

Python et SAX

Éléments de correction pour les exercices SAX en Python.

Le championnat de football

Les acteurs

Python et DOM

Éléments de correction pour les exercices DOM en Python.

Extraction de méta-données

Le programme Python/DOM : voir, récupérer.

Fonctions utiles

Le programme Python/DOM : voir, récupérer.

Fabien Torre Valid HTML5! Valid CSS!
Accueil > Enseignement > En pratique > Documents numériques > XML > Solutions
(contenu mis à jour )
site de Fabien Torre, université de Lille

Description

Survoler un lien de navigation pour lire sa description ici...


Une photo au hasard

Voyage à Venise.

Premiers pas dans la ville.

(le 2 mars 2007)

Campo del Arsenale.