Listing du fichier l2xml_6_tp3.php
00001 <?php
00002 # # (gH) -_- l2xml_6_tp3.php ; TimeStamp (unix) : 30 Novembre 2017 vers 17:34
00003 include("std.php") ;
00004 include("l2xml_6_inc.php") ;
00005
00006 $HTML = s_span("HTML" ,"grouge") ;
00007 $XHTML = s_span("XHTML","grouge") ;
00008 $XML = s_span("XML" ,"grouge") ;
00009 $DTD = s_span("DTD" ,"grouge") ;
00010 $XSD = s_span("XSD" ,"grouge") ;
00011 $SVG = s_span("SVG" ,"grouge") ;
00012 $XSL = s_span("XSL" ,"grouge") ;
00013 $CSS = s_span("CSS" ,"grouge") ;
00014 $JavaScript = s_span("JavaScript" ,"grouge") ;
00015
00016 $rxp = ghRouge("rxp") ;
00017 $xmllint = ghRouge("xmllint") ;
00018 $xmlstarlet = ghRouge("xmlstarlet") ;
00019
00020 $numSerie = 3 ;
00021
00022 if (!isset($_GET["standalone"])) { debutPage("XML en L2, TP $numSerie","strict","","l2xml.js") ; } ;
00023
00024 debutSection() ;
00025 if (isset($_GET["standalone"])) { jsf("l2xml.js") ; } ;
00026 h1("$XML en L2, université d'Angers ") ;
00027 h2(s_nbsp(4).href("../../","gilles.hunault@univ-angers.fr","gvert nou")) ;
00028 pvide() ;
00029 h2("T.P. numéro 3","gbleu") ;
00030 pvide() ;
00031
00032 ###########################################################################################
00033
00034 $tableauDesRubriques = array() ;
00035 $idr = 0 ;
00036 $idr++; $tableauDesRubriques[$idr] = "Créer un document $XML qui respecte une grammaire $DTD" ;
00037 $idr++; $tableauDesRubriques[$idr] = "Créer un document $XML qui respecte une grammaire $XSD" ;
00038 $idr++; $tableauDesRubriques[$idr] = "DTD et paramètres" ;
00039 $idr++; $tableauDesRubriques[$idr] = "Validité suivant la grammaire" ;
00040 $idr++; $tableauDesRubriques[$idr] = "Créer des grammaires $DTD et $XSD" ;
00041 $idr++; $tableauDesRubriques[$idr] = "Non unicité des grammaires $DTD et $XSD" ;
00042 $idr++; $tableauDesRubriques[$idr] = "Vérification des vérificateurs" ;
00043 $idr++; $tableauDesRubriques[$idr] = "Rajout de contraintes" ;
00044 $tdmCRLM = new tdm($tableauDesRubriques) ;
00045 $tdmCRLM->titre() ;
00046 $tdmCRLM->menu("oui","oui","nou") ;
00047
00048 pvide() ;
00049
00050 $numExo = 0 ;
00051 direAfficherSolutions($numSerie) ;
00052 pvide() ;
00053
00054 ## -------------------------------------------------------------------------------------------
00055
00056 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # . Créer un document qui respecte une grammaire DTD
00057
00058 ## -------------------------------------------------------------------------------------------
00059
00060 blockquote() ;
00061
00062 p("texte") ;
00063 echo " Nous admettrons pour ce qui suit qu'une molécule est définie par une liste " ;
00064 echo " d'atomes avec le nom des atomes, leur notation et le nombre de ces atomes fournis en attributs. " ;
00065 echo " Par exemple la molécule d'eau ".b("H".sub("2")."O")." est définie par l'atome de nom hydrogène, de notation H en nombre 2 " ;
00066 echo " et par l'atome de nom oxygène, de notation O et en nombre 1 (qui peut donc être omis)." ;
00067 echo " Après avoir lu soigneusement le fichier suivant nommé ".href("molecule_dtd.txt","molecule.dtd").", écrire un fichier ".b("eau.xml") ;
00068 echo " valide pour cette grammaire $DTD. On utilisera un outil en ligne de commande pour vérifier cette validité. " ;
00069 echo " On pourra ignorer les accents. " ;
00070 finp() ;
00071
00072 p() ;
00073 echo b("Fichier molecule.dtd :") ;
00074 finp() ;
00075
00076 pre_fichier("molecule.dtd","cadre") ;
00077
00078 p("texte") ;
00079 echo "Est-ce que cette grammaire $DTD autorise les chaines vides pour les noms, lettres et nombres ?" ;
00080 finp() ;
00081
00082 p("texte") ;
00083 echo "Est-ce qu'il faut respecter l'ordre des attributs tel qu'il est défini dans la grammaire $DTD ?" ;
00084 finp() ;
00085
00086 solution($numExo,$numSerie) ;
00087
00088 p("texte") ;
00089 echo "Voici un fichier ".href("eau.xml")." possible :" ;
00090 finp() ;
00091
00092 pre_fichier("eau.xml","cadrebleu") ;
00093
00094 p("texte") ;
00095 echo "On peut vérifier la validité de ce fichier pour la grammaire ".href("molecule_dtd.txt","molecule.dtd")." via les commandes suivantes :" ;
00096 finp() ;
00097
00098 pre_fichier("molecule_sh1.txt","cadrejaune") ;
00099
00100 p("texte") ;
00101 echo "Hélas, oui cette grammaire $DTD autorise les chaines vides pour les noms, lettres et " ;
00102 echo " les nombres car ".b("CDATA").", comme ".b("#PCDATA")." inclut la chaine vide. " ;
00103 echo " On pourra s'en rendre compte avec le fichier suivant ".href("eauvide.xml")." qui est " ;
00104 echo " valide pour cette grammaire. Attention : une chaine de caractères réduite à un espace " ;
00105 echo " est aussi valide, mais vraiment peu informative..." ;
00106 finp() ;
00107
00108 p("texte") ;
00109 echo "De la même façon, l'ordre des attributs est libre, à condition qu'un attribut n'apparaisse pas deux fois, " ;
00110 echo " comme le montre le fichier suivant, qui est valide pour la $DTD considérée :" ;
00111 finp() ;
00112
00113 p() ;
00114 echo b("Fichier ".href("eaudtdatt.xml")." :") ;
00115 finp() ;
00116
00117 pre_fichier("eaudtdatt.xml","cadre") ;
00118
00119 p("texte") ;
00120 echo "Voici le message d'erreur en cas de duplication d'attribut, comme " ;
00121 echo " c'est le cas pour le fichier ".href("eaudtdatt2.xml")." :" ;
00122 finp() ;
00123
00124 pre_fichier("eaudtdatt2.xml","cadrejaune") ;
00125
00126 pre_fichier("eaudtdatt2.txt","cadrebleu") ;
00127
00128 finsolution() ;
00129
00130 finblockquote() ;
00131
00132 ## -------------------------------------------------------------------------------------------
00133
00134 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # . Créer un document qui respecte une grammaire XSD
00135
00136 ## -------------------------------------------------------------------------------------------
00137
00138 blockquote() ;
00139
00140 p("texte") ;
00141 echo " On décide maintenant d'utiliser la grammaire ".href("molecule_xsd.txt","molecule.xsd")." suivante pour stocker les mêmes informations." ;
00142 finp() ;
00143
00144 p() ;
00145 echo b("Fichier molecule.xsd :") ;
00146 finp() ;
00147
00148 pre_fichier("molecule.xsd","cadre") ;
00149
00150 p("texte") ;
00151 echo " Ecrire un fichier ".b("eau2.xml") ;
00152 echo " valide pour cette grammaire $XSD. On utilisera un outil en ligne de commande pour vérifier cette validité." ;
00153 echo " Là encore, on pourra ignorer les accents. " ;
00154 finp() ;
00155
00156 p("texte") ;
00157 echo "Est-ce que cette grammaire $XSD autorise les chaines vides pour les noms, lettres et nombres ?" ;
00158 finp() ;
00159
00160 solution($numExo,$numSerie) ;
00161
00162 p("texte") ;
00163 echo "Voici un fichier ".href("eau2.xml")." possible :" ;
00164 finp() ;
00165
00166 pre_fichier("eau2.xml","cadrebleu") ;
00167
00168 p("texte") ;
00169 echo "On peut vérifier la validité de ce fichier pour la grammaire ".href("molecule_xsd.txt","molecule.xsd")." via les commandes suivantes :" ;
00170 finp() ;
00171
00172 pre_fichier("molecule_sh2.txt","cadrejaune") ;
00173
00174 p("texte") ;
00175 echo "Hélas, oui cette grammaire $XSD autorise les chaines vides pour les noms, lettres, mais pas " ;
00176 echo " pour les nombres car ".b("xsd:string")." inclut la chaine vide mais ".b("xsd:integer")." l'interdit. " ;
00177 echo " On pourra s'en rendre compte avec le fichier suivant ".href("eau3.xml")." qui est " ;
00178 echo " valide pour cette grammaire. Attention : ici aussi une chaine de caractères réduite à un espace " ;
00179 echo " est valide, mais vraiment peu informative..." ;
00180 finp() ;
00181
00182 finsolution() ;
00183
00184 finblockquote() ;
00185
00186 ## -------------------------------------------------------------------------------------------
00187
00188 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # . DTD et paramètres
00189
00190 ## -------------------------------------------------------------------------------------------
00191
00192 blockquote() ;
00193
00194 p("texte") ;
00195 echo "On structure un ".ghBleu("dessin 2D")." élémentaire selon les règles suivantes. " ;
00196 echo " Un dessin est un cercle, un rectangle ou un triangle. " ;
00197 echo " Un cercle est défini par un centre et un rayon, " ;
00198 echo " un rectangle par son ".em("csg")." (coin supérieur gauche), une longueur et une largeur, " ;
00199 echo " un triangle par trois points. " ;
00200 echo " Chaque élément graphique peut avoir une couleur parmi les mots prédéfinis bleu, rouge, jaune ou vert. " ;
00201 echo " Ecrire un fichier ".b("dessin.xml")." qui dans un " ;
00202 echo href(wikien("Viewport"),"viewport")." bleu de 500 pixels de large et 300 de haut, met un \"soleil\" jaune de rayon 15 pixels en (450,50), " ;
00203 echo " une plage rectangulaire verte qui fait toute la largeur et qui fait 100 pixels de haut. " ;
00204 echo " Pour les plus fort(e)s, rajouter une petite étoile de mer rouge en bas à gauche à l'aide de trois triangles bien choisis. " ;
00205 echo " A défaut, on placera juste un triangle plein et en rouge. " ;
00206 echo " On pourra s'inspirer du dessin ci-dessous et de la syntaxe ".href("http://www.w3.org/Graphics/SVG/IG/resources/svgprimer.html#examples","SVG")."." ;
00207 finp() ;
00208
00209 p() ;
00210 nbsp(30) ;
00211 echo href("dessin2.png",img("dessin2.png","",200)) ;
00212 finp() ;
00213
00214 p("texte") ;
00215 echo " Ecrire ensuite la \"vraie\" version en $SVG de ce dessin. " ;
00216 finp() ;
00217
00218 p("texte") ;
00219 echo " Comment vérifier que ce dessin est valide au sens de la grammaire de $SVG ?" ;
00220 finp() ;
00221
00222 p("texte") ;
00223 echo " Quel logiciel, du type paint, gimp ou photoshop, permet de lire et d'écrire des fichiers $SVG ?" ;
00224 finp() ;
00225
00226 p("texte") ;
00227 echo "Donner les grammaires ".ghRouge("DTD")." et ".ghRouge("XSD")." associées au fichier " ;
00228 echo href("dessinTP.xml").". " ;
00229 echo "On nommera ".b("dessin.dtd")." et ".b("dessin.xsd")." les fichiers-grammaires correspondants. " ;
00230 echo " On essaiera de paramétrer l'attribut couleur qui est commun. " ;
00231 finp() ;
00232
00233 solution($numExo,$numSerie) ;
00234
00235 p("texte") ;
00236 echo "Voici un fichier $XML possible pour le dessin avec une syntaxe en français adaptée de SVG, nommé ".href("dessin.xml") ;
00237 finp() ;
00238
00239 pre_fichier("dessin.xml","cadre") ;
00240
00241 p("texte") ;
00242 echo "La \"vraie\" version dont un rendu est dans ".href("dessin1.svg","dessin1.svg")." est la suivante " ;
00243 finp() ;
00244
00245 pre_fichier("dessin1.svg","cadrebleu") ;
00246
00247 p("texte") ;
00248 echo "Et pour le dessin avec l'étoile ".href("dessin2.svg","dessin2.svg")." on peut utiliser " ;
00249 finp() ;
00250
00251 pre_fichier("dessin2.svg","cadrejaune") ;
00252
00253 p("texte") ;
00254 echo "Le W3C avec son fameux ".href("https://validator.w3.org/","Markup Validation Service")." est capable de tester si ce fichier est valide " ;
00255 echo " pour la grammaire de $SVG." ;
00256 finp() ;
00257
00258 p("texte") ;
00259 echo "Au niveau logiciel, c'est sans doute ".href("https://inkscape.org/fr/","Inkscape")." qui est le plus complet et le plus agréale à utiliser " ;
00260 echo " pour dessiner, lire et écrire des images au format $SVG." ;
00261 finp() ;
00262
00263 blockquote() ;
00264 table(1,15,"collapse") ;
00265 tr() ;
00266 td() ; echo "Rendu SVG (si le browser le permet)" ; fintd() ;
00267 td() ; echo "<object data='dessin1.svg' width='500' />\n" ; fintd() ;
00268 td() ; echo "<object data='dessin2.svg' width='500' />\n" ; fintd() ;
00269 fintr() ;
00270 tr() ;
00271 td() ; echo "Rendu PNG (copie d'écran)" ; fintd() ;
00272 td() ; echo img("dessin1.png","dessin1","500") ; fintd() ;
00273 td() ; echo img("dessin2.png","dessin2","500") ; fintd() ;
00274 fintr() ;
00275 fintable() ;
00276 finblockquote() ;
00277
00278 p("texte") ;
00279 echo "Là encore, pour ".href("dessin.xml").", il y a peu d'éléments et d'attributs dans ".href("dessin.xml")." donc une grammaire ".ghBleu("DTD") ;
00280 echo " «vite fait» peut être ".href("dessin.dtd")." dont le contenu est :" ;
00281 finp() ;
00282
00283 pre_fichier("dessin.dtd","cadre",0,1) ;
00284
00285 p("texte") ;
00286 echo "Pour forcer les couleurs à ne prendre que les valeurs autorisées, on peut utiliser une liste de valeurs, soit :" ;
00287 finp() ;
00288
00289 pre_fichier("dessin2.dtd","cadre") ;
00290 p("texte") ;
00291 echo "Pour éviter la duplication par copier/coller de cette liste des couleurs, le mieux est d'utiliser une entité paramétrique, qui fonctionne " ;
00292 echo " comme une entité ".b("HTML")." mais qui commence par le symbole ".b("%")." (pourcent) :" ;
00293 echo "" ;
00294 finp() ;
00295
00296 pre_fichier("dessin3.dtd","cadre") ;
00297
00298 p("texte") ;
00299 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 " ;
00300 echo " modulaire de définir une autre entité pour la couleur par défaut " ;
00301 finp() ;
00302
00303 pre_fichier("dtdt4et5.txt","cadrebleu") ;
00304
00305 p("texte") ;
00306 echo "Voici donc les 5 grammaires $DTD possibles et leur traduction automatique en schéma $XSD :" ;
00307 finp() ;
00308
00309 blockquote() ;
00310 $listeDtd4 = listeFichiers("dessin",1,5,"dtd") ;
00311 $listeXsd4 = listeFichiers("dessin",1,5,"xsd") ;
00312 $liste4 = "$listeDtd4 <p> $listeXsd4" ;
00313 montreListeFichiers($liste4,"visuListe5",20) ;
00314 finblockquote() ;
00315
00316 finsolution() ;
00317
00318 finblockquote() ;
00319
00320 ## -------------------------------------------------------------------------------------------
00321
00322 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # . Validité suivant la grammaire
00323
00324 ## -------------------------------------------------------------------------------------------
00325
00326 blockquote() ;
00327
00328 p("texte") ;
00329 echo "Ecrire un fichier minimal ".b("ouimaisnon.xml")." qui est valide pour la grammaire ".href("g1.dtd")." mais " ;
00330 echo " non valide pour la grammaire ".href("g2.dtd").". " ;
00331 echo " Fournir ensuite un fichier ".b("livre.xml")." valide pour ".href("g2.dtd").". " ;
00332 finp() ;
00333
00334 solution($numExo,$numSerie) ;
00335
00336 p("texte") ;
00337 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 :" ;
00338 finp() ;
00339
00340 pre_fichier("g1.dtd","cadrejaune") ;
00341
00342 p("texte") ;
00343 echo "Donc si on se focalise sur les éléments obligatoires, on peut se limiter à un fichier ".href("ouimaisnon.xml")." comme celui-ci :" ;
00344 finp() ;
00345
00346 pre_fichier("ouimaisnon.xml","cadre") ;
00347
00348 p("texte") ;
00349 echo "On notera au passage ce que permet le mot clé ".b("ANY")." pour l'élément ".ghBleu("references").", qui, s'il permet de tester des documents en cours " ;
00350 echo " de rédaction, n'est pas très contraignant. De même en ce qui concerne ".b("(#PCDATA|chapitre)*")." pour l'élément ".ghBleu("chapitres").". " ;
00351 echo " Pour vérifier que ce fichier est valide pour g1 mais non pour g2, le plus simple est d'utiliser $xmlstarlet " ;
00352 echo " ou $xmllint car on n'a pas besoin d'écrire " ;
00353 echo " explicitement ".ghVert("<!DOCTYPE")." avant l'élément racine, ce que ne permet pas $rxp :" ;
00354 finp() ;
00355
00356 pre_fichier("ouimaisnon_validation.txt","cadre") ;
00357
00358 p("texte") ;
00359 echo "Par contre, la grammaire ".href("g2.dtd")." est plus exigeante que la grammaire ".href("g1.dtd")." :" ;
00360 finp() ;
00361
00362 pre_fichier("g2.dtd","cadrejaune") ;
00363
00364 p("texte") ;
00365 echo "Donc un fichier ".href("livre.xml")." valide pour g2 est un peu plus technique et demande un peu plus de réflexion :" ;
00366 finp() ;
00367
00368 pre_fichier("livre.xml","cadre") ;
00369
00370 /* à compléter
00371 p("texte") ;
00372 echo "On remarquera que... " ;
00373 finp() ;
00374 */
00375
00376 p("texte") ;
00377 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 :" ;
00378 finp() ;
00379
00380 blockquote() ;
00381 $listeDtd6 = listeFichiers("g",1,2,"dtd") ;
00382 $listeXsd6 = listeFichiers("g",1,2,"xsd") ;
00383 $liste6 = "$listeDtd6 $listeXsd6" ;
00384 montreListeFichiers($liste6,"visuListe6",20) ;
00385 finblockquote() ;
00386
00387 finsolution() ;
00388
00389 finblockquote() ;
00390
00391 ## -------------------------------------------------------------------------------------------
00392
00393 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # . Créer des grammaires DTD et XSD"
00394
00395 ## -------------------------------------------------------------------------------------------
00396
00397 blockquote() ;
00398
00399 p("texte") ;
00400 echo " Disons qu'un trajet ferroviaire est représenté schématiquement " ;
00401 echo " mais obligatoirement par un numéro identifiant de trajet, un type de train, un lieu de départ et un lieu d'arrivée. " ;
00402 echo " Ces informations sont éventuellement complétées, lorsqu'elles sont disponibles, par deux informations ".b("ts")." (pour ".em("time stamp")." en anglais) " ;
00403 echo " qui fournissent respectivement la date et heure de départ et la date et heure d'arrivée. " ;
00404 finp() ;
00405
00406 p("texte") ;
00407 echo " Voici un exemple de fichier $XML regroupant deux trajets, nommé ".href("trajets.xml")."." ;
00408 finp() ;
00409
00410 p() ;
00411 echo b("Fichier trajets.xml :") ;
00412 finp() ;
00413
00414 pre_fichier("trajets.xml","cadre") ;
00415
00416 p("texte") ;
00417 echo " Donner pour ce fichier ".b("trajets.xml") ;
00418 echo " une grammaire $DTD ".em("minimale et raisonnable") ;
00419 echo " qui permet de décrire les trajets ferroviaires puis une grammaire $XSD équivalente." ;
00420 finp() ;
00421
00422 solution($numExo,$numSerie) ;
00423
00424 p("texte") ;
00425 echo " On lira attentivement les fichiers ci-dessous. " ;
00426 finp() ;
00427
00428 p() ;
00429 echo b("Grammaire trajets.dtd :") ;
00430 finp() ;
00431
00432 pre_fichier("trajets.dtd","cadrejaune") ;
00433
00434 p() ;
00435 echo b("Grammaire trajets.xsd :") ;
00436 finp() ;
00437
00438 pre_fichier("trajets.xsd","cadrebleu") ;
00439
00440
00441 p("texte") ;
00442 echo "Au passage, vous aurez remarqué que la grammaire proposée est invalide puisque l'espace de noms proposé (xs) " ;
00443 echo " ne correspond pas aux préfixes utilisés (xsd). Il faut donc juste modifier la ligne 1 pour qu'il y ait écrit " ;
00444 echo b("xmlns:xsd=")." au lieu de " ;
00445 echo b("xmlns:xs=").". " ;
00446 finp() ;
00447
00448 finsolution() ;
00449
00450 finblockquote() ;
00451
00452 ## -------------------------------------------------------------------------------------------
00453
00454 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # . Non unicité des grammaires DTD et XSD
00455
00456 ## -------------------------------------------------------------------------------------------
00457
00458 blockquote() ;
00459
00460 p("texte") ;
00461 echo "Ecrire une grammaire pour le fichier ".href("films2.xml","films2")." en ".ghRouge("DTD")." puis en ".ghRouge("XSD").". " ;
00462 echo " Où y a-t-il des choix à faire ?" ;
00463 echo " Pourquoi ne peut-on pas parler de ".b("la")." grammaire ".ghRouge("DTD")." d'un fichier ?" ;
00464 finp() ;
00465
00466 p("texte") ;
00467 echo " Peut-on créer automatiquement des grammaires à partir d'exemples ?" ;
00468 echo " Que faut-il attendre de ce genre de production automatique ?" ;
00469 finp() ;
00470
00471 solution($numExo,$numSerie) ;
00472
00473 p("texte") ;
00474 echo "La grammaire pour ".href("films2.xml")." est un peu compliquée à écrire. " ;
00475 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 " ;
00476 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 " ;
00477 echo " certains films n'ont pas d'élément RESUME, certains artistes n'ont pas d'élément ANNEENAISS. " ;
00478 finp() ;
00479
00480 p("texte") ;
00481 echo "On pourrait éventuellement avoir une idée de la concomittance entre éléments et attributs " ;
00482 echo " à l'aide notre programme ".href("../eltatt.php","eltatt") ;
00483 echo " si on l'applique à ".b("films5.xml")." soit le " ;
00484 echo href("../eltattres.php?url=http://forge.info.univ-angers.fr/~gh/Webrd/films5.xml","résultat suivant").". " ;
00485 finp() ;
00486
00487 p("texte") ;
00488 echo " On peut donc écrire la grammaire minimale suivante qui autorise à n'avoir aucun film ni aucun " ;
00489 echo " artiste :" ;
00490 echo " " ;
00491 finp() ;
00492
00493 pre_fichier("films2.dtd","cadrejaune") ;
00494
00495 p("texte") ;
00496 echo "Il n'est pas possible de profiter directement des déclarations ".ghVert("ID")." et ".ghVert("IDREF")." des $DTD car dans la norme $XML un identifiant ou une référence " ;
00497 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 " ;
00498 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 :" ;
00499 finp() ;
00500
00501 pre_fichier("valide_id.txt","cadre") ;
00502
00503 p("texte") ;
00504 echo " Si on modifie le fichier des films en ajoutant " ;
00505 echo " les 3 lettres art devant chaque identifiant et chaque référence d'identifiant, soit :" ;
00506 finp() ;
00507
00508 pre_fichier("filmsids.txt","cadrebleu") ;
00509
00510 p("texte") ;
00511 echo " alors, on peut utiliser ".ghVert("ID")." et ".ghVert("IDREF")." comme suit :" ;
00512 finp() ;
00513
00514 pre_fichier("films3.dtd","cadre") ;
00515
00516 p("texte") ;
00517 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 " ;
00518 echo " ou si on fait référence à un identifiant qui n'existe pas " ;
00519 echo "(nous avons mis art3333 au lieu de art3 comme référence pour le premier film) :" ;
00520 finp() ;
00521
00522 pre_fichier("films3erreurs.txt","cadrejaune") ;
00523
00524 p("texte") ;
00525 echo " Nous verrons dans la prochaine série d'exercices, avec les transformations $XSL, comment ajouter automatiquement les trois lettres ".ghBleu("art")." pour " ;
00526 echo "les attributs ".b("id")." et ".b("idfref").", même si on peut le faire sous éditeur avec ".b("Edition/Remplacer tout") ;
00527 echo " ou avec un outil en ligne de commande comme ".b("sed")." ou ".b("perl")." en mode ".b("-i -e")."." ;
00528 finp() ;
00529
00530 p("texte") ;
00531 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 " ;
00532 echo " car les exemples précécents montrent qu'on peut définir plusieurs grammaires pour lesquelles un même fichier $XML est valide. " ;
00533 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 " ;
00534 echo " tout-à-fait normal de dire qu'un fichier est bien formé sans rien préciser d'autre. " ;
00535 finp() ;
00536
00537 p("texte") ;
00538 echo "Voici les grammaires utilisées :" ;
00539 finp() ;
00540
00541 blockquote() ;
00542 $listeDtd7 = listeFichiers("films",2,3,"dtd") ;
00543 $listeXsd7 = listeFichiers("films",2,3,"xsd") ;
00544 $liste7 = "$listeDtd7 $listeXsd7" ;
00545 montreListeFichiers($liste7,"visuListe7",20) ;
00546 finblockquote() ;
00547
00548 p("texte") ;
00549 echo "Il existe des outils pour créer automatiquement des grammaires à partir d'exemples, comme par exemple " ;
00550 echo href("http://www.thaiopensource.com/relaxng/trang.html","trang","grouge")." " ;
00551 echo " dont le manuel est ".href(" https://relaxng.org/jclark/trang-manual.html","ici").". " ;
00552 echo " Exemples d'utilisation :" ;
00553 finp() ;
00554
00555 pre_fichier("trangXmp.txt","cadre") ;
00556
00557 finsolution() ;
00558
00559 finblockquote() ;
00560
00561 ## -------------------------------------------------------------------------------------------
00562
00563 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # . Vérification des vérificateurs
00564
00565 ## -------------------------------------------------------------------------------------------
00566
00567 blockquote() ;
00568
00569 p("texte") ;
00570 echo " Pour vérifier un document $XML, on utilise une grammaire $DTD ou $XSD. " ;
00571 echo " Mais comment vérifier une grammaire $DTD ou $XSD ?" ;
00572 finp() ;
00573
00574 p("texte") ;
00575 echo " On pourra utiliser les grammaires incorrectes " ;
00576 echo href("bad.dtd")." et ".href("bad.xsd")." associées respectivement aux fichiers " ;
00577 echo href("baddtd.xml")." et ".href("badxsd.xml") ;
00578 echo " pour vérifier votre vérification de vérificateurs (!)." ;
00579 finp() ;
00580
00581 solution($numExo,$numSerie) ;
00582
00583 p("texte") ;
00584 echo " Exercice volontairement corrigé. " ;
00585 echo href("verificateurs.txt","Quoique...","nou noir") ;
00586 echo b("Venez en T.P. !") ;
00587 finp() ;
00588
00589 finsolution() ;
00590
00591 finblockquote() ;
00592
00593 ## -------------------------------------------------------------------------------------------
00594
00595 $tdmCRLM->afficheRubrique("oui") ; $numExo++ ; # . Rajout de contraintes
00596
00597 ## -------------------------------------------------------------------------------------------
00598
00599 blockquote() ;
00600
00601 p("texte") ;
00602 echo " Reprendre l'exercice 1 (la molécule) et définir un schéma $XSD plus restrictif que la $DTD avec les règles suivantes :" ;
00603 finp() ;
00604
00605 $url1 = "https://fr.wikipedia.org/wiki/Liste_des_%C3%A9l%C3%A9ments_chimiques" ;
00606 $url2 = "https://fr.wikipedia.org/wiki/Tableau_p%C3%A9riodique_des_%C3%A9l%C3%A9ments" ;
00607
00608 ul() ;
00609 li("le nom de l'atome doit comporter au moins ".href($url1,"deux lettres","nou noir")." (au fait, pourquoi ?)") ;
00610 li("le nombre d'atomes doit être un entier non négatif") ;
00611 li("l'attribut ".href($url2,"lettre","nou noir")." de l'atome doit comporter au moins une lettre en majuscule, suivie au maximum d'une lettre en minuscule (pourquoi ?)") ;
00612 finul() ;
00613
00614 solution($numExo,$numSerie) ;
00615
00616 p("texte") ;
00617 echo " Exercice volontairement corrigé. " ;
00618 echo href("contraintes.txt","Quoique...","nou noir") ;
00619 echo b("Venez en T.P. !") ;
00620 finp() ;
00621
00622 finsolution() ;
00623
00624 finblockquote() ;
00625
00626 ## -------------------------------------------------------------------------------------------
00627
00628 pvide() ;
00629
00630 ###########################################################################################
00631
00632 p() ;
00633 echo href("montresource.php?nomfic=l2xml_6_tp3.php","Code-source php de cette page","orange_stim nou")."." ;
00634 finp() ;
00635
00636 finSection() ;
00637
00638 if (!isset($_GET["standalone"])) { finPage() ; } ;
00639 ?>
Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.
Retour à la page principale de (gH)