Valid XHTML     Valid CSS2    

Listing du fichier webrd02.php

 

00001     <?php
00002     error_reporting(
E_ALL E_NOTICE E_STRICT) ;
00003     include("std.php"
) ;
00004     include("../xmlstd.php"
) ;
00005     include("webrd_inc.php"
) ;
00006     
00007     #    (gH)   -_-  webrd02.php  ;  TimeStamp (unix) : 08 Octobre 2012 vers 09:57
00008     
00009     debutPageWrd
(2) ;
00010     $DTD   
rouge("DTD") ;
00011     $XSD   
rouge("XSD") ;
00012     $XML   
bleu("XML") ;
00013     $XSL   
rouge("XSL") ;
00014     $HTML  
bleu("HTML") ;
00015     $HTML5 
bleu("HTML5") ;
00016     $XHTML 
bleu("XHTML") ;
00017     
00018     ## -------------------------------------------------------------------------------------------
00019     
00020     debutSection
() ;
00021     
00022     $tableauDesRubriques 
= array() ;
00023     $idr 
;
00024     $idr
++; $tableauDesRubriques[$idr] = "Ecriture de grammaires élémentaires" ;
00025     $idr
++; $tableauDesRubriques[$idr] = "Grammaires moins élémentaires" ;
00026     $idr
++; $tableauDesRubriques[$idr] = "Lecture de grammaires courantes de petite taille" ;
00027     $idr
++; $tableauDesRubriques[$idr] = "Lecture de grammaires courantes de grande taille" ;
00028     $idr
++; $tableauDesRubriques[$idr] = "Conversions entres grammaires $DTD et $XSD ; vérification de grammaires" ;
00029     $idr
++; $tableauDesRubriques[$idr] = "Contraintes et facettes dans les schémas $XSD;
00030     $idr
++; $tableauDesRubriques[$idr] = "Autres grammaires dont ".rouge("Relax NG")."&nbsp;; espaces de noms" ;
00031     $idr
++; $tableauDesRubriques[$idr] = "Questions diverses " ;
00032     $idr
++; $tableauDesRubriques[$idr] =
00033     $tdmCRLM 
= new tdm($tableauDesRubriques) ;
00034     $tdmCRLM
->titre() ;
00035     $tdmCRLM
->menu("oui","oui","nou") ;
00036     
00037     pvide
() ;
00038     
00039     p
() ;
00040      echo "Il est possible d'afficher toutes les solutions via "
.href("webrd02.php?solutions=1","?solutions=1","bouton_fin jaune_pastel nou").". " ;
00041     finp
() ;
00042     
00043     finSection
() ;
00044     
00045     debutSection
() ;
00046     $numExo 
;
00047     
00048     ## -------------------------------------------------------------------------------------------
00049     
00050     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Grammaires élémentaires
00051     
00052     ## -------------------------------------------------------------------------------------------
00053     
00054     blockquote
() ;
00055     
00056     
00057     p
("texte") ;
00058     echo "Ecrire des grammaires "
.rouge("DTD")." élémentaires associées aux fichiers " ;
00059     echo href
("serv00.xml").", ".href("serv01.xml")."... ".href("serv05.xml")." de la série 1 d'exercices. " ;
00060     echo "On nommera "
.b("serv00.dtd").", ".b("serv01.dtd")."... ".b("serv05.dtd")." les fichiers-grammaires correspondants. " ;
00061     echo " Ecrire ensuite les grammaires élémentaires "
.rouge("XSD")." associées. " ;
00062     finp
() ;
00063     
00064     p
("texte") ;
00065     echo "Ecrire les grammaires "
.rouge("DTD")." élémentaires associées aux fichiers " ;
00066     echo href
("pers01.xml").", ".href("pers02.xml")."... ".href("pers04.xml")." de la série 1 d'exercices. " ;
00067     echo "On nommera "
.b("pers01.dtd").", ".b("pers02.dtd")."... ".b("pers04.dtd")." les fichiers-grammaires correspondants. " ;
00068     echo " Ecrire ensuite les grammaires "
.rouge("XSD")." associées. " ;
00069     finp
() ;
00070     
00071     p
("texte") ;
00072     echo " Peut-on imposer que les dates de naissance sont des entiers positifs supérieurs à 1870&nbsp;?" 
;
00073     finp
() ;
00074     
00075     p
("texte") ;
00076     echo "Idem avec les fichiers "
.href("fasta01.xml")." à ".href("fasta05.xml")." puis pour ".href("agences03.xml")." et ".href("agences04.xml").". " ;
00077     echo "Peut-on faire un "
.em("include")." des grammaires ".b("services")." et ".b("personnes")." pour créer une " ;
00078     echo " grammaire agences&nbsp;?" 
;
00079     finp
() ;
00080     
00081     p
("texte") ;
00082     echo b
("Remarque")." : après avoir écrit &laquo;à la main&raquo; les grammaires, on pourra essayer de trouver un générateur de tels fichiers au vu " ;
00083     echo " d'un fichier "
.bleu("XML")." type. " ;
00084     finp
() ;
00085     
00086     solution
($numExo) ;
00087     
00088     ## -------------------------------------------------------------------------------------------
00089     
00090     h3
("$numExo.1 Grammaires pour les services") ;
00091     
00092     p
("texte") ;
00093     echo "La première série de grammaires "
.bleu("DTD")." est facile à construire puisqu'on a peu de niveaux dans la hiérarchie. " ;
00094     echo " Une fois qu'on a compris qu'un élément se déclare par "
.b("&lt;!ELEMENT ...&gt;") ;
00095     echo " et que pour déclarer que Y est un attribut de X, il faut écrire  "
.b("&lt;!ATTLIST X Y...&gt;") ;
00096     echo ", le plus dur est fait pour les "
.b("DTD").". Comme l'énoncé ne précise aucune contrainte particulière, nous avons choisi la solution minimale&nbsp;: " ;
00097     echo " nous avons considéré que "
.vert("services")." ne pouvait pas &ecirc;tre vide, que ".vert("nomDeService")." et ".vert("numService") ;
00098     echo " sont simplement des chaines de caractères obligatoires en tant qu'attribut, " 
;
00099     echo " d'où le contenu "
.b("(#PCDATA)")." pour les éléments et ".b("CDATA #REQUIRED")." pour les attributs. " ;
00100     finp
() ;
00101     
00102     p
("texte") ;
00103     echo "Seule la grammaire "
.href("serv03.dtd")." mérite un peu plus d'attention car la présence de retour-charriot " ;
00104     echo " dans "
.href("serv03.xml")." emp&ecirc;che la définition en type " ;
00105     echo b
("EMPTY")." pour service." ;
00106     finp
() ;
00107     
00108     $listeXml1 
listeFichiers("serv0",0,5,"xml") ;
00109     $listeDtd1 
listeFichiers("serv0",0,5,"dtd") ;
00110     $listeXsd1 
listeFichiers("serv0",0,5,"xsd") ;
00111     $liste1    
"$listeXml1 <p> $listeDtd1 <p> $listeXsd1;
00112     montreListe
($liste1,"visuListe1",20) ;
00113     
00114     
00115     p
("texte") ;
00116     echo "Pour les grammaires "
.bleu("XSD").", il y a le choix de définir directement les éléments dans la hiérarchie, comme pour ".href("serv00.xsd") ;
00117     echo " ou de définir des références aux éléments puis de définir les éléments, comme pour "
.href("serv01.xsd").". " ;
00118     echo " Ainsi, au lieu de "
.href("serv05.xsd").", nous aurions pu définir ".href("serv05autre.xsd").". Après réflexion, il nous semble que l'approche par " ;
00119     echo " référence est plus modulaire. Ce sera donc celle que nous allons privilégier dans la suite des exercices." 
;
00120     finp
() ;
00121     ## -------------------------------------------------------------------------------------------
00122     
00123     h3
("$numExo.2 Grammaires pour les personnes") ;
00124     
00125     $listeXml2 
listeFichiers("pers0",1,4,"xml") ;
00126     $listeDtd2 
listeFichiers("pers0",1,4,"dtd") ;
00127     $listeXsd2 
listeFichiers("pers0",1,4,"xsd") ;
00128     $liste2    
"$listeXml2 <p> $listeDtd2 <p> $listeXsd2;
00129     montreListe
($liste2,"visuListe2",30,110) ;
00130     
00131     ## -------------------------------------------------------------------------------------------
00132     
00133     # comment dire que badfasta01dtd.xml n'est pas valide car il y a deux fois le meme élément qui sert d'id ?
00134     # les "id" du NCBI ne sont pas des ID !! (car certains commencent par des lettres).
00135     
00136     h3
("$numExo.3 Grammaires pour les séquences Fasta") ;
00137     
00138     $listeXml3 
listeFichiers("fasta0",1,5,"xml") ;
00139     $listeDtd3 
listeFichiers("fasta0",1,5,"dtd") ;
00140     $listeXsd3 
listeFichiers("fasta0",1,5,"xsd") ;
00141     $liste3    
"$listeXml3 <p> $listeDtd3 <p> $listeXsd3;
00142     montreListe
($liste3,"visuListe3",20) ;
00143     
00144     ## -------------------------------------------------------------------------------------------
00145     
00146     h3
("$numExo.4 Grammaires pour les agences") ;
00147     
00148     $listeXml4 
"agences03dtd.xml agences04dtd.xml  agences05dtd.xml" ;
00149     $listeDtd4 
listeFichiers("agences0",3,5,"dtd") ;
00150     $listeXsd4 
listeFichiers("agences0",3,5,"xsd") ;
00151     $liste4    
"$listeXml4 <p> $listeDtd4 <p> $listeXsd4;
00152     montreListe
($liste4,"visuListe4",20) ;
00153     
00154     
00155     p
("texte") ;
00156     echo "Comme le montre la grammaire "
.href("agences05.dtd").", il est possible de réaliser des ".em("include")." pour une $DTD " ;
00157     echo " à l'aide des entités paramétriques qu'on utilise avec "
.b("%").", à ne pas confondre avec une entité classique qui s'utilise avec ".b("&amp;").". " ;
00158     echo 
$XSD fournit des mécanismes plus complets avec ".b("xs:include")." et ".b("xs:import")." mais plus difficiles à mettre en oeuvre à cause des " ;
00159     echo " espaces des noms. " 
;
00160     finp
() ;
00161     
00162     # utiliser include et import comme "vraie solution"
00163     
00164     ##essayer mode mixte
00165     ##<fastas>
00166     ##<fasta>
00167     ##<id>1</id>
00168     ##<aa>
00169     ##<longueur>3</longueur>
00170     ##SEQ
00171     ##</aa>
00172     ##</fasta>
00173     ##</fastas>
00174     
00175     ## -------------------------------------------------------------------------------------------
00176     
00177     h3
("$numExo.5 A propos de la génération automatique de grammaires") ;
00178     
00179     p
("texte") ;
00180     echo "Une fois la syntaxe des fichiers 
$DTD et $XSD maitrisée, un outil comme " ;
00181     echo href
("http://www.thaiopensource.com/relaxng/trang.html","trang") ;
00182     echo " permet d'automatiser la génération de grammaires à partir d'un ou plusieurs fichiers 
$XML. " ;
00183     echo " Voici, avec la forme longue puis avec la forme courte, comment générer respectivement " 
;
00184     echo " une grammaire 
$DTD puis une grammaire $XSD pour le fichier ".href("serv00.xml")."&nbsp;:" ;
00185     finp
() ;
00186     
00187     pre_fichier
("trang_xmp.txt","cadre") ;
00188     
00189     p
("texte") ;
00190     echo "Voici les grammaires produites&nbsp;:" 
;
00191     finp
() ;
00192     
00193     pre_fichier
("services.dtd","cadrebleu") ;
00194     
00195     pre_fichier
("services.xsd","cadrejaune") ;
00196     
00197     p
("texte") ;
00198     echo "Attention quand m&ecirc;me à relire les grammaires générées car il peut y avoir des surprises&nbsp;!" 
;
00199     finp
() ;
00200     
00201     finsolution
() ;
00202     
00203     finblockquote
() ;
00204     
00205     ## -------------------------------------------------------------------------------------------
00206     
00207     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Ecriture de grammaires moins élémentaires
00208     
00209     ## -------------------------------------------------------------------------------------------
00210     
00211     blockquote
() ;
00212     
00213     p
("texte") ;
00214     echo "Ecrire les grammaires "
.rouge("DTD")." et ".rouge("XSD")." associées au fichier " ;
00215     echo href
("dessin.xml")." de la série 1 d'exercices. " ;
00216     echo "On nommera "
.b("dessin.dtd")." et ".b("dessin.xsd")." les fichiers-grammaires correspondants. " ;
00217     echo " On essaiera de paramétrer l'attribut couleur qui est commun. " 
;
00218     finp
() ;
00219     
00220     p
("texte") ;
00221     echo "Ecrire un fichier minimal "
.b("ouimaisnon.xml")." qui est valide pour la grammaire ".href("g1.dtd")."  mais " ;
00222     echo " non valide pour la grammaire "
.href("g2.dtd").". " ;
00223     echo " Fournir ensuite un fichier "
.b("livre.xml")." valide pour ".href("g2.dtd").". " ;
00224     finp
() ;
00225     
00226     p
("texte") ;
00227     echo "Ecrire une grammaire pour le fichier "
.href("films2.xml","films2")." en ".rouge("DTD")." puis en ".rouge("XSD").". " ;
00228     echo " Pourquoi ne peut-on pas parler de "
.b("la")." grammaire ".rouge("DTD")." d'un fichier&nbsp;?" ;
00229     finp
() ;
00230     
00231     solution
($numExo) ;
00232     
00233     h3
("$numExo.1 Solution pour ".href("dessin.xml")) ;
00234     
00235     p
("texte") ;
00236     echo "Là encore, pour "
.href("dessin.xml").", il y a peu d'éléments et d'attributs dans ".href("dessin.xml")." donc une grammaire ".bleu("DTD") ;
00237     echo " &laquo;vite fait&raquo; peut &ecirc;tre "
.href("dessin.dtd")." dont le contenu est&nbsp;:" ;
00238     finp
() ;
00239     
00240     pre_fichier
("dessin.dtd","cadre",0,1) ;
00241     
00242     p
("texte") ;
00243     echo "Pour forcer les couleurs à ne prendre que les valeurs autorisées, on peut utiliser une liste de valeurs, soit&nbsp;:" 
;
00244     finp
() ;
00245     
00246     pre_fichier
("dessin2.dtd","cadre") ;
00247     p
("texte") ;
00248     echo "Pour éviter la duplication par copier/coller de cette liste des couleurs, le mieux est d'utiliser une entité paramétrique, qui fonctionne " 
;
00249     echo " comme une entité "
.b("HTML")." mais qui commence par le symbole ".b("%")." (pourcent)&nbsp;:" ;
00250     echo "" 
;
00251     finp
() ;
00252     
00253     pre_fichier
("dessin3.dtd","cadre") ;
00254     
00255     p
("texte") ;
00256     echo "On peut aller encore plus loin et intégrer la couleur par défaut dans l'entité ou décider qu'il est plus " 
;
00257     echo " modulaire de définir une autre entité pour la couleur par défaut&nbsp;" 
;
00258     finp
() ;
00259     
00260     pre_fichier
("dtdt4et5.txt","cadrebleu") ;
00261     
00262     p
("texte") ;
00263     echo "Voici donc les 5 grammaires 
$DTD possibes et leur traduction automatique en schéma $XSD&nbsp;:" ;
00264     finp
() ;
00265     
00266     blockquote
() ;
00267     $listeDtd4 
listeFichiers("dessin",1,5,"dtd") ;
00268     $listeXsd4 
listeFichiers("dessin",1,5,"xsd") ;
00269     $liste4    
"$listeDtd4 <p> $listeXsd4;
00270     montreListe
($liste4,"visuListe5",20) ;
00271     finblockquote
() ;
00272     
00273     
00274     ## -------------------------------------------------------------------------------------------
00275     
00276     h3
("$numExo.2 Solution pour les grammaires ".href("g1.dtd")." et ".href("g2.dtd")) ;
00277     
00278     p
("texte") ;
00279     echo "Il ne faut pas se laisser impressionner par la longueur de la grammaire "
.href("g1.dtd")." car de nombreux de ses éléments sont facultatifs&nbsp;:" ;
00280     finp
() ;
00281     
00282     pre_fichier
("g1.dtd","cadrejaune") ;
00283     
00284     p
("texte") ;
00285     echo "Donc si on se focalise sur les éléments obligatoires, on peut se limiter à un fichier "
.href("ouimaisnon.xml")." comme celui-ci&nbsp;:" ;
00286     finp
() ;
00287     
00288     pre_fichier
("ouimaisnon.xml","cadre") ;
00289     
00290     p
("texte") ;
00291     echo "On notera au passage ce que permet le mot clé "
.b("ANY")." pour l'élément ".bleu("references").", qui, s'il permet de tester des documents en cours " ;
00292     echo " de rédaction, n'est pas très contraignant. De m&ecirc;me en ce qui concerne "
.b("(#PCDATA|chapitre)*")." pour l'élément ".bleu("chapitres").". " ;
00293     echo " Pour vérifier que ce fichier est valide pour g1 mais non pour g2, le plus simple est d'utiliser xmlstarlet " 
;
00294     echo " ou xmllint car on n'a pas besoin d'écrire " 
;
00295     echo " explicitement "
.vert("&lt;!DOCTYPE")." avant l'élément racine, ce que ne permet pas rxp&nbsp;:" ;
00296     finp
() ;
00297     
00298     pre_fichier
("ouimaisnon_validation.txt","cadre") ;
00299     
00300     p
("texte") ;
00301     echo "Par contre, la grammaire "
.href("g2.dtd")." est plus exigeante que la grammaire ".href("g1.dtd")."&nbsp;:" ;
00302     finp
() ;
00303     
00304     pre_fichier
("g2.dtd","cadrejaune") ;
00305     
00306     p
("texte") ;
00307     echo "Donc un fichier "
.href("livre.xml")." valide pour g2 est un peu plus technique et demande un peu plus de réflexion&nbsp;:" ;
00308     finp
() ;
00309     
00310     pre_fichier
("livre.xml","cadre") ;
00311     
00312     /* à compléter
00313     p("texte") ;
00314     echo "On remarquera que... " ;
00315     finp() ;
00316     */
00317     
00318     p
("texte") ;
00319     echo "Afin de vous entrainer à la lecture synoptique et comparative de 
$DTD et $XSD, voici donc les 2 grammaires $DTD possibes et leur traduction automatique en schéma $XSD&nbsp;:" ;
00320     finp
() ;
00321     
00322     blockquote
() ;
00323     $listeDtd6 
listeFichiers("g",1,2,"dtd") ;
00324     $listeXsd6 
listeFichiers("g",1,2,"xsd") ;
00325     $liste6    
"$listeDtd6 $listeXsd6;
00326     montreListe
($liste6,"visuListe6",20) ;
00327     finblockquote
() ;
00328     
00329     
00330     ## -------------------------------------------------------------------------------------------
00331     
00332     h3
("$numExo.3 Solution pour le fichier ".href("films2.xml")) ;
00333     
00334     p
("texte") ;
00335     echo "La grammaire pour "
.href("films2.xml")." est un peu compliquée à écrire. " ;
00336     echo " D'abord parce qu'il y a une hiérarchie un peu moins évidente. Ensuite, parce que certains éléments ne sont pas renseignés, ce qui n'est pas " 
;
00337     echo " très facile à détecter car les éléments absents ne le sont pas en début de fichier&nbsp;: certains films n'ont pas d'élément GENRE et " 
;
00338     echo " certains films n'ont pas d'élément RESUME, certains artistes n'ont pas d'élément ANNEENAISS. " 
;
00339     finp
() ;
00340     
00341     p
("texte") ;
00342     echo "On pourrait éventuellement avoir une idée de la concomittance entre éléments et attributs " 
;
00343     echo " à l'aide notre programme "
.href("../internet/eltatt.php","eltatt") ;
00344     echo " si on l'applique à "
.b("films2.xml")." soit le " ;
00345     echo href
("../internet/eltattres.php?url=http://forge.info.univ-angers.fr/~gh/Webrd/films2.xml","résultat suivant").". " ;
00346     finp
() ;
00347     
00348     p
("texte") ;
00349     echo " On peut donc écrire la grammaire minimale suivante qui autorise à n'avoir aucun film ni aucun " 
;
00350     echo " artiste&nbsp;:" 
;
00351     echo " " 
;
00352     finp
() ;
00353     
00354     pre_fichier
("films2.dtd","cadrejaune") ;
00355     
00356     p
("texte") ;
00357     echo "Il n'est pas possible de profiter directement des déclarations "
.vert("ID")." et ".vert("IDREF")." des $DTD car dans la norme $XML un identifiant ou une référence " ;
00358     echo " à un identifiant ne peut pas &ecirc;tre uniquement numérique (de façon plus précise, il ne doit pas "
.b("commencer")." par un chiffre). Or, c'est " ;
00359     echo " souvent le cas lorsque l'attribut provient d'un champ autoincrémenté d'une base de données. Voici ce qui se passe si on essaie de valider&nbsp;:" 
;
00360     finp
() ;
00361     
00362     pre_fichier
("valide_id.txt","cadre") ;
00363     
00364     p
("texte") ;
00365     echo " Si on modifie le fichier des films en ajoutant " 
;
00366     echo " les 3 lettres art devant chaque identifiant et chaque référence d'identifiant, soit&nbsp;:" 
;
00367     finp
() ;
00368     
00369     pre_fichier
("filmsids.txt","cadrebleu") ;
00370     
00371     p
("texte") ;
00372     echo " alors, on peut utiliser "
.vert("ID")." et ".vert("IDREF")." comme suit&nbsp;:" ;
00373     finp
() ;
00374     
00375     pre_fichier
("films3.dtd","cadre") ;
00376     
00377     p
("texte") ;
00378     echo " Voici par exemple les messages d'erreur si on oublie de fournir un identifiant, si on définit deux fois le m&ecirc;me identifiant " 
;
00379     echo " ou si on fait référence à un identifiant qui n'existe pas " 
;
00380     echo "(nous avons mis art3333 au lieu de art3 comme référence pour le premier film)&nbsp;:" 
;
00381     finp
() ;
00382     
00383     pre_fichier
("films3erreurs.txt","cadrejaune") ;
00384     
00385     p
("texte") ;
00386     echo " Nous verrons dans la série 3 d'exercices, avec les transformations 
$XSL, comment ajouter automatiquement les trois lettres ".bleu("art")." pour " ;
00387     echo "les attributs "
.b("id")." et ".b("idfref").", m&ecirc;me si on peut le faire sous éditeur avec ".b("Edition/Remplacer&nbsp;tout") ;
00388     echo " ou avec un outil en ligne de commande comme "
.b("sed")." ou ".b("perl")." en mode ".b("-i -e")."." ;
00389     finp
() ;
00390     
00391     p
("texte") ;
00392     echo " Il est clair qu'on ne peut pas parler de la grammaire d'un fichier 
$XML, m&ecirc;me si on précise $DTD ou $XSD " ;
00393     echo " car les exemples précécents montrent qu'on peut définir plusieurs grammaires pour lesquelles un m&ecirc;me fichier 
$XML est valide. " ;
00394     echo " C'est pourquoi on ne doit jamais dire qu'un fichier fichier 
$XML est valide sans préciser la grammaire utilisée alors qu'il est " ;
00395     echo " tout-à-fait normal de dire qu'un fichier est bien formé sans rien préciser d'autre. " 
;
00396     finp
() ;
00397     
00398     
00399     p
("texte") ;
00400     echo "Voici les grammaires utilisées&nbsp;:" 
;
00401     finp
() ;
00402     
00403     blockquote
() ;
00404     $listeDtd7 
listeFichiers("films",2,3,"dtd") ;
00405     $listeXsd7 
listeFichiers("films",2,3,"xsd") ;
00406     $liste7    
"$listeDtd7 $listeXsd7;
00407     montreListe
($liste7,"visuListe7",20) ;
00408     finblockquote
() ;
00409     
00410     
00411     finsolution
() ;
00412     
00413     finblockquote
() ;
00414     
00415     ## -------------------------------------------------------------------------------------------
00416     
00417     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Lecture de grammaires courantes de petite taille
00418     
00419     ## -------------------------------------------------------------------------------------------
00420     
00421     blockquote
() ;
00422     
00423     p
("texte") ;
00424     echo "Ecrire un fichier "
.b("cv_minimal.xml")." minimal valide pour la grammaire ".href("Dtd/cv.dtd","cv.dtd").". " ;
00425     finp
() ;
00426     
00427     p
("texte") ;
00428     echo "Quels sont tous les éléments possibles qu'on peut utiliser dans un fichier "
.b("XHTML 1.0 strict")."&nbsp;? " ;
00429     echo " Quel élément peut avoir le plus d'attributs&nbsp;? " 
;
00430     echo "On commencera par donner leur nombre avant d'en fournir une liste alphabétique. " 
;
00431     finp
() ;
00432     
00433     p
("texte") ;
00434     echo " Comparer les éléments posibles en "
.b("XHTML 1.0 strict")." et ".b("XHTML 1.0 Transitionnel").". " ;
00435     echo " Comparer les éléments posibles en "
.b("XHTML 1.0 strict")." et ".b("HTML 5.")."." ;
00436     finp
() ;
00437     
00438     p
("texte") ;
00439     echo "Y a-t-il des grammaires pour les documents "
.vert("Microsoft Office")." et " ;
00440     echo vert
("Open Office")."/".vert("Libre Office")."&nbsp;? En ".rouge("DTD")." ou ".rouge("XSD")."&nbsp;? " ;
00441     echo " Et au "
.bleu("NCBI").", pour les formats de données bioinformatiques&nbsp;? " ;
00442     echo " Et pour "
.bleu("UNIPROT")."&nbsp;? " ;
00443     echo " Et pour "
.bleu("EMBL-EBI")."&nbsp;? " ;
00444     finp
() ;
00445     
00446     solution
($numExo) ;
00447     
00448     # http://www.w3.org/TR/xhtml1/dtds.html
00449     # http://www.cs.tut.fi/~jkorpela/html5-dtd.html
00450     # http://about.validator.nu/
00451     # http://www.developpez.net/forums/d1223072/webmasters-developpement-web/web-semantique/validation-rdf/
00452     
00453     ## -------------------------------------------------------------------------------------------
00454     
00455     h3
("$numExo.1 Un fichier CV minimal") ;
00456     
00457     p
("texte") ;
00458     echo "A la lecture de "
.href("cv_minimal.xml")." on pourra constater que si la structure imposée est respectée, le remplissage laisse à " ;
00459     echo " désirer. Mais au moins les éléments et attributs obligatoires sont présents, m&ecirc;me s'ils ne sont pas renseignés. " 
;
00460     echo " Avec une grammaire 
$XSD on pourrait imposer d'avoir au moins 1 caractère par champ (!), ce qui éviterait les informations vides. " ;
00461     finp
() ;
00462     
00463     pre_fichier
("cv_minimal.xml","cadrebleu") ;
00464     
00465     ## -------------------------------------------------------------------------------------------
00466     
00467     h3
("$numExo.2 Eléments et attributs en $XHTML 1.0 Strict") ;
00468     
00469     p
("texte") ;
00470     echo "Il faut bien s&ucirc;r disposer de la 
$DTD du langage pour réaliser cette partie d'exercice. " ;
00471     echo " Heureusement, le W3C nous la met à disposition à l'adresse " 
;
00472     echo href
("http://www.w3.org/TR/xhtml1/dtds.html")." et une copie locale est ".href("Dtd/xhtml1-strict.dtd").". " ;
00473     echo " Pour compter et trier les éléments, les commandes "
.rouge("Unix")." nommées ".b("grep").", ".b("wc")." et ".b("sort")." sont tout-à fait indiquées&nbsp;" ;
00474     finp
() ;
00475     
00476     pre_fichier
("elts_strict.txt","cadrejaune") ;
00477     
00478     p
("texte") ;
00479     echo "Par contre pour bien présenter ces éléments et compter le nombre d'attributs par éléments, il vaut mieux écrire un programme " 
;
00480     echo " comme notre "
.href("analysedtd_f.php","analyseur de dtd")."." ;
00481     finp
() ;
00482     
00483     ## -------------------------------------------------------------------------------------------
00484     
00485     h3
("$numExo.3 Comparaison des éléments en $XHTML 1.0 Strict, Transitionnel et $HTML5") ;
00486     
00487     p
("texte") ;
00488     echo "A l'aide des deux fichiers grammaires officielles issues de " 
;
00489     echo href
("http://www.w3.org/TR/xhtml1/dtds.html")." dont ".href("Dtd/xhtml1-strict.dtd","strict.dtd")." et " ;
00490     echo href
("Dtd/xhtml1-transitional.dtd","trans.dtd")." sont des copies locales, il est facile d'écrire un programme de comparaison " ;
00491     echo " des divers éléments. Voir par exemple notre "
.href("cmpdtd_f.php","comparateur de $DTD").". " ;
00492     finp
() ;
00493     
00494     p
("texte") ;
00495     echo "Les principaux éléments absents de 
$XHTML 1.0 Strict sont donc ".b("applet").", ".b("center")." et ".b("font")."." ;
00496     finp
() ;
00497     
00498     p
("texte") ;
00499     echo "HTML5 n'est pas défini de façon rigoureuse aujourd'hui, la grammaire utilisée dans le comparateur est donc provisoire... " 
;
00500     finp
() ;
00501     
00502     
00503     ## -------------------------------------------------------------------------------------------
00504     
00505     h3
("$numExo.4 Grammaires pour les suite Office et les formats bioinformatiques") ;
00506     
00507     p
("texte") ;
00508     echo "Un document pour Open Office est nommé "
.href("http://fr.wikipedia.org/wiki/OpenDocument","opendocument").". " ;
00509     echo "Il n'y a pas une grammaire mais "
.b("plein")." de grammaires au format $XSD, accessibles par exemple " ;
00510     echo " sur le site "
.href("http://www.schemacentral.com/sc/ooxml/ss.html","schemacentral").". " ;
00511     echo " On pourra au passage regarder ce qu'est "
.href("http://wiki.services.openoffice.org/wiki/Uno","uno").". " ;
00512     finp
() ;
00513     
00514     p
("texte") ;
00515     echo "Un document pour "
.href("http://en.wikipedia.org/wiki/Microsoft_Office_XML_formats","Microsoft Office")."  correspond aussi " ;
00516     echo " aujourd'hui à ce qu'on nomme "
.href("http://fr.wikipedia.org/wiki/Office_Open_XML","OOXML").". " ;
00517     echo " On peut trouver les grammaires associées, là encore sous forme de schémas 
$XSD, sur le " ;
00518     echo href
("http://www.microsoft.com/en-us/download/details.aspx?id=101","site officiel Microsoft")." (".href("MicrosoftOfficeSchemas.zip","archive locale")."). " ;
00519     finp
() ;
00520     
00521     
00522     p
("texte") ;
00523     echo "Le NCBI fournit une page et des outils pour 
$XML, respectivement " ;
00524     echo " aux adresses "
.href("http://www.ncbi.nlm.nih.gov/IEB/ToolBox/XML/","ToolBox XML") ;
00525     echo " et "
.href("http://www.ncbi.nlm.nih.gov/IEB/ToolBox/XML/ncbixml.txt","ncbixml.txt").". " ;
00526     echo " Une longue liste de 
$DTD associées est " ;
00527     echo " disponible à l'adresse "
.href("http://www.ncbi.nlm.nih.gov/dtd/","dtd")." mais le NCBI fournit aussi " ;
00528     echo " des schémas, sur le site, dans le sous-répertoire "
.href("http://www.ncbi.nlm.nih.gov/data_specs/schema/","schema").". " ;
00529     finp
() ;
00530     
00531     p
("texte") ;
00532     echo "La recherche du mot 
$XML dans la documentation d'Uniprot renvoie la page " ;
00533     echo href
("http://www.uniprot.org/docs/?query=xml&amp;sort=score","query xml")." qui montre qu'Uniprot est très actif au niveau $XML. Ainsi la page " ;
00534     echo href
("http://www.uniprot.org/docs/xml_news.htm","xml_news")." recense les changements les plus récents. " ;
00535     echo " On remarquera que sur la "
.href("http://www.uniprot.org/downloads","page des téléchargements des bases de données")." figurent les schémas $XSD... " ;
00536     finp
() ;
00537     
00538     p
("texte") ;
00539     echo "Un example de 
$DTD associée à une entrée Uniprot est consultable sur " ;
00540     echo href
("http://code.google.com/p/xbird/source/browse/trunk/xbird-db/examples/crest/uniprot.dtd?r=826","code.google.com").". " ;
00541     finp
() ;
00542     
00543     p
("texte") ;
00544     echo "L'EMBL-EBI n'est pas en reste avec sa page de " 
;
00545     echo href
("http://www.ebi.ac.uk/embl/xml/","documentation $XML")." et " ;
00546     #echo " son ".href("http://www.ebi.ac.uk/cgi-bin/embl/xml/converter/","convertisseur XML").". " ;
00547     echo 
" son ".href("http://www.ebi.ac.uk/pdbe/nmr/software/formatConverter.html","convertisseur $XML").". " ;
00548     finp
() ;
00549     
00550     finsolution
() ;
00551     
00552     finblockquote
() ;
00553     
00554     ## -------------------------------------------------------------------------------------------
00555     
00556     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Lecture de grammaires courantes de grande taille
00557     
00558     ## -------------------------------------------------------------------------------------------
00559     
00560     blockquote
() ;
00561     
00562     p
("texte") ;
00563     echo "Quels sont tous les éléments possibles qu'on peut utiliser dans un fichier "
.bleu("SVG")." selon la norme ".b("SVG 1.1")." " ;
00564     echo " du "
.href("http://www.w3.org/TR/SVG/svgdtd.html","16 aout 2011")."&nbsp;? " ;
00565     echo " Quel élément peut avoir le plus d'attribut&nbsp;? " 
;
00566     echo "On commencera par donner leur nombre avant d'en fournir une liste alphabétique. " 
;
00567     echo " Reprendre ensuite avec les fichiers "
.bleu("RDF")."." # carte de référence&nbsp;?
00568     finp
() ;
00569     
00570     solution
($numExo) ;
00571     
00572     p
("texte") ;
00573     echo "Avec "
.b("grep")." et ".b("wc").", rien de plus simple pour compter les éléments &nbsp;:" ;
00574     finp
() ;
00575     
00576     pre_fichier
("svg_elts.txt","cadre") ;
00577     
00578     
00579     p
("texte") ;
00580     echo "Pour les attributs et entités, " 
;
00581     echo " avec notre "
.href("analysedtd_f.php","analyseur de $DTD")." les chose se compliquent. Voir " ;
00582     echo href
("analysedtd.php?url=http://forge.info.univ-angers.fr/~gh/Webrd/Dtd/svg11-flat-20110816.dtd","analyse SVG DTD","grouge")."." ;
00583     finp
() ;
00584     /*
00585     # http://www.w3.org/RDF/
00586     # http://www.w3.org/2001/XMLShema.xsd
00587     # OOXML
00588     
00589     # smil.dtd
00590     
00591     solution($numExo) ;
00592     
00593     p("texte") ;
00594     echo "XML" ;
00595     finp() ;
00596     
00597     */
00598     
00599     finsolution
() ;
00600     finblockquote
() ;
00601     
00602     ## -------------------------------------------------------------------------------------------
00603     
00604     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Conversions entres grammaires DTD et XSD ; vérification de grammaires
00605     
00606     ## -------------------------------------------------------------------------------------------
00607     
00608     blockquote
() ;
00609     
00610     p
("texte") ;
00611     echo "Peut-on facilement convertir une grammaire "
.rouge("DTD")." en grammaire ".rouge("XSD")."&nbsp;? " ;
00612     echo " Si oui quel convertisseur peut-on utiliser&nbsp;? " 
;
00613     echo " Si non, expliquez pourquoi. " 
;
00614     finp
() ;
00615     
00616     p
("texte") ;
00617     echo "Peut-on facilement convertir une grammaire "
.rouge("XSD")." en grammaire ".rouge("DTD")."&nbsp;? Si oui quel convertisseur peut-on utiliser&nbsp;? " ;
00618     echo " Si non, expliquez pourquoi. " 
;
00619     finp
() ;
00620     
00621     solution
($numExo) ;
00622     
00623     p
("texte") ;
00624     echo "La syntaxe 
$DTD est tellement simple qu'il est facile de la convertir en syntaxe $XSD, par exemple avec ".b("trang")."&nbsp;:" ;
00625     finp
() ;
00626     
00627     pre_fichier
("trang_xmp.txt","cadre") ;
00628     
00629     p
("texte") ;
00630     echo "De la m&ecirc;me façon, la syntaxe 
$XSD est tellement complexe qu'il est facile de trouver quelque chose qui ne se convertit pas en syntaxe $DTD, par exemple la cardinalité " ;
00631     echo b
('maxOccurs="15"').". " ;
00632     finp
() ;
00633     
00634     
00635     p
("texte") ;
00636     echo em
("Remarque&nbsp;: ") ;
00637     echo b
("trang") ;
00638     echo " s'installe tout simplement sous Ubuntu via "
.b("sudo apt-get install trang").". " ;
00639     finp
() ;
00640     
00641     finsolution
() ;
00642     
00643     finblockquote
() ;
00644     
00645     ## -------------------------------------------------------------------------------------------
00646     
00647     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Contraintes et facettes dans les schémas XSD" ;
00648     
00649     ## -------------------------------------------------------------------------------------------
00650     
00651     blockquote
() ;
00652     
00653     p
("texte") ;
00654     echo "Ecrire une grammaire 
$XSD qui oblige à décrire une séquence fasta avec un identifiant ".vert("ID")." qui correspond " ;
00655     echo " à l'expression régulière "
.b("^[A-U]{1,3}\d{5}\$")." et une séquence SEQ d'acides aminés d'une longueur d'au moins 20 AA." ;
00656     finp
() ;
00657     
00658     p
("texte") ;
00659     echo "L'ancienne numérotation des "
.href("http://fr.wikipedia.org/wiki/Plaque_d%27immatriculation","plaques minéralogiques") ;
00660     echo " se composait de trois parties (chiffres,lettres,département). " 
;
00661     echo " Ecrire une grammaire 
$XSD correspondante et des exemples de fichiers \"voitures\" ou \"cartes grises\"." ;
00662     echo " Reprendre avec la "
.href("http://fr.wikipedia.org/wiki/Plaque_d%27immatriculation_fran%C3%A7aise","nouvelle numérotation")." des plaques françaises. " ;
00663     finp
() ;
00664     
00665     solution
($numExo) ;
00666     
00667     p
("texte") ;
00668     echo "Exercice non corrigé (volontairement)." 
;
00669     finp
() ;
00670     
00671     finsolution
() ;
00672     
00673     finblockquote
() ;
00674     
00675     ## -------------------------------------------------------------------------------------------
00676     
00677     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Autres grammaires dont relax NG
00678     
00679     ## -------------------------------------------------------------------------------------------
00680     
00681     blockquote
() ;
00682     
00683     p
("texte") ;
00684     echo "Un collègue vient de me fournir une grammaire "
.href("validateur.rnc")." pour des fichiers $XML comme ".href("paradis.xml").". " ;
00685     echo " Le seul problème est qu'il s'agit d'un schéma "
.b("Relax NG")." comme il dit. Comment peut-on s'en servir&nbsp;? " ;
00686     echo " Peut-on le convertir en 
$DTD, en $XSD&nbsp;? " ;
00687     finp
() ;
00688     
00689     solution
($numExo) ;
00690     
00691     p
("texte") ;
00692     echo "Facile, y'a qu'à installer "
.b("trang")."&nbsp;!" ;
00693     finp
() ;
00694     
00695     p
("texte") ;
00696     echo "La transformation, une fois "
.b("trang")." installé, est assurée par&nbsp;:" ;
00697     finp
() ;
00698     
00699     pre_fichier
("trang_conv_rnc.txt","cadre") ;
00700     
00701     p
("texte") ;
00702     echo "Voici le fichier rnc original&nbsp;:" 
;
00703     finp
() ;
00704     
00705     pre_fichier
("validateur.rnc","cadrebleu",0,1) ;
00706     
00707     p
("texte") ;
00708     echo " et sa traduction en xsd par trang &nbsp;:" 
;
00709     finp
() ;
00710     
00711     pre_fichier
("validateur.xsd","cadrejaune",0,1) ;
00712     
00713     finsolution
() ;
00714     
00715     finblockquote
() ;
00716     
00717     ## -------------------------------------------------------------------------------------------
00718     
00719     $tdmCRLM
->afficheRubrique("oui") ; $numExo++ ; # Questions diverses
00720     
00721     ## -------------------------------------------------------------------------------------------
00722     
00723     blockquote
() ;
00724     
00725     p
("texte") ;
00726     echo " Comment fait-on pour tester si un fichier "
.rouge("DTD")." est valide&nbsp;? Et un fichier ".rouge("XSD")."&nbsp;? On pourra utiliser " ;
00727     echo href
("bad.dtd")." et ".href("bad.xsd")." avec respectivement ".href("bad_dtd.xml")." et ".href("bad_xsd.xml").". " ;
00728     finp
() ;
00729     
00730     p
("texte") ;
00731     echo "Quelles sont les différences entre 
$XSD 1.0 et $XSD 1.1&nbsp;?" ;
00732     finp
() ;
00733     
00734     p
("texte") ;
00735     echo "Faut-il toujours écrire "
.vert("&lt;!DOCTYPE...")." pour tester si un fichier est valide par rapport à un fichier $DTD donné&nbsp;? " ;
00736     finp
() ;
00737     
00738     p
("texte") ;
00739     echo "Quelle est la différence entre "
.rouge("SVG")." et ".rouge("Tiny SVG")."&nbsp;?  Quelles sont leurs grammaires ? " ;
00740     finp
() ;
00741     
00742     solution
($numExo) ;
00743     
00744     p
("texte") ;
00745     echo "Exercice volontairement non corrigé." 
;
00746     finp
() ;
00747     
00748     /*
00749     
00750     p("texte") ;
00751     echo "XML" ;
00752     finp() ;
00753     
00754     
00755     
00756     http://www.w3.org/TR/xmlschema11-1/#intro1.1
00757     http://www.w3.org/TR/xmlschema11-1/#changes
00758     
00759     
00760     
00761     */
00762     
00763     finsolution
() ;
00764     finblockquote
() ;
00765     
00766     ## -------------------------------------------------------------------------------------------
00767     
00768     finPageExercices
(2) ; # contient finSection() et finPage() ;
00769     
00770     ?>

 

 

retour gH    Retour à la page principale de   (gH)