Exam Maitrise CMO partie BDO O2 janvier 2002
Transcription
Exam Maitrise CMO partie BDO O2 janvier 2002
Nom : page 1 Prénom : Université Pierre et Marie Curie - Paris 6 - UFR 922 - Licence d'informatique Module Bases de Données et Sites Web Examen du 26 mai 2008 Version CORRIGEE Documents autorisés – Durée : 2h. Exercice 1 : XML, DTD, XPath 5 pts On considère le fichier Vehicules.xml suivant, décrivant des véhicules. <?xml version="1.0" encoding="UTF-8"?> <vehicules> <voiture const='C1'> <modele> <nom>Clio</nom> <type>TCE</type> </modele> <puissance>4</puissance> </voiture> <voiture const='C2'> <modele> <nom>Prius</nom> <type>linea</type> </modele> <puissance>5</puissance> </voiture> <camion const='C2'> <modele> <nom>Tundra</nom> <type>Double Cab</type> </modele> <puissance>8</puissance> </camion> <voiture const='C1'> <modele> <nom>Modus</nom> <type>turbo</type> </modele> <puissance>4</puissance> </voiture> <voiture const='C2'> <modele> <nom>Camry</nom> <type>BVA</type> </modele> <puissance>7</puissance> </voiture> <constructeur n='C1' nom='Renault'> <pays>France</pays> </constructeur> <constructeur n='C2' nom='Toyota'> <pays>Japon</pays> </constructeur> </vehicules> Question1. Ecrire une DTD Vehicules.dtd représentant des véhicules pour laquelle ce document est conforme. Lettres initiales du Prénom et du Nom: page 2 < !ELEMENT Vehicules ((Voiture,|Camion|Constructeur)*)> < !ELEMENT Voiture(modele,puissance)> < !ELEMENT Camion(modele,puissance)> < !ELEMENT Constructeur(pays)> < !ELEMENT modele(nom,type)> < !ELEMENT puissance (#PCDATA)> < !ELEMENT nom (#PCDATA)> < !ELEMENT type (#PCDATA)> < !ELEMENT pays(#PCDATA)> < !ATTLIST Voiture const IDREF #REQUIRED> < !ATTLIST Camion const IDREF #REQUIRED> < !ATTLIST Constructeur n ID #REQUIRED nom CDATA #REQUIRED> Question2.On considère les expressions XPath suivantes, appliquées au document Vehicules.xml. Pour chacune d’elles, indiquez ce qu’elles signifient, et ce qu’elles renvoient. a) //voiture[position()=4]/modele/nom Renvoie Camry. 4eme voiture du document b) //voiture[position()=2][puissance > 4]/modele/nom Renvoie Prius. Deuxième voiture du document qui a une puissance >4 c) //voiture[position()=2 and puissance > 4]/modele/nom Lettres initiales du Prénom et du Nom: Renvoie Prius d) //voiture [puissance > 4] [position()=2]/modele/nom Renvoie Camry. 2eme Voiture de puissance > 4 du document. Question3. Exprimez en XPath les requêtes suivantes sur le fichier Vehicules.xml : a) Nom des constructeurs de France //constructeur[pays=’France’] /@nom b) Pays du constructeur de la Clio //constructeur[@n=//voiture[modele/nom=’Clio’]@const]/pays c) Nom des modèles de voitures françaises //voiture[@const=//constructeur[pays=’France’]/@n]/modele/nom d) Nom des constructeurs qui ne construisent pas de camion. //constructeur[not(@n=//camion/@const)]/@nom page 3 Lettres initiales du Prénom et du Nom: page 4 Question 4. Indiquez pour chacune des requêtes suivantes la réponse correspondante parmi celles qui sont proposées : Requêtes : R1. //voiture[modele/nom=’Modus’]@const R2. //voiture/modele[nom=’Modus’]@const R3. //voiture[//nom=’Modus’]@const R4. //voiture[modele/nom=’Modus’]/@const Réponses : a) C1 b) C1 C2 c) C1 C2 C1 C2 d) Pas de réponse R1 ……………………. R2…………………….. R3……………………. R4……………………. Réponse : R1……..a R2……..d R3……c R4…….a Exercice 2 : XSLT 5 pts NB : Les questions 1 à 3 sont faciles de type TD. La question 4 mélange plusieurs difficultées (mini-problème). Barème : question 1 à 3 : 1 point, question 4 : 2 points On considère des fichiers XML qui contiennent une liste de documents sur internet. Chaque document est associé à son type (page web ou image), son url et à une description succincte du document. Ces fichiers XML suivent la DTD docs.dtd suivante : <!ELEMENT <!ELEMENT <!ATTLIST <!ELEMENT <!ELEMENT <!ELEMENT docs (doc*) > doc (type, url, description) > doc numero ID #REQUIRED> type (#PCDATA) > url (#PCDATA) > description (#PCDATA) > Par exemple, le fichier exemple.xml ci-dessous contient deux documents (un de type “page web” et un autre de type “image”) : <docs> <doc numero='1'> Lettres initiales du Prénom et du Nom: page 5 <type>page web</type> <url>http://www.upmc.fr</url> <description>Site web de l'UPMC</description> </doc> <doc numero='2'> <type>image</type> <url>http://www.upmc.fr/logo.jpg</url> <description>Nouveau logo de l'UPMC</description> </doc> </docs> Remarque : L’exemple ci-dessus contient seulement deux documents, mais vous répondrez aux questions suivantes afin que vos feuilles XSL puissent traiter tous fichiers XML au format docs.dtd. Question 1. Compléter la feuille XSL suivante pour qu’elle transforme un document XML (qui suit la DTD docs.dtd) en un autre document XML contenant seulement une liste d’URL. Ce nouveau document suit la DTD : <!ELEMENT adresses (ad*) > <!ELEMENT ad (#PCDATA)> Par exemple, le résultat obtenu pour le fichier exemple.xml est : < adresses> <ad>http://www.upmc.fr</ad> <ad>http://www.upmc.fr/logo.jpg</ad> </adresses> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match= "…………………………………"> /docs <adresses> <xsl:apply-templates select= "//doc"/> </adresses> </xsl:template> <xsl:template match= "…………………………………."> <ad><xsl:value-of select='url'/></ad> </xsl:template> doc Lettres initiales du Prénom et du Nom: page 6 </xsl:stylesheet> Question 2. Compléter la feuille XSL suivante pour quelle génère un nouveau document XML (qui respecte la DTD docs.dtd) contenant seulement les documents de type « image ». <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match=”…………………………………...”> /docs <docs> <xsl:copy-of select= "//doc[type='image']"/> </docs> </xsl:template> </xsl:stylesheet> Question 3 : Compléter la feuille XSL ci-dessous pour qu’elle transforme le document XML en une page HTML indiquant le nombre de documents de type « image » et le nombre de documents de type « page web » dans le fichier XML. Par exemple, pour le fichier exemple.xml, le code HTML obtenu est : <HTML> <p>Nombre d’images : 1</p> <p>Nombre de pages web : 1 </p> </HTML> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match= "…………………………………"> /docs <HTML> <p>Nombre d’images : <xsl:value-of select="count(//doc[type='image'])"/></p> <p>Nombre de pages web : <xsl:value-of select="count(//doc[type='page web'])"/></p> </HTML> Lettres initiales du Prénom et du Nom: page 7 </xsl:template> </xsl:stylesheet> Question 4. Compléter la feuille XSL ci-dessous pour qu’elle transforme un document XML (suivant la DTD docs.dtd) en un page HTML qui affiche un tableau HTML contenant une ligne par document. Pour chaque document, on affiche seulement son numéro (première colonne du tableau) et son url (deuxième colonne du tableau) : les urls des documents de type « page web » sont affichées comme des liens cliquables ayant la description du document comme valeur du lien, et les urls des documents de type « image » sont remplacées par l’image avec un attribut alt contenant la description du document. Par exemple, pour le fichier exemple.xml, le code HTML obtenu est : <HTML> <TABLE BORDER="1"> <TR><TH>Numero</TH><TH>URL</TH></TR> <TR><TD>1</TD><TD><A href="http://www.upmc.fr">Site web de l'UPMC</A></TD></TR> <TR><TD>2</TD><TD><IMG width="200" src="http://www.upmc.fr/logo.jpg" alt="Nouveau logo de l'UPMC"></TD></TR> </TABLE> </HTML> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match= "…………………………………."> </xsl:template> <xsl:template match= "…………………………………"> Lettres initiales du Prénom et du Nom: page 8 </xsl:template> </xsl:stylesheet> <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" indent="yes" /> <xsl:template match= "/docs"> <HTML> <TABLE BORDER='1'> <TR><TH>Numero</TH><TH>URL</TH></TR> <xsl:apply-templates select= "//doc"/> </TABLE> </HTML> </xsl:template> <xsl:template match= "doc"> <TR> <TD><xsl:value-of select='@numero'/></TD> <TD> <xsl:if test="type='image'"> <IMG width='200'> <xsl:attribute name='src'><xsl:value-of select='url'/></xsl:attribute> <xsl:attribute name='alt'><xsl:value-of select='description'/></xsl:attribute> </IMG> </xsl:if> <xsl:if test="type='page web'"> <A><xsl:attribute name='href'><xsl:value-of select='url'/></xsl:attribute> <xsl:value-of select='description'/> </A> </xsl:if> </TD> </TR> </xsl:template> </xsl:stylesheet> page 9 Lettres initiales du Prénom et du Nom: Exercice 3 : SQL3 5 pts On considère une base de données pour la gestion des menus d’un restaurant, dont le schéma Entité/Association est donné ci-dessous : : Equivalent type nom : poids Nom Préparation composant_de Recette : durée : : : : : Ingrédient_de fait_partie accompagne : : Menu Date Vin Nom Type Nom On précise qu’un menu peut être composé des recettes suivantes (décrite par le type de recette) : une entrée (optionnelle), d’un plat (obligatoire) et d’un dessert (optionnel). Une recette est faite de préparations, elles-mêmes éventuellement composées d’autres préparations qui leur servent d’ingrédient. Par exemple, la sauce béchamel peut servir (entre autres) à confectionner une sauce mornay (en lui ajoutant de l’œuf et du fromage). Les ingrédients de base (beurre, œuf, etc) peuvent donc être considérés comme des préparations n’ayant pas d’ingrédient et de durée nulle. Une préparation pouvant ne pas être réalisable (manque d’un ingrédient de base par exemple), il existe éventuellement une préparation équivalente. Un vin a un type (« rouge », « rosé », « champagne », etc.) et chaque recette peut être accompagnée d’un ou plusieurs vins. Question 1 ( 1 points) Compléter le schéma précédent en indiquant les cardinalités maximum:minimum dans les cadres prévus à cet effet. On rappelle que les cardinalités s’expriment d’une entité vers une association, la flèche indique le sens de lecture pour les associations réflexives. Une cardinalité peut-être un nombre entier (1, 2, 3…) ou alors N, pour indiquer que le nombre ne peut être borné. Préparation 0:N Ingrédient 1:N Préparation Lettres initiales du Prénom et du Nom: page 10 Préparation 0:1 Equivalent 0 :1 Préparation Recette 1:N Composé 1 :N Préparation Recette 1:N Accompagne 1 :N Vin Recette 1:N fait_partie 1 :3 Menu Question 2 ( 1 point) Quelle(s) contrainte(s) d’intégrité sur un ou des attribut(s) de Préparation est induite par l’association Ingrédient_de ? Répondre en français. Le poids d’une préparation est égale à la somme des poids de ses ingrédients. La durée d’une préparation est supérieure à la durée maximale de ses ingrédients. Question 3 ( 2 points) Compléter la série d’instruction SQL3 suivante pour créer le schéma d’une telle base de données. Vous ne pouvez pas créer de type supplémentaire ni de table supplémentaire. CREATE TYPE .....................................................; CREATE TYPE Vin AS OBJECT ( ……………………………………………………….. ……………………………………………………….. ……………………………………………………….. ); CREATE TYPE Menu AS OBJECT ( nom VARCHAR2(50), date Date ); Lettres initiales du Prénom et du Nom: CREATE TYPE LesVins AS ………………………. Vin; CREATE TYPE Recette AS OBJECT ( nom VARCHAR2(50), type VARCHAR2(30), fait_partie ……………………, accompagne …………………. ); CREATE TYPE EnsRecettes AS …………………………………….. Recette; CREATE TYPE EnsPréparation AS …………………………………. Preparation; CREATE TYPE Préparation AS OBJECT ( nom ………………………………………………, durée …………………………………………….., poids……………………………………………..., composant_de ……………………………………..., équivalent ……………………………………..., ingrédient_de ……………………………………..., ); CREATE TABLE LesPréparations OF………… ………………………………………… ………………………………………… ……………………………………………. ; CREATE TABLE LesMenus OF ………… ………………………………………… ………………………………………… ……………………………………………. ; page 11 Lettres initiales du Prénom et du Nom: CREATE TABLE LesRecettes OF………… ………………………………………… ………………………………………… ……………………………………………. ; CREATE TYPE Préparation; CREATE TYPE Vin AS OBJECT ( type VARCHAR2(20), nom VARCHAR2(20) ); CREATE TYPE Menu AS OBJECT ( nom VARCHAR2(50), date Date ); CREATE TYPE LesVins AS TABLE OF REF Vin; CREATE TYPE Recette AS OBJECT ( nom VARCHAR2(50), type VARCHAR2(30), fait_partie REF Menu, accompagne LesVins ); CREATE TYPE EnsRecettes AS TABLE OF REF Recette; CREATE TYPE EnsPréparation AS TABLE OF REF Preparation; CREATE TYPE Préparation AS OBJECT ( nom VARCHAR(20), durée NUMBER(3), poids NUMBER(3), page 12 Lettres initiales du Prénom et du Nom: page 13 composant_de EnsRecettes, équivalent REF Préparation, ingrédient_de EnsPréparation ); CREATE TABLE LesPréparations OF Préparation ; CREATE TABLE LesMenus OF Menu ; CREATE TABLE LesRecettes OF Recette NESTED TABLE accompagne STORE AS tabvins; Question 4 (1 point) Quel problème de redondances posent les associations Composant_de et Ingrédient_de par rapport à l’entité Préparation ? Indiquez ci-dessous les modifications à apporter au schéma Entité/Association (ajouter uniquement des attributs dans le schéma ci-dessous) pour résoudre ce problème. Problèmes de redondance : Modification du schéma Entité/Association : Equivalent Recette Composant Préparation Ingrédient_de Lettres initiales du Prénom et du Nom: page 14 Reportez ces modifications sur les créations de type : rayez les types inutiles et créez les nouveaux types nécessaires. Lorsqu’un type est inchangé par rapport à la question 3, il suffit d’indiquer « inchangé ». CREATE TYPE .....................................................; CREATE TYPE Vin AS OBJECT (……………………………………………………….. ……………………………………………………….. ); CREATE TYPE Menu AS OBJECT (nom VARCHAR2(50), date Date ); CREATE TYPE LesVins AS ………………………. Vin; CREATE TYPE Recette AS OBJECT ( nom VARCHAR2(50), type VARCHAR2(30), fait_partie ……………………, accompagne …………………. ); CREATE TYPE EnsRecettes AS …………………………………….. Recette; CREATE TYPE EnsPréparation AS …………………………………. Preparation; CREATE TYPE Préparation AS OBJECT ( nom ………………………………………………, Lettres initiales du Prénom et du Nom: durée …………………………………………….., poids……………………………………………..., composant_de ……………………………………..., équivalent ……………………………………..., ingrédient_de ……………………………………..., ); CREATE TABLE LesPréparations OF………… ………………………………………… ………………………………………… ……………………………………………. ; CREATE TABLE LesMenus OF ………… ………………………………………… ………………………………………… ……………………………………………. ; CREATE TABLE LesRecettes OF………… ………………………………………… ………………………………………… ………………………………………; CREATE TYPE Préparation; CREATE TYPE Vin AS OBJECT ( type VARCHAR2(20), nom VARCHAR2(20) ); CREATE TYPE Menu AS OBJECT ( nom VARCHAR2(50), date Date ); CREATE TYPE LesVins AS TABLE OF REF Vin; page 15 Lettres initiales du Prénom et du Nom: CREATE TYPE Recette AS OBJECT ( nom VARCHAR2(50), type VARCHAR2(30), fait_partie REF Menu, accompagne LesVins ); CREATE TYPE EnsRecettes AS TABLE OF REF Recette; CREATE TYPE EnsPréparation AS TABLE OF REF Preparation; CREATE TYPE CompoR as OBJECT ( quoi REF Recette, Combien NUMBER(3) ); CREATE TYPE EnsCompoR as TABLE of CompoR ; CREATE TYPE CompoP as OBJECT ( quoi REF Preparation, Combien NUMBER(3) ); CREATE TYPE EnsCompoP as TABLE of CompoP ; CREATE TYPE Préparation AS OBJECT ( nom VARCHAR(20), durée NUMBER(3), poids NUMBER(3), composant_de EnsCompoR, équivalent REF Préparation, ingrédient_de EnsCompoP ); CREATE TABLE LesPréparations OF Préparation NESTED TABLE composant_de STORE as tabcompo NESTED TABLE ingredient_de STORE as tabingre ; CREATE TABLE LesMenus OF Menu ; page 16 Lettres initiales du Prénom et du Nom: page 17 CREATE TABLE LesRecettes OF Recette NESTED TABLE accompagne STORE AS tabvins; Exercice 4 : PHP 5 pts Soit le script PHP suivant <HTML> <HEAD><TITLE> Etudiants inscrits </TITLE></HEAD> <BODY> <TABLE border=1> <TR><TD>Nom </TD><TD>Prénom </TD></TR> < ? $cnx=mysql_connect(”localhost ”, ”NomResp”, ”PassResp”) ; Mysql_select_db(“Notes”,$cnx); $req = mysql_query(”select * from BaseEtudiant”, $cnx) ; while ($res=mysql_fetch_array($req)){ echo ”<TR><TD>”.$res[“NomE”] . ”</TD><TD>”.$res[”PrenomE”].”</TD></TR>\n”; } ?> </TABLE> </BODY> </HTML> 1- Expliquez ce que fait ce script ? Le script affiche sur une page html les étudiants inscrits (nom+prénom) et qui sont stockés dans la base BaseEtudiant. La consultation de la page se fait via le script php qui interroge la base BaseEtudiant et affiche le nom et le prénom des étudiants les uns après les autres dans un tableau. 2- On suppose que la table BaseEtudiant contient les n-uplets suivants : Lettres initiales du Prénom et du Nom: page 18 (Durand, Matthieu) ; (Dupont, Xavier) ; (Mary, Zoé) Représentez sur un schéma le résultat de l’exécution de ce code dans un navigateur. Nom Prénom Durand Matthieu Dupont Xavier Mary Zoé 3- On veut ajouter à ce code deux champs de saisies permettant à un responsable de rentrer les notes de partiels et d’examens. Chacun de ces deux champs apparaissent devant les noms et les prénoms des étudiants. Indiquez les modifications à apporter au script précédent permettant l’affichage de ces champs ainsi que le bouton d’envoi du formulaire. Une fois le bouton d’envoi est pressé, le script PHP CalculNote.php calculera la moyenne générale des notes (voir la question suivante). Indication : On pourra utiliser un champ idp et ide permettant le repérage des notes de partiels et d’examens. L’ajout de nouvelles parties se fait en gras. <HTML> <HEAD><TITLE> Articles choisis </TITLE></HEAD> <BODY> <center> <TABLE border=1> <TR><TD>Nom produit</TD><TD>Prix Unitaire</TD><TD>Note Partiel</TD><TD>Note Examen</TD></TR> <form method="post" action="CalculNote.php"> <?php $cnx=mysql_connect(”localhost ”, ”NomResp”, ”PassResp”) ; mysql_select_db("Notes ", $cnx); $req = mysql_query("select * from BaseEtudiant ",$cnx); $idp=1; $ide=1; while ($res=mysql_fetch_array($req)){ Lettres initiales du Prénom et du Nom: page 19 echo "<TR><TD>".$res["NomE "] . "</TD><TD>".$res["PrenomE "].'</TD><TD> <input type="text" size="2" name='.$idp.'> </TD><TD> <input type="text" size="2" name='.$ide.'> </TD></TR>'; $idp+=1; $ide+=1; } echo '</TABLE><BR>'; echo '<input type="submit" name="Submit" value="OK">'; ?> </form> </center> </BODY> </HTML> 3- On s’intéresse maintenant au script CalculNote.php calculant la moyenne générale. Pour cela on suppose que le coefficient du partiel vaut 0.4 et celui de l’examen est égal à 0.6. Donnez les instructions permettant d’afficher la moyenne générale des notes. Indication : La formule de ce calcul est 1 MoyenneG = ∑ 0.4 * x. partiel + 0.6 * x.examen où x.partiel (respectivement x.examen) NbEtudiants x∈{Etudiants} est la note du partiel (respectivement de l’examen) de l’étudiant x. Le script CalculNote.php : <html> <body bgcolor="#00CCCC" text="#FFFFFF" link="#990066"> <hr /> <p align="center"><font size="5">Moyenne Générale</font></p> <hr /> <?php Lettres initiales du Prénom et du Nom: $cnx=mysql_connect(”localhost ”, ”NomResp”, ”PassResp”) ; mysql_select_db("Notes ", $cnx); $req = mysql_query("select * from BaseEtudiant ",$cnx); $idp=$ide=1; $Somme=0; $NbE=1 ; while ($res=mysql_fetch_array($req)){ if($_POST[$idp]>=0 && $_POST[$ide]>=0){ $Somme+=0.4*$_POST[$idp]+ 0.6*$_POST[$ide]; $NbE++ ; } $id+=1; } $Moyenne=$Somme/$NbE ; echo "<B>$Moyenne</B>"; ?> </body> </html> page 20