SGBD et XML : Synergie ou Conflit ?
SGBD et XML : Synergie ou Conflit ?
Olivier Perrin
IUT Nancy-Charlemagne
Département Informatique
Université Nancy 2
[Link]@[Link]
SGBD
2
XML
3
XML (2)
4
XML (2)
4
XML (3)
5
XML: un exemple
Déclaration Entête
<?xml version=”1.0” ?>
<!DOCTYPE adresses SYSTEM “[Link] Type de
<!-- Mon fichier d’adresses --> document
Commentaire
<adresses> Racine du document
<personne id =”p01”> Attribut
<type rang=”maître de conférences” /> Élément vide
<nom>Perrin</nom>
<prenom>Olivier<prenom> Élément non vide
<adresse>IUT Nancy-Charlemagne, Université de Nancy 2</adresse>
</personne> Balise d’ouverture Balise de fermeture
</adresses>
Corps du
document
6
XML: format interne
• C’est un arbre
7
XML: format interne
• C’est un arbre
7
XML: format interne
• C’est un arbre
7
Pourquoi XML ?
8
Comparaison Données/Documents
• Approche «Donnée»
• structuration forte et simple
• compatibilité SGBDR existants
• mise à jour en place
• intégrité sémantique
• indexation exacte
• adapté au transactionnel et décisionnel
• performances «moyenne» à «forte» pour une volumétrie «moyenne »
• Approche «Document»
• structuration faible et complexe
• systèmes documentaires spécialisés
• gestion de versions
• recherche textuelle
• indexation approchée
• accès type moteur de recherche
• performances «moyenne» pour une volumétrie «forte»
9
Avantages de XML
10
Faiblesses de XML
11
XML et BD
12
Modèles de données
Document XML
14
Document bien formé (well-formed)
• Commence par une déclaration XML (attribut version obligatoire) avec possibilité de
choisir un encodage (le défaut est utf-8):
<?xml version="1.0" encoding="ISO-8859-1"?>
• Structure hiérachique:
• les balises d’ouverture et de fermeture doivent apparaître et correspondre
• pas de croisements de type <i>...<b>...</i> .... </b>
• sensible à la casse: "LI" n’est pas égal à "li" par exemple
• balises "EMPTY" utilisent la syntaxe XML "auto-fermante": <br/>
• les valeurs d’attributs sont quotés: <a href="[Link]
• un seul élément racine (root):
• l’élément root ne peut apparaître qu’une fois et ne doit pas apparaître dans un
autre élément
• Caractères spéciaux (!!) : <, &, >,", ’
• utilisez < & > &aquot; ' à la place dans un texte !
• les espaces sont préservés
15
Document valide (valid)
16
DTD
• C’est une grammaire dont les phrases sont des documents XML (instances) qui :
• permet de définir le «vocabulaire» (définit le jeux de balises utilisables ainsi que
leurs attributs)
• et la structure qui sera utilisée dans le document XML (l’imbrication des balises)
• possibilité de décrire si les balises sont obligatoires ou optionnelles
• La DTD peut être référencé par un URI ou incluse directement dans le document
XML
• Il existe d’autres types de grammaires comme XML Schema (XSD), Relax NG, etc.
• leur puissance sémantique est plus élevée (on peut exprimer plus de contraintes)
• Relax NG offre le meilleur rapport puissance/facilité
• DTD est le plus répandu
• XML Schema le plus souvent utilisé pour formaliser des langages "webservices",
par ex. SOAP
17
Déclaration élément simple
• Exemple
<!ELEMENT Nom (#PCDATA)>
<Nom>Victor Hugo</Nom>
18
Élements composés
A et B Explication Exemples
A (un seul) est une option,
A? <!ELEMENT personne (nom, email?)
(donc: A ou rien)
A+ Il faut un ou plusieurs A <!ELEMENT personne (nom, email+)
A* A est une option, il faut 0, 1 ou plusieurs A <!ELEMENT personne (nom, email*)
A|B Il faut A ou B, mais pas les deux <!ELEMENT personne (email|fax)
A,B Il faut A suivi de B (dans l’ordre) <!ELEMENT personne (nom, email ?)
Les parenthèses regroupent.
(A, B)+ <!ELEMENT liste (nom, email)+
Ici, un ou plusieurs (A suivi de B)
19
Exemple
• DTD
<!ELEMENT personne (nom, prenom+, tel?, adresse >
<!ELEMENT nom (#PCDATA) >
<!ELEMENT prenom (#PCDATA) >
<!ELEMENT tel (#PCDATA) >
<!ELEMENT email (#PCDATA) >
<!ELEMENT Adresse (ANY) >
• Document associé
<personne>
<nom>Hugo</nom>
<prenom>Victor</prenom>
<prenom>Charles</prenom>
<tel>0383000000</tel>
<adresse><rue/><ville>Paris</ville></adresse>
</personne>
20
Attributs
21
Exemple
23
Exemple de DTD
<carnetAdresses>
<personne>
<nom><famille>Perrin</famille><prenom>Olivier</prenom></nom>
<email>[Link]@[Link]</email>
</personne>
<personne>
<nom><famille>Lagrange</famille><prenom>Anne</prenom></nom>
<email>[Link]@[Link]</email>
</personne>
</carnetAdresses>
24
ID et IDREF
25
Association DTD/document XML
26
Association DTD/document XML (2)
• Syntaxe de la déclaration
• chaque déclaration de la DTD commence par <!DOCTYPE ... et fini par >
• la racine de l’arbre XML (ici: <hello>) doit être indiquée après <!DOCTYPE
• syntaxe pour définir une DTD interne (seulement !)
• la DTD sera insérée entre [ ... ]
<!DOCTYPE hello [
<!ELEMENT hello (#PCDATA)>
]>
• syntaxe pour définir une DTD privée externe:
• la DTD est dans l’URL indiqué après le mot clef "SYSTEM"
<!DOCTYPE hello SYSTEM "[Link]">
• déclaration de la DTD dans le fichier XML et PAS dans le fichier *.dtd.
• Définition de la racine de l’arbre
• le mot "hello" après le mot clef DOCTYPE indique que "hello" est l’élément
racine de l’arbre XML
<!DOCTYPE hello SYSTEM "[Link]">
27
Association DTD/document XML (3)
28
Concepts additionnels (non développés ici)
30
Exercice
Commande Client
1..* passer
num: int code: int
statut: char nom: text
total: float type: CCC
0..*
livrer gérer
0..*
1..*
Magasin
Ligne numero: int
quantite: int rue: text
article: CCNNN complement: text
statut: char codePostal: int
total: EUR ville: text
31
Passage UML vers DTD (2)
32
Le document XML associé
34
XML Schema
35
Objectifs
36
Modèle des schémas
37
Types simples
38
Commandes de base
39
Exemples de types simples
• Exemple
<simpleType name="entier0_a_100">
<restriction base="integer">
<minInclusive value="0"/>
<maxInclusive value="100"/>
</restriction>
</simpleType>
Exemple 2
<simpleType name="listeEntier">
<list itemType="integer"/>
</simpleType>
40
Types complexes
41
Héritage
42
Patterns
43
Conclusion
44
Langages de requêtes
• XPath
• XSLT
• XQuery
XPath
47
Syntaxe et sémantique
48
Le contexte
49
Les axes
50
Les axes (2)
51
Les filtres
52
Les prédicats
• Expression logique vraie ou fausse qui affine le résultat obtenu avec le chemin de
recherche
• Condition d’existence
• expression XPath: vraie si l’expression retourne un ensemble non vide de nœuds
• chercher un élément qui a un attribut:
• nom_element_XML [ @nom_attribut ]
• chercher un élément qui a un attribut avec une certaine valeur:
• nom_element_XML [ @nom_attribut = ’valeur’]
• Condition de position
• numéro (par ex. [1]): vrai si le nœud courant est à cette position dans le contexte
courant
• Expressions booléennes: and, or, not(), true(), false()
53
Les prédicats (2)
• Comparaisons
• valeurs générales: <=, <, >=, >, =, !=
• vrai si une paire de valeurs satisfait la comparaison (8 = 4+4, (1,2) = (2,4))
• $livre/auteur = "Kennedy" est vraie si $livre possède un ou plusieurs auteurs
et qu’au moins un est Kennedy
• valeurs atomiques: eq, ne, lt, le, gt, ge
• comparaison stricte des valeurs atomiques (8 eq 4+4)
• $livre/auteur eq "Kennedy" est vraie ssi $livre possède exactement un auteur
et qu’il s’agit de Kennedy
• nœuds: is, <<, >>
• l’opérateur is compare deux nœuds (s’agit-il du même nœud ?)
• les opérateurs << et >> comparent l’ordre des nœuds dans le document
• $livre/auteur is key('auteurs', 'kennedy') est vraie ssi $livre possède
exactement un auteur et que cet élément auteur est le même que celui
retourné par l’expression key
54
Fonctions XPath
55
Fonctions XPath (2)
• Fonctions booléennes
• boolean boolean(object): teste si l’objet vaut True
• boolean not(boolean): vraie si le paramètre est faux
• boolean true()
• boolean false()
• Fonctions numériques
• number floor(number): arrondi à l’entier inférieur
• number ceiling(number): arrondi à l’entier supérieur
• number number(object?): transforme un objet en nombre
• number sum(node-set): la somme de nombres trouvés dans un ensemble de
noeuds. Effectue une conversion de strings si nécessaire, comme number()
• number round(number): arrondit un nombre selon les conventions habituelles:
1.4 devient 1 et 1.7 devient 2
• Expressions: calculs arithmétiques
• on utilise: + - * div mod
57
Quelques chemins simples: éléments enfants,
parents, cousins
• Noeud racine:
/ retourne le premier noeud trouvé dans un arbre
• Elément enfant direct:
nom_element
• Elément enfant direct du noeud racine:
/nom_element_enfant
• Enfant d’un enfant:
nom_element_pere/nom_element_enfant
• Descendant arbitraire du noeud racine:
//nom_element_descendant
• Descendant arbitraire d’un noeud:
nom_element_ancetre//nom_element_descendant
• Un parent d’un noeud:
../
• Un cousin lointain d’un noeud:
../../nom_element_XML/nom_element_XML/nom_element_XML
58
Exercice
59
Exercice (2)
root
Kinds of Nodes
book
element
Text
chapter chapter
attribute
" ... " " ... " " ... " " ... " " ... " " ... " " ... " " ... "
fruit fruit figure figure
" ... " " ... " " ... " " ... "
figref figref caption data id caption data id
" ... " " ... " " ... " " ... " " ... " " ... " " ... " " ... "
60
Exercice (3)
61
Exercice (4)
62
Exercice (4)
62
Exercice (5)
• Sélectionner les captions des figures qui sont référencées par l’attribut figref des
éléments fruit dans le premier chapitre
id(//chapter[1]//fruit/@figref )[self::figure]/caption
• Sélectionner les chapitres dans lesquels le mot ’Strawberry’ est mentionné dans au
moins un paragraphe
//chapter[.//para[contains(.,’Strawberry’)]]
• Sélectionner les chapitres dans lesquels le mot ’Strawberry’ est mentionné dans
chaque paragrahe
//chapter[count(.//para) = count(.//para[contains(.,’Strawberry’)]) and .//para]
//chapter[not(.//para[not(contains(.,’Strawberry’))]) and .//para]
63
Exercice (5)
• Sélectionner les captions des figures qui sont référencées par l’attribut figref des
éléments fruit dans le premier chapitre
id(//chapter[1]//fruit/@figref )[self::figure]/caption
• Sélectionner les chapitres dans lesquels le mot ’Strawberry’ est mentionné dans au
moins un paragraphe
//chapter[.//para[contains(.,’Strawberry’)]]
• Sélectionner les chapitres dans lesquels le mot ’Strawberry’ est mentionné dans
chaque paragrahe
//chapter[count(.//para) = count(.//para[contains(.,’Strawberry’)]) and .//para]
//chapter[not(.//para[not(contains(.,’Strawberry’))]) and .//para]
63
Comparaison avec SQL
64
Comparaison avec SQL
64
XSLT
65
Fonctions d’un programme XSLT
66
Exemple
/
FILM
• Règles de transformation
<xsl:template match="FILM"> Sélecteur d’éléments à transformer
}
<p>
<h1> <i> <xsl:value-of select="TITRE"/> </i> </h1>
<i> <xsl:value-of select="ANNEE"/> </i> Instructions de
<p> <xsl:value-of select="AUTEUR"/> </p> transformation
<h3>Résumé: <xsl:value-of select="RESUME"/> </h3>
</p>
</xsl:template>
67
Fonctionnalités de XSLT
68
Fonctionnalités XSLT (2)
69
Les règles
70
Exemple
71
Exemple (2)
72
Exemple (2)
72
Appel des règles
73
Appel des règles
73
Règle CINEMA
74
Règle CINEMA
74
Règle CINEMA
<xsl:template match="SALLE">
<h2>Salle No <xsl:value-of select="@NO"/></h2>
Film:<xsl:value-of select="FILM/TITRE"/>
de <xsl:value-of select="FILM/AUTEUR"/>
<ol>
<xsl:for-each select="SEANCES/SEANCE">
<li><xsl:value-of select="."/></li>
</xsl:for-each>
</ol>
</xsl:template>
74
Vue d’ensemble
75
Programme XSLT
<?xml version="1.0"encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="[Link]
<xsl:template match="COURS">
<html>
<head><title>Fiche du cours</title></head>
<body bgcolor="white">
<p>
<h1><i><xsl:value-of select="SUJET"/></i></h1>
<hr/>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
76
Programme XSLT
76
Programme XSLT
76
Programme XSLT
76
Éléments de premier niveau
• xsl:import
• pour importer un programme XSLT (doit être avant include, les règles importées
sont prioritaires)
• xsl:include
• pour inclure un programme XSLT (les règles sont au même niveau)
• xsl:output
• pour définir le format de sortie
• xsl:param
• pour définir un paramètre
• xsl:variable
• pour définir une variable
• xsl:template
• pour définir une règle
77
Règles
• Définition
• une règle est définie par l’élement xsl:template
• deux possibilités
• l’attribut match est une expression XPath définissant les éléments sources de
la règle
<xsl:template match=”FILM”>
• l’attribut name donne un nom à la règle
<xsl:template name=”TDM”>
• Déclenchement
• pour le premier type de règle
<xsl:apply-templates select=”…”>
• pour le deuxième type de règle
<xsl:call-template name=”…”>
78
Sélection des règles
• Problème
• étant donné un nœud, comment trouver la règle qui s’applique ?
• Algorithme
• soit N le nœud
• soit P le motif (pattern) de la règle R
• s’il existe quelque part un nœud C tel que l’évaluation de P à partir de C contient
N, alors la règle s’applique
• Exemple: la règle pour la racine
• le nœud contexte N est la racine du document
• il existe une règle R dont le motif est “/”
• en prenant n’importe quel nœud, l’évaluation de “/” est N, donc la règle
s’applique
• Il est donc préférable (mais pas obligatoire) d’avoir une règle “/”
79
Sélection des règles (2)
80
Règles par défaut
• Lorsque aucune règle n’est sélectionnée, le moteur XSLT applique des règles par
défaut
• La première règle pour les éléments et la racine du document
<xsl:template match=”*|/”>
<xsl:apply-templates/>
</xsl:template>
• on demande l’application de règles pour les fils du nœud courant
• La deuxième règle insère dans le document résultat la valeur du nœud ou de
l’attribut
<xsl:template match=”text()|@*”>
<xsl:value-of select=”.”/>
</xsl:template>
• cela suppose (en particulier pour les attributs) d’avoir utilisé un xsl:apply-
templates qui ait sélectionné ces nœuds
• La troisième règle concerne les processing-instructions et les commentaires
81
Conséquence
82
xsl:apply-templates
83
Sélection d’une règle
• Comment gérer le fait que plusieurs règles sont elligibles pour un même nœud ?
• il existe des priorités implicites qui permettent au processeur de choisir
• on peut donner explicitement une priorité
• si malgré cela, le choix est impossible, le processeur s’arrête
• Exemple: on souhaite effacer certains nœuds
<?xml version="1.0" encoding="ISO-8859-1"?>
<FILM>
<TITRE>Vertigo</TITRE>
<ANNEE>1958</ANNEE><GENRE>Drame</GENRE>
<MES>Alfred Hitchcock</MES>
<RESUME>Scottie Ferguson, ancien inspecteur de police, est sujet au vertige…</RESUME>
</FILM>
<FILM>
<TITRE>Alien</TITRE>
<ANNEE>1979</ANNEE><GENRE>Science-fiction</GENRE>
<MES>Ridley Scott</MES>
<RESUME>Près d’un vaisseau spatial échoué sur une lointaine…</RESUME>
</FILM>
84
Programme XSLT
<!-- on ne recopie pas les nœuds RESUME dans le document résultat -->
<xsl:template match="RESUME"/>
<!-- on recopie les autres nœuds -->
<xsl:template match="@*|node()" priority="-1">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
85
Priorités implicites
86
Les modes
• Objectif
• un même nœud peut être traité plusieurs fois
• Exemple
• on parcourt tous les chapitres et paragraphes pour produire une table des
matières
• on les parcourt à nouveau pour publier le contenu
• Il faut donc des règles différentes qui s’appliquent aux mêmes nœuds: c’est le mode
qui va permettre la distinction
• Exemple: création de liens HTML
• on peut créer des ancres «internes» à un document
<a name=’Alien’/>
• on peut ensuite créer un lien vers cette ancre
<a href=’#Alien’>Lien vers le film Alien</A>
• objectif: une règle pour créer les liens, une autre pour créer les ancres
87
Règles avec mode
<xsl:template match="FILM">
<a name="{TITRE}"/>
<h1><xsl:value-of select="TITRE"/></h1>
<b><xsl:value-of select="TITRE"/>,</b>
<xsl:value-of select="GENRE"/> <br/>
<b>Réalisateur</b>: <xsl:value-of select="MES"/>
</xsl:template>
88
L’appel des règles
<xsl:template match="FILMS">
<html>
<head><title>Liste des films</title></head>
<body bgcolor="white">
<xsl:apply-templates select="FILM" mode="Ancres"/>
<xsl:apply-templates select="FILM"/>
</body>
</html>
</xsl:template>
89
Synthèse: sélection d’une règle
90
Éléments de programmation
91
Éléments de programmation (2)
• Itération: xsl:for-each
• Syntaxe
<xsl:for-each select="motif-XPath">
<!-- contenu -->
</xsl:for-each>
• Permet de parcourir un ensemble de nœuds et d’appliquer un traitement
93
Éléments de programmation (4)
• Tri: xsl:sort
• Syntaxe
<xsl:sort
select="motif-XPath" <!-- par défaut, . -->
data-type="text|number" <!-- par défaut, text -->
order="ascending|descending" <!-- par défaut, asc -->
case-order="upper-first|lower-first" <!-- par défaut, upper -->
lang="nom_de_langue" <!-- par défaut, langue système -->
/>
• Associé à un parcours (xsl:for-each ou xsl:apply-templates)
• Permet de modifier l’ordre des nœuds
94
Paramètres
95
Variables
96
Paramètres, variables: exemple
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="[Link] version="1.0">
<xsl:output method="text"/>
<!-- affichage du resultat -->
<xsl:template match="/factorielle">
<xsl:variable name="x" select="valeur"/>
<xsl:text>factorielle(</xsl:text><xsl:value-of select="$x"/><xsl:text>) = </xsl:text>
<xsl:call-template name="factorielle">
<xsl:with-param name="n" select="$x"/>
<?xml version="1.0" encoding="ISO-8859-1" ?>
</xsl:call-template>
<?xml-stylesheet type="text/xsl" href="[Link]"?>
</xsl:template>
<!-- fatorielle(n) - calcul de la factorielle -->
<factorielle>
<xsl:template name="factorielle">
<valeur>5</valeur>
<!-- on recupere le parametre, 1 valeur par defaut -->
<xsl:param name="n" select="1"/> </factorielle>
<!-- calcul -->
<xsl:variable name="somme">
<xsl:if test="$n = 1">1</xsl:if>
<xsl:if test="$n != 1">
<xsl:call-template name="factorielle">
<xsl:with-param name="n" select="$n - 1"/>
</xsl:call-template>
</xsl:if>
</xsl:variable>
<xsl:value-of select="$somme * $n"/>
</xsl:template>
</xsl:stylesheet> 97
Instructions diverses (non détaillées)
• xsl:copy
• xsl:copy-of
• xsl:number
• xsl:element
• xsl:attribute
• xsl:attribute-set
• xsl:comment
• xsl:processing-instruction
• xsl:key
• xsl:message
• xsl:for-each-group
• xsl:function
98
XSLT étend XPath
100
XQuery
• Principe
• XQuery est un langage de "programmation" puissant pour extraire des données
XML
• type de données: un seul "document" ou encore des collections sous forme de:
• fichiers
• bases de données XML
• XML "en mémoire" (arbres DOM)
• permet de faire des requêtes selon la structure ou encore les contenus en se
basant sur des expressions Xpath (version 2.0)
• peut générer des nouveaux documents (autrement dit: on peut manipuler un
résultat obtenu et y ajouter)
• ne définit pas les mises à jour (équivalent de update/insert de SQL), à venir…
• Résumé:
• XQuery permet d’extraire des fragments XML, d’y effectuer des recherches et de
générer des fragments XML
101
XQuery (2)
XQuery XSLT
XML
Schema
XPath 2.0
102
Séquences
103
Expressions XQuery
104
Exemple
<bib>
<book year="2000" title="Data on the Web">
<author><la>Abiteboul</la><fi>S.</fi></author>
<author><la>Buneman</la><fi>P.</fi></author>
<author><la>Suciu</la><fi>D.</fi></author>
<publisher>Morgan Kaufmann Publishers</publisher>
<price>39.95</price>
</book>
</bib>
105
Expressions de chemin
• Expression: document("[Link]")//author
• Résultat:
<author><la>Abiteboul</la><fi>S.</fi></author>,
<author><la>Buneman</la><fi>P.</fi></author>,
<author><la>Suciu</la><fi>D.</fi></author>
• Expression: doc(“[Link]”)/bib/book/author
• Résultat:
• Expression: doc(“[Link]”)/bib//book[1]/publisher
• Résultat:
106
Constructions de nœuds XML
• Le nom de l’élément est connu, le contenu est calculé par une expression
• Requête:
<auteurs>
{document("[Link]")//book[1]/author/la}
</auteurs>
• Résultat:
<?xml version="1.0"?>
<auteurs>
<la>Abiteboul</la>
<la>Buneman</la>
<la>Suciu</la>
</auteurs>
107
Constructions de nœuds XML (2)
108
Différence de séquences de nœuds
• Requête:
<livre>
Tous les sous-éléments sauf les auteurs: {document("[Link]")//book[1]/(* except
author)}
</livre>
• Résultat:
<livre>
Tous les sous-éléments sauf les auteurs:
<publisher>Morgan Kaufmann Publishers</publisher>
<price>39.95</price>
</livre>
109
Concaténation de séquences
• Requête:
<livre>
Le prix suivi des auteurs: {document("[Link]")//book[1]/(price,author)}
</livre>
• Résultat:
<livre>
Le prix suivi des auteurs:
<price>39.95</price>
<author><la>Abiteboul</la><fi>S.</fi></author>
<author><la>Buneman</la><fi>P.</fi></author>
<author><la>Suciu</la><fi>D.</fi></author>
</livre>
• Remarque: on a changé l’ordre des nœuds (union)
110
FLWR (prononcer flower)
• FLWOR = "For-Let-Where-Order-Return"
• rappelle l’idée du select-from-where de SQL
• Format d’une requête
• for $<var> in <forest> [, $<var> in <forest>]+
• itération sur une liste de collections xml
• let $<var> := <subtree>
• assignation du résultat d’une expression à une variable
• where <condition>
• élagage avec une sélection
• return <result>
• construction de l’expression à retourner
• Les forêts sont soit des collections, soit sélectionnées par des XPath
• Le résultat est une forêt: un ou plusieurs arbres
111
For, Let
• Exemple
for $b in document("[Link]")//book[1]
let $al := $b/author
return <livre nb_auteurs="{count($al)}"> {$al} </livre>
• Résultat
<livre nb_auteurs="3">
<author><la>Abiteboul</la><fi>S.</fi></author>
<author><la>Buneman</la><fi>P.</fi></author>
<author><la>Suciu</la><fi>D.</fi></author>
</livre>
112
Where
113
Order
114
Return
115
Exemple
116
Exemple
116
Jointure
117
Jointure
117
Agrégat
• Résultat
118
Agrégat
• Résultat
<result>
<entete>Nombretotal de restaurants</entete>
{let$R := collection(“Guide”)/Restaurant
return <NombreRestaurant>
{count ($R)}
</NombreRestaurant>}
</result>
118
XQuery et XSLT
119
XQuery et XSLT (2)
120
XQuery et XSLT (3)
121
XQuery et XSLT (4)
• Soit la requête suivante: liste des éditeurs qui ont publié plus de 100 livres
<big_publishers>
FOR $p IN distinct(document("[Link]")//publisher)
LET $b := document("[Link]")/book[publisher = $p]
WHERE count($b) > 100
RETURN $p
</big_publishers>
• Son équivalent XSLT
<big_publishers xsl:version="1.0" xmlns:xsl="[Link]
<xsl:for-each select="document('[Link]')//publisher[not(.=preceding::publisher)]">
<xsl:variable name="b" select="document('[Link]')/book[publisher=current()]"/>
<xsl:if test="count($b) > 100">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</big_publishers>
122
XQuery et XSLT (4)
• Soit la requête suivante: liste des éditeurs qui ont publié plus de 100 livres
<big_publishers>
FOR $p IN distinct(document("[Link]")//publisher)
LET $b := document("[Link]")/book[publisher = $p]
WHERE count($b) > 100
RETURN $p
</big_publishers>
• Son équivalent XSLT
<big_publishers xsl:version="1.0" xmlns:xsl="[Link]
<xsl:for-each select="document('[Link]')//publisher[not(.=preceding::publisher)]">
<xsl:variable name="b" select="document('[Link]')/book[publisher=current()]"/>
<xsl:if test="count($b) > 100">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</big_publishers>
122
XQuery et XSLT (4)
• Soit la requête suivante: liste des éditeurs qui ont publié plus de 100 livres
<big_publishers>
FOR $p IN distinct(document("[Link]")//publisher)
LET $b := document("[Link]")/book[publisher = $p]
WHERE count($b) > 100
RETURN $p
</big_publishers>
• Son équivalent XSLT
<big_publishers xsl:version="1.0" xmlns:xsl="[Link]
<xsl:for-each select="document('[Link]')//publisher[not(.=preceding::publisher)]">
<xsl:variable name="b" select="document('[Link]')/book[publisher=current()]"/>
<xsl:if test="count($b) > 100">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</big_publishers>
122
XQuery et XSLT (4)
• Soit la requête suivante: liste des éditeurs qui ont publié plus de 100 livres
<big_publishers>
FOR $p IN distinct(document("[Link]")//publisher)
LET $b := document("[Link]")/book[publisher = $p]
WHERE count($b) > 100
RETURN $p
</big_publishers>
• Son équivalent XSLT
<big_publishers xsl:version="1.0" xmlns:xsl="[Link]
<xsl:for-each select="document('[Link]')//publisher[not(.=preceding::publisher)]">
<xsl:variable name="b" select="document('[Link]')/book[publisher=current()]"/>
<xsl:if test="count($b) > 100">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</big_publishers>
122
XQuery et XSLT (4)
• Soit la requête suivante: liste des éditeurs qui ont publié plus de 100 livres
<big_publishers>
FOR $p IN distinct(document("[Link]")//publisher)
LET $b := document("[Link]")/book[publisher = $p]
WHERE count($b) > 100
RETURN $p
</big_publishers>
• Son équivalent XSLT
<big_publishers xsl:version="1.0" xmlns:xsl="[Link]
<xsl:for-each select="document('[Link]')//publisher[not(.=preceding::publisher)]">
<xsl:variable name="b" select="document('[Link]')/book[publisher=current()]"/>
<xsl:if test="count($b) > 100">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</big_publishers>
122
XQuery et XSLT (4)
• Soit la requête suivante: liste des éditeurs qui ont publié plus de 100 livres
<big_publishers>
FOR $p IN distinct(document("[Link]")//publisher)
LET $b := document("[Link]")/book[publisher = $p]
WHERE count($b) > 100
RETURN $p
</big_publishers>
• Son équivalent XSLT
<big_publishers xsl:version="1.0" xmlns:xsl="[Link]
<xsl:for-each select="document('[Link]')//publisher[not(.=preceding::publisher)]">
<xsl:variable name="b" select="document('[Link]')/book[publisher=current()]"/>
<xsl:if test="count($b) > 100">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</big_publishers>
122
Intégration avec l’existant
SGBD et XML
• Deux possiblités
• les systèmes natifs
• les extensions objet-relationnel
• Systèmes natifs
• technique spécialisée de stockage et recherche
• indexation des arbres XML
• gèrent seulement du XML
• langage de requêtes XQuery
• Extensions objet-relationnel
• de plus en plus intégré aux grands SGBD
• deux techniques:
• colonne «objet XML »
• mapping: 1 document N tables
• langage de requêtes hybride: SQL étendu avec fonctionnalités XQuery
124
SGBD natif
• SGBD natif
• conçu pour XML,
• stockant les documents entiers sans les décomposer en éléments,
• utilisant de techniques d'indexation d'arbres spécifiques
Stockage Recherche
XML XML
Noyau SGBD
Concurrence, Fiabilité
Forêts
Index
d’arbres
125
SGBD natif (2)
• Techniques
• stockage d’arbres
• index de structure (arbres)
• index de contenu (mots clés)
• algèbre XML
• optimisation XQuery
• passage à l’échelle
• gestion de versions
• Produits commerciaux
• Software A.G. Tamino, X-Hive/Db, XML Global, Coherity,…
• Produits open source
• Exist ([Link]
• XIndice ([Link]
• Berkeley DB XML ([Link] (racheté par Oracle en février
2006)
126
Extension du relationnel
Stockage Recherche
XML XML
SQL
SGBD
Tables Index
127
Extension du relationnel (2)
• Passage SQL/XML
• Intégration de fonctionnalités XQuery à SQL
• Support à la SQL3
• type de donnée natif XML Type (colonnes XML)
• fonctions d’extraction XPath
• fonctions de construction de XML (pont relationnel)
• insertion et mise à jour de XML en colonne(s)
• Exemple de requête
SELECT XMLElement("Emp", XMLForest( [Link], [Link] AS "department")) AS "result"
FROM EMPLOYEE e
WHERE ExtractValue([Link], /emp/@id) > 200;
• Intégré à Oracle et DB2
128
Extension du relationnel (3)
• Stockage et publication
• mapping de XML plat sur une table
• mapping de XML imbriqué en tables imbriquées
• stockage de XML en colonne (XML Type)
• commandes PutXml et GetXml
• Interrogation
• support de SQL/XML
• ServletXSQL
• document XML avec requêtes SQL/XML
• transformation du résultat des requêtes en XML
129
Comparaison
130