Vous êtes sur la page 1sur 5

Université Cergy-Pontoise 16/12/2019

Licence Informatique L3

Option XML
Examen

Soit le document options.xml, qui présente des informations sur des cours optionnels et les
étudiants qui les suivent. Un extrait de ce fichier est présenté ici :
<options>
<cours id="c1" titre="XML">
<responsable>D. Vodislav</responsable>
<description>Ce cours permet de <objectif>découvrir le format XML</objectif> et
<objectif>maitriser les langages liés à XML</objectif>. Prérequis : <prérequis>
programmation Java</prérequis> et <prérequis>HTML</prérequis></description>
<séance no="1" date="20/09/2019">XML : les bases</séance>
...
</cours>
<cours id="c2" titre="Developing mobile applications">
<responsable>D. Kotzinos</responsable>
<description>...</description>
<séance no="1" date="20/09/2019">Introduction</séance>
...
<remarque>Enseignement en anglais</remarque>
</cours>
...
<étudiant numéro="n123456">
<nom>Philippe Dupont</nom>
<option cours="c1" note="14"/>
...
<absence type="justifiée">27/09/2019</absence>
...
</étudiant>
...
</options>

options
* *
cours étudiant
? *
* *
@id @titre responsable description séance remarque @numéro nom option absence

objectif prérequis @no @date @cours @note @type


I. DTD et XML Schema (5,5 pts)
1. (2,5 pts) Ecrivez la DTD qui correspond à l’élément cours et tous les éléments inclus.
<!ELEMENT cours (responsable, description, séance+, remarque?)>
<!ATTLIST cours id ID #REQUIRED
titre CDATA #REQUIRED>
<!ELEMENT responsable (#PCDATA)>
<!ELEMENT description (#PCDATA|objectif|prérequis)*>
<!ELEMENT objectif (#PCDATA)>
<!ELEMENT prérequis (#PCDATA)>
<!ELEMENT séance (#PCDATA)>
<!ATTLIST séance no CDATA #REQUIRED
date CDATA #REQUIRED>
<!ELEMENT remarque (#PCDATA)>

2. (3 pts) Décrivez en XML Schema l’élément étudiant et tous les éléments inclus.
Déclarez la clé de cours et les éventuelles clés étrangères qui y font référence.
<xsd:element name="étudiant" type="étudiantType"/>
<xsd:complexType name="étudiantType">
<xsd:sequence>
<xsd:element name="nom" type="xsd:string"/>
<xsd:element name="option" type="optionType"
maxOccurs="unbounded"/>
<xsd:element name="absence" type="absenceType" minOccurs="0"
maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="numéro" type="xsd:string" use="required"/>
</xsd:complexType>
<xsd:complexType name="optionType">
<xsd:attribute name="cours" type="xsd:string" use="required"/>
<xsd:attribute name="note" type="xsd:float" use="required"/>
</xsd:complexType>
<xsd:complexType name="absenceType">
<xsd:simpleContent>
<xsd:extension base='xsd:date'>
<xsd:attribute name='type' type='xsd:string'/>
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

à placer dans l'élément options


<xsd:key name="coursKey">
<xsd:selector xpath="cours"/>
<xsd:field xpath="@id"/>
</xsd:key>
<xsd:keyref name="coursRef" refer="coursKey">
<xsd:selector xpath="étudiant/option"/>
<xsd:field xpath="@cours"/>
</xsd:keyref>
II. XPath (6 pts) Exprimez en XPath les requêtes suivantes :
3. (1 pt) Les dates où Marie Durand a eu des absences non justifiées.
//étudiant[nom="Marie Durand"]/absence[@type="non justifiée"]/text()
4. (1 pt) Le titre des cours qui commencent à partir de janvier 2020.
//cours[séance[1]/@date>="01/01/2020"][séance[1]/@date<"01/02/2020"]/@titre/string()
5. (1 pt) Le nom de la séance après « Introduction » dans le cours « Developing mobile
applications ».
//cours[@titre='Developing mobile applications']/séance[.='Introduction']/following-
sibling::séance[1]/text()
6. (1,5 pt) La moyenne des notes du cours « XML ».
avg(//étudiant/option[@cours=//cours[@titre='XML']/@id]/@note)
7. (1,5 pt) Les responsables des cours suivis par moins de 10 étudiants.
//cours[count(//étudiant/option/@cours=@id)<10]/responsable
//cours[count(//étudiant[option/@cours=@id])<10]/responsable
//cours[count(for $e in //étudiant where $e/option/@cours=@id return $e) <10]/
responsable

III. XSLT (5 pts)


8. (3 pts) Ecrivez une feuille XSLT qui produit un fichier HTML ayant pour titre
"Options" et qui affiche tous les cours sous une forme similaire à celle-ci-dessous :
XML: responsable D. Vodislav, 29 étudiants
1. XML : les bases (20/09/2019)

Pour chaque cours, on affiche donc son titre, son responsable, le nombre d’étudiants
inscrits, ensuite la liste des séances (titre et date).
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="ISO-8859-1"/>

<xsl:template match="/">
<html>
<head><title>Options</titre></head>
<body><xsl:apply-templates select="options/cours"/></body>
</html>
</xsl:template>
<xsl:template match="cours">
<p><b><xsl:value-of select="@titre"/></b>
<xsl:text>: responsable </xsl:text>
<xsl:value-of select="responsable"/>
<xsl:text>, </xsl:text>
<xsl:value-of select="count(//étudiant[option/@cours=current()/@id])"/>
<xsl:text> étudiants</xsl:text>
<ol><xsl:apply-templates select="séance"/></ol>
</p>
</xsl:template>
<xsl:template match="séance">
<li><i><xsl:value-of select="."/></i>
<xsl:text> (</xsl:text>
<xsl:value-of select="@date"/>)
</li>
</xsl:template>
</xsl:stylesheet>

9. (2 pts) Ecrivez une feuille XSLT qui produit une copie du document options.xml, dans
laquelle on élimine les balises description et on remplace l’attribut cours de
l’option par le titre de cours en texte (par exemple <option cours="c1"
note="14"/> devient <option note="14">XML</option>)

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="description"/>

<xsl:template match="@cours">
<xsl:value-of select="//cours[@id=current()]/@titre"/>
</xsl:template>

</xsl:stylesheet>

IV. XQuery (3,5 pts)

Exprimez en XQuery les requêtes suivantes :


10. (1,5 pts) Pour chaque cours, retourner un élément option contenant le titre du cours
en tant que sous-élément et les étudiants inscrits dans le cours sous forme d’éléments
étudiant avec le nom et la note en tant qu’attributs.
for $c in doc("options.xml")//cours
return <option>
<titre>{$c/@titre/string()}</titre>
{for $e in doc("options.xml")//étudiant
where $e/option/@cours=$c/@id
return
<étudiant nom="{$e/nom/text()}">{$e/@note}</étudiant>}
</option>
11. (2 pts) Pour chaque étudiant du cours XML, retourner un élément étudiantXML
contenant le nom de l’étudiant comme attribut et la liste de ses absences à ce cours,
sous forme d’élément absences contenant les éléments séance du cours pour les
séances où il a été absent.
for $e in doc("options.xml")//étudiant,
$xml in doc("options.xml")//cours
where $c/@titre='XML' and $e/option/@cours = $xml/@id
return <étudiantXML nom="{$e/nom/text()}>
<absences>
{for $a in $e/absence, $s in $xml/séance
where $a=$s/@date
return $s}
</absences>
</étudiantXML>

Vous aimerez peut-être aussi