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 = 0 ;
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")." ; 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 = 0 ;
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 ?" ;
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 ?" ;
00079 finp() ;
00080
00081 p("texte") ;
00082 echo b("Remarque")." : après avoir écrit «à la main» 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("<!ELEMENT ...>") ;
00095 echo " et que pour déclarer que Y est un attribut de X, il faut écrire ".b("<!ATTLIST X Y...>") ;
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 : " ;
00097 echo " nous avons considéré que ".vert("services")." ne pouvait pas ê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ê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("&").". " ;
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")." :" ;
00185 finp() ;
00186
00187 pre_fichier("trang_xmp.txt","cadre") ;
00188
00189 p("texte") ;
00190 echo "Voici les grammaires produites :" ;
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ême à relire les grammaires générées car il peut y avoir des surprises !" ;
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 ?" ;
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 " «vite fait» peut être ".href("dessin.dtd")." dont le contenu est :" ;
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 :" ;
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) :" ;
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 " ;
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 :" ;
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 :" ;
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 :" ;
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ê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("<!DOCTYPE")." avant l'élément racine, ce que ne permet pas rxp :" ;
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")." :" ;
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 :" ;
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 :" ;
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 : 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 :" ;
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 ê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 :" ;
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 :" ;
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 :" ;
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ê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) :" ;
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ême si on peut le faire sous éditeur avec ".b("Edition/Remplacer 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ê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ê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 :" ;
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")." ? " ;
00429 echo " Quel élément peut avoir le plus d'attributs ? " ;
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")." ? En ".rouge("DTD")." ou ".rouge("XSD")." ? " ;
00441 echo " Et au ".bleu("NCBI").", pour les formats de données bioinformatiques ? " ;
00442 echo " Et pour ".bleu("UNIPROT")." ? " ;
00443 echo " Et pour ".bleu("EMBL-EBI")." ? " ;
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ê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û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 " ;
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&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")." ? " ;
00565 echo " Quel élément peut avoir le plus d'attribut ? " ;
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 ?
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 :" ;
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")." ? " ;
00612 echo " Si oui quel convertisseur peut-on utiliser ? " ;
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")." ? Si oui quel convertisseur peut-on utiliser ? " ;
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")." :" ;
00625 finp() ;
00626
00627 pre_fichier("trang_xmp.txt","cadre") ;
00628
00629 p("texte") ;
00630 echo "De la mê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 : ") ;
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 ? " ;
00686 echo " Peut-on le convertir en $DTD, en $XSD ? " ;
00687 finp() ;
00688
00689 solution($numExo) ;
00690
00691 p("texte") ;
00692 echo "Facile, y'a qu'à installer ".b("trang")." !" ;
00693 finp() ;
00694
00695 p("texte") ;
00696 echo "La transformation, une fois ".b("trang")." installé, est assurée par :" ;
00697 finp() ;
00698
00699 pre_fichier("trang_conv_rnc.txt","cadre") ;
00700
00701 p("texte") ;
00702 echo "Voici le fichier rnc original :" ;
00703 finp() ;
00704
00705 pre_fichier("validateur.rnc","cadrebleu",0,1) ;
00706
00707 p("texte") ;
00708 echo " et sa traduction en xsd par trang :" ;
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 ? Et un fichier ".rouge("XSD")." ? 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 ?" ;
00732 finp() ;
00733
00734 p("texte") ;
00735 echo "Faut-il toujours écrire ".vert("<!DOCTYPE...")." pour tester si un fichier est valide par rapport à un fichier $DTD donné ? " ;
00736 finp() ;
00737
00738 p("texte") ;
00739 echo "Quelle est la différence entre ".rouge("SVG")." et ".rouge("Tiny SVG")." ? 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 à la page principale de (gH)