Correction TP XQury/Oracle

Schéma XML

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://epu.univ-lyon1.fr/info2a/forum"
	xmlns:tns="http://epu.univ-lyon1.fr/info2a/forum" elementFormDefault="unqualified">
 
 
    <complexType name="messageType">
    	<sequence>
    		<element name="titre" type="string"></element>
    		<element name="corps" type="string"></element>
    	</sequence>
    	<attribute name="id" type="ID" use="optional"></attribute>
    	<attribute name="auteur" type="IDREF" use="required"></attribute>
    	<attribute name="reponse_a" type="IDREF" use="optional"></attribute>
    	<attribute name="date" type="dateTime" use="required"></attribute>
    </complexType>
 
    <complexType name="salleType">
    	<sequence>
    		<element name="titre" type="string"></element>
    		<element name="message" type="tns:messageType"
    			maxOccurs="unbounded" minOccurs="1">
    		</element>
    	</sequence>
    	<attribute name="id" type="ID" use="optional"></attribute>
    	<attribute name="moderateur" type="IDREF" use="optional"></attribute>
    </complexType>
 
    <complexType name="membreType">
    	<sequence>
    		<element name="nom" type="string"></element>
    		<element name="email" type="string"></element>
    	</sequence>
    	<attribute name="id" type="ID" use="required"></attribute>
    </complexType>
 
    <element name="forum">
    	<complexType>
    		<sequence>
    			<element name="salle" type="tns:salleType" maxOccurs="unbounded" minOccurs="0"></element>
    			<element name="membre" type="tns:membreType" maxOccurs="unbounded" minOccurs="0"></element>
    		</sequence>
    	</complexType>
    </element>
</schema>

XPath

  1. Donne les titres des actes de la pièce
  2. Vide: il n'y a pas de titre dans une ligne. On peut changer LINE en SCENE
  3. La liste des personnages de la pièce
  4. La liste des personnages de la pièce qui ne sont pas dans un groupe
  5. Vide. Changer PERSONA en SPEAKER
  6. Vide. CHanger following en preceding
  7. La première ligne de chaque scène

Requêtes

  1. sur le forum:
    1. XQUERY
      doc("/public/bdav/forum/exemple1.xml")//message[../message/@reponse_a = @id]
      /
    2. XQUERY
      doc("/public/bdav/forum/exemple1.xml")//message[@reponse_a = 2]
      /
    3. XQUERY
      doc("/public/bdav/forum/exemple1.xml")//membre[@id = ../salle/message[@auteur = following::message/@auteur]/@auteur]
      /
  2. sur la pièce:
    1. XQUERY
      doc("/public/bdav/shakespear/hamlet.xml")//SPEECH[SPEAKER="HAMLET" or SPEAKER = "HORATIO"]/LINE
      /
    2. XQUERY
      doc("/public/bdav/shakespear/hamlet.xml")//SPEECH[SPEAKER="HAMLET"]/following-sibling::SPEECH[1][SPEAKER="HORATIO"]/../TITLE
      /

XQuery

  1. Transformation forum
    1. XQUERY
      <auteurs>
      {
      for $a in doc("/public/bdav/forum/exemple1.xml")//membre
      return
        <auteur>{$a/@*}{$a/*}</auteur>
      }
      </auteurs>
      /
    2. XQUERY
      <auteurs>
      {
      for $a in doc("/public/bdav/forum/exemple1.xml")//membre
      return
        <auteur>{$a/@*}
          {$a/*}
          {$a/..//message[@auteur = $a/@id]}
        </auteur>
      }
      </auteurs>
      /
  2. Présentation forum
    XQUERY
    <html>
    <head><title>Forum</title></head>
    <body>
    {
    for $s in doc("/public/bdav/forum/exemple1.xml")//salle
    return
      (<h1>{$s/titre/text()}</h1>,
       for $m in $s/message
       let $a := $s/../membre[@id = $m/@auteur]
       return 
        (<h2>{$m/titre/text()}</h2>,
         <p><a href="mailto:{$a/email/text()}">{$a/nom/text()}</a></p>,
         <p>{$m/corps/text()}</p>
         )
       )
       }
    </body>
    </html>
    /
  3. Transformation théâtre
    XQUERY
    let $doc := doc("/public/bdav/shakespear/hamlet.xml")
    return
    <forum>
    {
    for $s in $doc//SCENE
    return
      <salle><titre>{$s/TITLE/text()}</titre>
      {
        for $sp in $s/SPEECH
        let $tit := $sp/LINE[1]/text(),
            $corps := $sp/LINE[position() > 1]/text(),
            $aut := $sp/SPEAKER/text()
        return 
          <message date="{current-dateTime()}" auteur="{$aut}">
            <titre>{$tit}</titre>
            <corps>{$corps}</corps>
          </message>
      }
      </salle>
    }
    {
    for $p in $doc//PERSONA
    let $n := $p/text()
    return
      <membre id="{$n}"><nom>{$n}</nom><email>{$n}@shakespeare.net</email></membre>
    }
    </forum>
    /