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
= 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")."&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
= 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&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     
?>

Pour ne pas voir les numéros de ligne, ajoutez &nl=non à la suite du nom du fichier.

 

 

retour gH    Retour à la page principale de   (gH)