Manipulation de documents XML en XQuery
(XML, XML Schema, XDM, XQuery)
Jacques Le Maitre
Ce cours est mis à disposition selon les termes de la licence CreativeCommons
Paternité-Pas d'Utilisation Commerciale-Pas de Modification 2.0 France
XML
p SGML (1986)
n a été inventé par Charles Goldfarb
n son principe fondamental est la séparation totale entre la structure logique d’un document et sa mise en page
p HTML (1992)
n a été proposé par Tim Berners-Lee et Dan Connolly comme langage de description des pages du Web
n est basé sur SGML mais contrairement à celui-ci décrit la présentation d’une page web et non sa structure logique
p XML (1998)
n a été proposé par un groupe de travail du W3C
n “Its goal is to enable generic SGML to be served, received, and processed on the web in the way that is now possible with HTML.”
(introduction à la recommandation du 18 février 1998)
n comme SGML c’est un langage de balisage extensible, mais plus simple
p Un document XML est découpé en éléments structurés hiérarchiquement.
p Un document a un élément racine appelé élément du document.
p Un élément est composé :
n d’un nom ;
n d’attributs ;
n d’un contenu formé d’éléments ou de textes.
p Un texte est une chaîne de caractères.
p Un attribut a un nom et une valeur qui est une chaîne de caractères.
p Syntaxiquement, les éléments d’un document XML sont marqués dans le document lui-même par des paires de balises ouvrantes et fermantes.
p Dans le contenu d’un élément, les caractères < et & servent de délimiteurs :
n de début d’élément, d’instruction de traitement ou de commentaires (<) ;
n de début d’appel d’entité (&).
p Lorsque le texte à placer dans le contenu d’un élément contient l’un de ces deux caractères, il est nécessaire de marquer ces caractères pour ne pas les confondre avec ces délimiteurs.
p Deux solutions sont possibles :
n insérer le fragment de texte contenant ces caractères dans une section CDATA ;
n remplacer ces caractères par les appels d’entités < et &.
p Un guide est composé d’un titre, d’un ou plusieurs auteurs, d’un éditeur, d’une année et d’un ou plusieurs vallons.
p Un titre, un auteur, un éditeur et une année sont des textes.
p Un vallon est composé d’un nom, d’une introduction et des itinéraires que l’on peut y réaliser (un ou plusieurs itinéraires).
p Un nom est un texte.
p Une introduction est composée d’un ou plusieurs paragraphes.
p Un paragraphe est un texte dans lequel sont insérés des renvois vers d’autres itinéraires et des notes.
p Une note est un texte donnant des consignes de prudence ou recommandant l’utilisation d’un matériel spécifique (crampons, piolet...)
p Un élément est défini par la déclaration :
n <!ELEMENT nommodèle de contenu>
p Un élément mixte pouvant contenir dans un ordre quelconque des éléments n1, …, nk a pour modèle de contenu :
n (#PCDATA | n1 | … | nk)*
p Un élément composé d’une suite d’éléments n1, …, nk a pour modèle de contenu l’expression régulière construite sur le vocabulaire {n1, …, nk} à l’aide des opérateurs :
n , (infixe) : concaténation
n * + (suffixes) : 0 ou plusieurs répétitions et 1 ou plusieurs répétitions
n ? (suffixe) : optionalité
p Un élément vide a pour modèle de contenu EMPTY.
p Un élément de contenu quelconque a pour modèle de contenu ANY.
p A chaque type d’élément est attaché un ensemble d’attributs.
p Une définition d’attributs a la forme suivante :
n <!ATTLIST nom-élément
nom-attributtypedéclaration-de-défaut
…
nom-attributtypedéclaration-de-défaut >
où :
n le type est celui des valeurs de l’attribut ;
n la déclaration de défaut spécifie si la valeur de l’attribut doit être ou non présente dans le document et fournit éventuellement une valeur par défaut.
p Les noms d’attributs sont locaux à chaque type d’élément :
Ø deux éléments de types différents peuvent avoir des attributs de même nom.
n < référence au caractère <
n > référence au caractère >
n & référence au caractère &
n ' référence au caractère '
n " référence au caractère " p Par exemple, la phrase :
n « L’expression <alt>2794</alt> est un élément XML. » peut être représentée par l’élément suivant :
n <phrase>L'expression <alt>2794</alt> est un élément XML.</phrase>
p Un document XML valide est composé d’une entité document (sans nom) et d’un ensemble d’entités externes.
p L’entité document est composé d’un prologue et de l’élément du document.
p Le prologue est composé d’une déclaration XML et d’une DTD.
p La déclaration XML indique : la version de XML, le jeu de caractères et l’éclatement ou non du document en plusieurs entités externes.
p La DTD est constituée d’une partie interne placée dans l’entité document et d’une partie externe, enregistrée dans un fichier à part dont le nom est déclaré dans l’entité document.
p La partie interne de la DTD, l’élément du document et les entités externes peuvent appeler des entités externes. Ces appels doivent être non récursifs et non circulaires.
p La norme ISO 10646 en accord avec l’Unicode définit un jeu de caractères universel : l’UCS (Universal Character Set) qui permet de représenter les caractères de toutes les langues actuelles mais aussi des langues anciennes, graphiques...
p Chaque caractère UCS est identifié par un code qui est un nombre représenté sur 4 octets (232 - 1 positions).
p Les 65 536 premières positions de l’UCS (c.-à-d. les deux octets de poids faible) forment le BMP (« Basic Multilingual Plane ») et codent les jeux de caractères les plus courants (latin, grec, arabe...). D’où deux codages :
n UCS-4 : totalité de l’UCS ; n UCS-2 : BMP.
Espaces de noms
p La déclaration d’un espace de noms muni d’un préfixe est visible dans l’élément la contenant (son nom et ses attributs y compris) et dans tous ses descendants excepté ceux pour lesquels un nouvel espace de noms de même préfixe est déclaré.
p La déclaration d’un espace de noms par défaut est visible dans l’élément la contenant (son nom et ses attributs y compris) et dans tous ses descendants excepté ceux pour lesquels cette déclaration est annihilée ou ceux pour lesquels un nouvel espace de noms par défaut est déclaré.
p Tout nom d’élément ou tout nom d’attribut qui n’est pas une déclaration d’espace de noms est un nom qualifié ayant l’une des deux formes suivantes :
n préfixe:nom-local n nom-local
p Un nom qualifié préfixé appartient à l’espace de noms associé à ce préfixe déclaré dans le plus imbriqué des éléments contenant ce nom.
p Un nom qualifié non préfixé :
n appartient à l’espace de noms par défaut associé à ce préfixe déclaré dans le plus imbriqué des éléments contenant ce nom, s’il en existe un ;
p Le préfixe xml est lié à l’espace de noms Il peut mais ne doit pas être déclaré et ne doit pas être lié à un autre espace de noms. Il ne doit pas y avoir d’autres préfixes liés à cet espace de noms et il ne doit pas être déclaré comme espace de noms par défaut.
p Le préfixe xmlns est lié à l’espace de noms Il ne doit pas être déclaré. Il ne doit pas y avoir d’autres préfixes liés à cet espace de noms et il ne doit pas être déclaré comme espace de noms par défaut. Les noms d’éléments ne doivent pas avoir le préfixe xmlns.
p Tous les préfixes commençant par les lettres x, m et l sont réservés.
p Chaque langage de définition ou de manipulation de données XML possède son propre espace de noms ainsi que son propre préfixe par défaut qu’il est recommandé d’utiliser pour des raisons de lisibilité.
XML Schema
p XML Schema est un langage qui permet de définir des classes de documents XML de façon beaucoup plus fine qu’une DTD.
p Un schéma XML Schema est un document XML dont les éléments définissent des types ou déclarent des éléments ou des attributs.
p Le langage XML Schema est relativement complexe comme en témoigne le volume des deux recommandations qui lui sont consacrées :
Ø nous n’en ferons donc qu’une présentation simplifiée et au travers d’exemples.
p L’espace de noms associé à XML Schema est :
n dont le préfixe usuel est xsd.
string | boolean | decimal | float | duration | dateTime | |
length | x | x | x | |||
minLength | x | |||||
maxLength | x | |||||
pattern | x | x | x | x | x | x |
enumeration | x | x | x | x | x | |
whiteSpace | x | x | x | x | x | x |
minInclusive | x | x | x | x | ||
minExclusive | x | x | x | |||
maxInclusive | x | x | x | x | ||
maxExclusives | x | x | x | x | ||
totalDigits | x | |||||
fractionDigits | x |
string | Ensemble des séquences de caractères de longueur finie | |
boolean | Ensemble de valeurs = {vrai, faux, 1, 0} | |
float | Ensemble de valeurs = m ? 2e où |m| ? 224 et -149 ? e ? 104 + zéro positif et négatif infinité positive et négative pas un nombre | -1E4 1267.43233E12 12.78e-2 12 0 -0 INF –INF NaN |
decimal | Nombre décimaux de précision arbitraire. Ensemble de valeurs = i ? 10n où i et n sont des entiers et n ? 0 | -1.23 12678967.543233 +100000.00 210 |
p Rappelons qu’un schéma est un document XML.
p Un élément ou un attribut est déclaré sous la forme d’un élément du schéma.
p Un élément ou un attribut peut être déclaré :
n soit au niveau global comme enfant de l’élément du schéma ; n soit au niveau local dans le contenu de son élément parent.
p Un type d’élément définit comment sont composés les éléments de ce type : leurs attributs et leur contenu.
p Un type d’attribut définit l’ensemble des valeurs possibles pour les attributs de ce type.
XDM
p Le nœud document peut avoir des nœuds fils qui peuvent être des nœuds commentaire, élément, instruction de traitement ou texte.
p Un nœud élément peut avoir des nœuds fils qui peuvent être des nœuds attribut, commentaire, élément, espace de noms, instruction de traitement ou texte.
p Les nœuds fils d’un nœud document ou élément qui sont des nœuds élément, texte, commentaire ou instruction de traitement sont appelés les enfants de ce nœud.
p Un nœud ne doit pas avoir des enfants qui sont des nœuds texte dont le contenu est vide.
p Ordre des nœuds d’un même arbre :
n Le nœud racine est le premier nœud.
n Chaque nœud apparaît avant tous ses descendants.
n Tous les nœuds espace de noms fils d’un nœud élément e doivent suivre immédiatement e.
n Tous les nœuds attribut fils d’un élément e, doivent suivre immédiatement :
p tous les nœuds espace de noms fils de e, s’il en existe ; p e, sinon.
n L’ordre des nœuds attribut fils d’un nœud élément est indifférent.
n Les descendants d’un nœud apparaissent avant ses noeuds frères suivants.
p Ordre des nœuds d’arbres différents :
n Si un nœud d’un arbre A1 apparaît avant un nœud d’un arbre A2, alors tous les nœuds de A1 doivent apparaître avant tous les nœuds de A2.
XQuery
données XML
p Une caractéristique importante du langage XQuery est sa grande souplesse vis-à-vis du typage des données qu’il manipule :
n Les documents XML interrogés peuvent être ou non conformes à un schéma XML Schema.
n Lorsque les opérandes d’un opérateur ou les arguments d’une fonction ne sont pas conformes aux types attendus, un mécanisme de conversion automatique est déclenché afin d’essayer d’obtenir cette conformité.
n Le type attribué à la valeur d’une expression lors de son analyse, son type statique, peut être affiné à l’issue de l’évaluation de cette expression, c.-à-d. lorsque cette valeur est effectivement connue : ce type affiné est le type dynamique de cette valeur.
p Les données XML manipulés par XQuery doivent être conformes au modèle XDM :
Ø cette modélisation n’est pas du ressort de XQuery.
p Si cette instance provient d’un document XML qui a été validé conformément à un schéma XML Shema, cette annotation est celle qui lui a été attribuée lors de cette validation.
p Sinon:
n Un nœud attribut ou un nœud texte qui n’a pas été validé est annoté par xs:untypedAtomic.
n Un nœud élément qui n’a pas été validé est annoté par xs:untyped. Ceux de ses descendants qui sont des nœuds élément sont annotés par xs:untyped et ceux qui sont des nœuds texte sont annotés par xs:untypedAtomic.
n Un nœud élément qui a n’été que partiellement validé est annoté par xs:anyType. Ceux de ses descendants qui ont été validés sont annotés par un type plus spécifique.
p Le contexte statique est constitué des informations disponibles lors de l’analyse d’une expression :
n espaces de noms et espace de nom par défaut ;
n définition de types, déclarations d’éléments et d’attributs,
n nom et type des variables ;
n signature des fonctions ;
n collations (une collation spécifie comment deux chaînes de caractères doivent être comparés) et collation par défaut ;
n mode de construction (preserve ou strip) d’un nœud ;
n mode d’ordonnancement (ordered ou unordered) des séquences de nœuds retournées par certains opérateurs ;
n mode de traitement (preserve ou strip) des espaces frontières dans un constructeur direct de nœud élément ; …
p A l’issue de l’analyse (lexicale, syntaxique et sémantique) d’une expression, un type statique est attribué à cette expression.
p La valeur d’une expression est conforme à son type statique.
p A l’issue de l’évaluation d’une expression, un type dynamique est attribué à la valeur de cette expression. Ce type dynamique peut être plus spécifique que le type statique de l’expression (mais pas moins).
p xs:date spécifie un item de type prédéfini xs:date
p attribute()? spécifie une séquence de 0 ou 1 attribut
p element() spécifie un nœud élément quelconque
p element(titre, xs:string) spécifie un nœud élément de nom titre et de type xs:string
p element(description, *) spécifie un nœud élément de nom description et de type quelconque
p element(*, xs:string) spécifie un nœud élément de nom quelconque et de type xs:string
p node()* spécifie une séquence de longueur quelconque de nœuds de type quelconque
p item()+ spécifie une séquence d’au moins un item
p Une bibliothèque de fonctions prédéfinies est associée aux langages XPath 2.0 et XQuery 1.0.
p Ces fonctions effectuent toutes les opérations classiques sur les nombres, les chaînes de caractères, les dates, les séquences...
p Elles sont définies dans le document :
n XQuery 1.0 and XPath 2.0 Functions and Operators disponible à l’URL
p L’espace de noms associé à ces fonctions est
p Il est pré-déclaré et a pour préfixe fn.
p Par exemple, la fonction fn:empty appliquée à une séquence retourne vrai si cette séquence est vide et faux sinon.
Expressions
p Littéraux chaînes de caractères
n Ils s’écrivent entre guillemets simples ou entre guillemets doubles :
p "Vallon des Muandes" 'Vallon des Muandes'
n La valeur d’un littéral chaîne de caractères est de type xs:string.
p Littéraux numériques
n Ils s’écrivent classiquement :
p 2005 3.14 1.602e-19 1.602E-19
n La valeur d’un littéral numérique sans . et sans e ou E est de type xs:integer.
n La valeur d’un littéral numérique avec . et sans e ou E est de type xs:decimal.
n La valeur d’un littéral numérique avec . et avec e ou E est de type xs:double.
p Les arguments effectifs sont évalués dans un ordre qui dépend de l’implantation.
p Les règles de conversion d’une valeur d’argument ou d’unevaleur de retour sont appliquées.
p Si la fonction est prédéfinie, l’appel est évalué. La valeur retournée a le type de retour déclaré pour la fonction.
p Si la fonction est définie par l’utilisateur, le corps de la fonction est évalué. La valeur retournée par cette évaluation est convertie dans le type de retour déclaré pour la fonction en appliquant les règles de conversiond’une valeur d’argument ou d’une valeur de retour.
p Si le type attendu est une séquence d’un type atomique ta :
n la valeur à convertir est atomisée produisant une séquence S de valeurs atomiques ;
n chaque valeur de S qui est de type untypedAtomic :
p est convertie en xs:double si la fonction appelée est prédéfinie et si ta est un type numérique,
p est convertie en ta sinon ;
n si ta = xs:double, chaque valeur de S qui est de type xs:decimal ou xs:float est convertie en xs:double ;
n si ta = xs:float, chaque valeur de S qui est de type xs:decimal est convertie en xs:float ;
n si ta est xs:string, chaque valeur de S qui est de type xs:anyURI est convertie en xs:string.
p Si la valeur résultante n’est pas conforme au type attendu une erreur est signalée.
p La fonction fn:doc traduit le document XML dont l’URI lui est fournie en argument en une instance XDM et retourne le nœud racine de cette instance.
p Par exemple :
n fn:doc("clarée.xml") retourne le nœud racine de l’arbre du document Itinéraires skieurs dans la Vallée de la Clarée si celui-ci est enregistré dans le fichier clarée.xml du répertoire courant.
p La fonction fn:collection retourne la séquence de nœuds contenue dans la ressource dont l’URI lui est fournie en argument.
p La valeur d’une expression exp1/exp2 est la séquence construite de la façon suivante :
n S := valeur(exp1)
n Si S n’est pas une séquence de nœuds, une erreur est signalée.
n L’expression exp2 est évaluée dans le focus pour chaque nœud n de la séquence S produisant des séquences qui doivent être homogènes (c.-à-d. ne contenir que des nœuds ou que des valeurs atomiques).
n Les séquences ainsi obtenues sont combinées en une séquence unique de la façon suivante :
p si elles sont toutes des séquences de nœuds, elles sont concaténées, puis les doublons sont éliminés et les nœuds restants sont triés selon l’ordre du document ;
p si elles sont toutes des séquences de valeurs atomiques elles sont concaténées.
p Le filtrage d’une séquence S par un prédicat [exp] produit la séquence S’ construite de la façon suivante :
n S’ := séquence vide
n Pour chaque item i de S :
p Soit v la valeur de l’expression exp dans le focus.
p La valeur de vérité du prédicat [exp] est calculée de la façon suivante :
§ si v est une valeur numérique, alors elle vraie si v est égale (par application de l’opérateur de comparaison de valeur eq) à la position contexte, sinon elle fausse ;
§ si v n’est pas une valeur numérique, la valeur de vérité du prédicat est égale à la valeur booléenne effective de v.
p Si la valeur de vérité du prédicat est vraie alors S’ := S’, i.
p La valeur d’une expression exp1[exp2] est la séquence résultant du filtrage de la séquence valeur(exp1) par le prédicat [exp2].
p On distingue 12 axes :
n self, child, descendant, descendant-or-self, parent, ancestor, ancestor-or-self,
following-sibling, preceding-sibling, following, preceding, attribute.
p Un axe a un sens : avant ou arrière.
n Un axe dont les nœuds sont soit le nœud contexte, soit des nœuds qui suivent le nœud contexte dans l’ordre du document est un axe avant.
n Un axe dont les nœuds sont soit le nœud contexte, soit des nœuds qui précèdent le nœud contexte dans l’ordre du document est un axe arrière.
p Un axe a une sorte de nœud principal.
p Un test de nœud sélectionne parmi les nœuds de l’axe, ceux dont le nom ou la sorte vérifie une certaine condition.
p Les principales formes de tests de nœud sont les suivantes :
n n où n est un nom : sélectionne les nœuds de l’axe de même sorte que la sorte principale de l’axe et de nom n ;
n * : sélectionne tout nœud de l’axe de même sorte que la sorte principale de l’axe ;
n node() : sélectionne tout nœud de l’axe ;
n attribute() : sélectionne tout nœud attribut de l’axe ;
n attribute(n) : sélectionne tout nœud attribut de nom n de l’axe ;
n attribute(n, t) : sélectionne tout nœud attribut de nom n et de type t de l’axe ;
n document() : sélectionne tout nœud document de l’axe ;
n element() : sélectionne tout nœud élément de l’axe ;
n element(n) : sélectionne tout nœud élément de nom n de l’axe ;
n element(n, t) : sélectionne tout nœud élément de nom n et de type t de l’axe;
n processing-instruction() : sélectionne tout nœud instruction de traitement de l’axe ;
n text() : sélectionne tout nœud texte de l’axe ; …
(de nom n signifie de nom développé égal au nom développé de n)
p Nom du 2e itinéraire ** du Vallon des Muandes ?
n fn:doc(clarée.xml)
/itinéraire[cotation = "**"][2] /nom/text()
Cet exemple montre l’intérêt des prédicats successifs lors de l’extraction d’un nœud par rapport à sa position de proximité. Ici on cherche le 2e des itinéraires **.
p Noms des itinéraires du vallon des Muandes décrits après celui de la Pointe de Névache ?
n fn:doc(clarée.xml)
//vallon[nom = "Vallon des Muandes"]
/itinéraire[nom = "Pointe de Névache"]
/following-sibling::itinéraire
p Les opérateurs arithmétiques sont des opérateurs polymorphes. L’opération effectivement réalisée (sur les entiers ou sur les flottants) dépend du type des opérandes p Chaque opérande est traité de la façon suivante :
n Il est évalué puis atomisé.
n Si la valeur produite est une valeur de type xs:unTypedAtomic, elle est convertie en xs:double.
p Si l’un des deux opérandes est une séquence vide, une séquence vide est retournée.
p Si les types des opérandes sont une combinaison valide pour l’opérateur considéré alors la valeur de l’opération est retournée.
p Sinon, une erreur est signalée.
p Comme les opérateurs arithmétiques, les opérateurs de comparaison de valeurs sont des opérateurs polymorphes.
p Chaque opérande est traité de la façon suivante :
n Il est évalué puis atomisé.
n Si la valeur produite est une valeur de type xs:unTypedAtomic, elle est convertie en xs:string.
p Si l’un des opérandes est une séquence vide, une séquence vide est retournée.
p Les opérandes sont convertis, si c’est possible, en leur plus petit type commun et si les types des opérandes sont une combinaison valide pour l’opérateur considéré alors la valeur de l’opération est retournée.
p Sinon, une erreur est signalée.
p La comparaison retourne vrai, si et seulement si il existe a1 ? S1, a2 ? S2 pour lesquelles l’application des règles suivantes retourne vrai :
n Si l’une des valeurs atomiques ai est de type xs:untypedAtomic et l’autre aj est de type numérique alors ai est convertie en xs:double.
n Si l’une des valeurs atomiques ai est de type xs:untypedAtomic et l’autre aj est de type xs:untypedAtomic ou xs:string, alors ai est convertie en xs:string et aj l’est aussi si elle est de type xs:untypedAtomic.
n Si l’une des valeurs atomiques ai est de type xs:untypedAtomic et l’autre aj n’est ni de type xs:untypedAtomic, ni de type xs:string, ni d’un type numérique, alors ai est convertie dans le type dynamique de aj.
n Les valeurs a1 et a2 sont comparées en appliquant l’un des opérateurs eq, ne, lt, le, gt ou ge selon que l’opérateur de comparaison générale est respectivement =, !=, <, <=, > ou >=.
p Sinon, elle retourne faux ou bien signale une erreur.
exp1 is exp2exp1 << exp2exp1 >> exp2
p Les deux opérandes doivent avoir pour valeur soit une séquence vide, soit un nœud, sinon une erreur est signalée.
p Si l’un des opérandes a pour valeur une séquence vide, la valeur de la comparaison est la séquence vide.
p Si la valeur de exp1 est le nœud n1 et la valeur de exp2 est le nœud n2 :
n exp1 is exp2 ? vrai, si les nœuds n1 et n2 sont les mêmes, faux sinon
n exp1 << exp2 ? vrai, si le nœud n1 précède le nœud n2 dans l’ordre du document, faux sinon
n exp1 >> exp2 ? vrai, si le nœud n1 suit le nœud n2 dans l’ordre du document, faux sinon
p Un constructeur de nœud produit un nouveau nœud qui n’a pas de nœud parent.
p Il existe des constructeurs pour chaque sorte de nœud.
p On distingue :
n les constructeurs directs ;
p Un constructeur direct permet d’exprimer un nœud élément à construire selon une syntaxe calquée sur celle de l’élément correspondant écrit en XML.
p Un constructeur calculé permet de calculer tous les composants du nœud à construire : notamment son nom et les noms de ses attributs dans le cas d’un constructeur calculé de nœud élément.
<n0n1="v1" … nk="vk">c</n>
p n0, n1, ..., nk sont des noms qualifiés.
p n1="v1" … nk="vk" sont soit des déclarations d’espace de noms soit des attributs.
p v1, …, vk peuvent contenir des caractères, des appels d’entités (prédéfinies ou caractères) ou bien des expressions XQuery placées entre accolades, appelées expressions incluses.
p c est le contenu du constructeur qui peut contenir des caractères, des appels d’entités (prédéfinies ou caractères), des constructeurs directs d’élément et des expressions incluses.
p Le nœud construit est un nouveau nœud élément dont :
n le nom est obtenu en développant le nom qualifié n0 à partir des espaces de noms déclarés dans l’environnement statique ou dans les nœuds de l’élément en cours de construction ;
n les nœuds attributs sont ceux produits par l’évaluation des attributs de la balise ouvrante du constructeur et ceux produits par l’évaluation du contenu ;
n les enfants sont les nœuds éléments ou texte produits par l’évaluation du contenu ;
n le type est xs:untyped si le mode de construction est strip, xs:anyType si ce mode est preserve.
p Chaque attribut n = "v"de la balise ouvrante d’un constructeur direct d’élément produit un nouveau nœud attribut dont :
n Le nom est obtenu en développant le nom qualifién à partir des espaces de noms déclarés dans l’environnement statique ou dans l’élément en cours de construction.
p Les appels d’entités sont remplacés par l’entité désignée.
p Chaque suite consécutive de caractères est remplacée par une chaîne de caractères formée par cette suite de caractères.
p Chaque expression incluse est convertie en une chaîne de caractères de la façon suivante :
§ l’atomisation est appliquée produisant une séquence de valeurs atomiques S ;
§ chaque valeur atomique de S est convertie en une chaîne de caractères ; § les chaînes ainsi produites sont concaténées en une chaîne unique.
p Les chaînes de caractères ainsi produites sont concaténées en une chaîne unique qui constitue la valeur de l’attribut.
n Le type est untypedAtomic.
p Le contenu c est évalué en une séquence de nœuds produite de la façon suivante :
n Si le mode de traitement des espaces frontières est strip, les caractères blancs qui les composent sont supprimés.
n Les appels d’entités sont remplacés par l’entité désignée.
n Chaque suite consécutive de caractères est remplacée par un nouveau nœud texte dont le contenu est la chaîne de caractères formée par cette suite de caractères.
n Chaque constructeur direct de nœud est évalué produisant un nouveau nœud.
n Chaque expression incluse est évaluée produisant une séquence qui est traitée de la façon suivante :
p chaque valeur atomique est convertie en une chaîne de caractères ;
p chaque suite consécutive de chaînes de caractères est remplacée par un nouveau nœud texte dont le contenu est la concaténation de ces chaînes de caractères séparées par un espace ;
p chaque nœud est remplacé par un nouveau nœud qui est sa copie profonde.
element n {expc} element {expnom} {expc}
p n est un nom qualifié.
p Le nœud construit est un nouveau nœud élément dont :
n Le nom est obtenu :
p soit en évaluant l’expression expnom, en l’atomisant, puis en la convertissant si possible en un nom qualifié qui est ensuite développé.
n La séquence des nœuds fils est produite en traitant l’expression expc de la même façon qu’une expression incluse dans le contenu d’un constructeur direct d’élément.
n Le type est xs:untyped si le mode de construction est strip, xs:anyType si ce mode est preserve.
attribute n {expv}
attribute {expnom} {expv}
p n est un nom qualifié.
p Le nœud construit est un nouveau nœud attribut dont :
n Le nom est obtenu :
p soit en développant le nom qualifié n à partir des espaces de noms déclarés dans l’environnement statique ou dans l’élément en cours de construction ;
p soit en évaluant l’expression expnom, en l’atomisant, puis en la convertissant si possible en un nom qualifié qui est ensuite résolu.
n La valeur de l’attribut est produite en traitant l’expression expv de la même façon qu’une expression incluse dans la valeur d’un attribut d’un constructeur direct d’élément.
n Le type est untypedAtomic.
let $v1 as t1 := exp1,..., $vn as tn := expn
?
let $v1 as t1 := exp1
...
let $vn as tn := expn
p v1, ..., vn sont des noms de variables.
p t1, ..., tn sont des types de séquence.
p La clause as est facultative.
p La valeur liée à une variable vi doit être conforme au type ti, si la clause as est présente.
Exemple d’expression FLWOR complexe :
p Il s’agit d’extraire la séquence des cols de la vallée de la Clarée, avec pour chacun :
n son nom ;
n son altitude ;
n le nombre d’itinéraires permettant de l’atteindre ; n la liste de ces itinéraires, avec pour chacun :
p le nom du vallon de départ,
p la difficulté ; triée par difficulté croissante ;
triée par ordre alphabétique de nom.
p On suppose qu’un itinéraire aboutit à un col si son nom commence par « Col ». Pour le tester, on utilisera la fonction fn:starts-with.
p On utilise la fonction prédéfinie fn:distinct-values qui appliquée à une séquence de valeurs atomiques retourne la séquence de ces valeurs dans le même ordre, mais sans doublons.
typeswitch (exp) case ($var1 as)? t1 return exp1
…
case ($varn as)? tn return expn
default ($vard)?return expd
p Cette expression permet de réaliser un calcul sur une valeur, en fonction de son type dynamique.
p La valeur retournée est celle calculée de la façon suivante :
n L’expression exp est évaluée produisant une valeur v.
n On recherche le premier type ti pour i variant de 1 à n tel que le type dynamique de la valeur v est de type ti.
n S’il existe alors :
p on lie la valeur v à la variable vari et on retourne la valeur de l’expression expi. sinon :
p on lie la valeur v à la variable vard et on retourne la valeur de l’expression expd.
Exemple d’expression de choix :
p Dans la description du document clarée.xml, nous avons annoté :
n les références à un autre itinéraire du même vallon, par un élément <renvoi cible="Ii.j"/> où Ii.j est l’identificateur de cet itinéraire, avec i n° du vallon et j n° de l’itinéraire dans le vallon.
n les conseils de prudence ou d’utilisation d’un matériel spécifique par un élément note muni d’un attribut type de valeur prudence ou matériel, encadrant ce conseil.
p Par exemple, le paragraphe :
a été décrit de la façon suivante en XML :
n <para>Du col de Névache (<renvoi cible="I15.1"/>), suivre la ligne de crête qui mène à la pointe de Névache. <note type="prudence">Attention : corniches possibles.</note><note type="matériel"> Crampons utiles au printemps.</note></para>
p Il s’agit de retrouver le texte initial de ce paragraphe.
Modules
p Les noms d’éléments ou de types non préfixés appartiennent :
n à l’espace de noms d’éléments ou de types par défaut si celuici est déclaré et n’est caché par une déclaration d’espace de noms par défaut dans un constructeur direct d’élément.
n à aucun espace de noms, sinon.
p Les noms de fonctions non préfixés appartiennent à l’espace de noms de fonctions par défaut si celui-ci est déclaré, sinon ils appartiennent à l’espace de noms de préfixe fn et sont donc considérés comme étant des noms de fonctions prédéfinies.
p Afin de pouvoir définir des fonctions dans un module principal sans créer un nouvel espace de noms, l’espace de noms de préfixe local est prédéfini par XQuery :
Ø il est recommandé de l’utiliser.
declare function f($n1 as t1, …, $nk as tk) as t{exp}
p f est le nom de la fonction : un nom qualifié.
p n1, …, nk sont les noms des arguments formels : des noms qualifiés. Une fonction peut ne pas avoir d’arguments.
p t1, …, tk et t sont des types de séquence, respectivement, les types des arguments et celui de la valeur retournée par l’appel de la fonction.
p exp est une expression : le corps de la fonction,
p Si le type d’un argument ou celui de la valeur retournée n’est pas déclaré, il est considéré comme étant par défaut item()*.
p Il s’agit de déclarer une fonction qui retourne les vallons adjacents à un vallon donné v.
p On suppose que deux vallons v1 et v2 (v1 ? v2) sont adjacents s’il existe dans v1 un itinéraire de même nom que celui d’un itinéraire de v2.
p On notera que ce critère suppose que les noms des itinéraires sont les noms des points géographiques (col ou sommet) atteints. C’est le cas pour les itinéraires du guide des itinéraires skieurs de la Vallée de la Clarée, excepté ceux qui sont des circuits.
p Ce critère est évidemment très approximatif car deux vallons qui ont une portion de crête commune peuvent ne pas apparaître dans la réponse car :
n il peut ne pas exister dans v1 ou v2 d’itinéraires qui atteignent un point de cette crête ;
n il peut ne pas exister dans v1 un itinéraire qui atteint un point de cette crête atteint par un itinéraire de v2 ou inversement.