Une introduction en douceur à XPath

MobileTogether utilise XPath en tant que son langage de formule et d'expression.

Si vous maîtrisez l'écriture de formules dans une feuille de calcul Excel, vous apprendrez rapidement à écrire des formules XPath ou des expressions dans MobileTogether. Vous n'aurez qu'à apprendre quelques concepts de base. L'éditeur XPath dans MobileTogether permet une construction d'expressions XPath très simple, de même que l'éditeur de formules dans Excel vous aide à écrire des formules dans vos feuilles de calcul.

Que signifie le terme XPath ?

Le « X » dans XPath provient de ses racines XML, le langage eXtensible Markup Language. Le terme « Path » (chemin) fait référence au format utilisé qui ressemble à un chemin afin d'identifier les parties individuelles de vos données. Toutes les sources de données auxquelles vous accédez dans MobileTogether sont rassemblées sous la forme de petites structures arborescentes affichées sur le côté droit de votre fenêtre MobileTogether Designer sous « Page Sources ». Chaque structure arborescente commence avec une racine portant un nom comme $XML1 ou $DB1, puis viennent s'ajouter en-dessous de cette racine des pièces de données individuelles, appelées événements. Ces éléments sont imbriqués de manière logique. Ils peuvent être représentés sous la forme d'arbres dans lesquels vous pouvez réduire et développer chaque élément pour voir ce qui se trouve en-dessous. L'avantage de MobileTogether est que cela n'a aucune importance si les données sous-jacentes proviennent d'une base de données, d'un document XML, d'un service web ou d'une autre source de données, elles sont toutes présentées de manière identique et peuvent être accédées de la même manière.

Ce que XPath vous permet de faire est de parcourir ces structures arborescentes pour associer vos éléments de données avec des objets d'interface utilisateur sur les écrans de vos appareils mobiles. Cela ressemble tout à fait à la recherche dans une arborescence de répertoire dans votre système de fichiers sur le disque dur d'un ordinateur. Que vous soyez habitué à Windows, Linux ou MacOS, l'accès à vos fichiers sur le disque dur est toujours possible par un chemin, par ex. :

C:\Users\Spock\Documents\ScienceRecords (Windows)
/Users/Kirk/Documents/BeautifulAlienWomen (Linux/Mac)

Prenons maintenant une expression d'exemple XPath en comparaison :

$DB1/salesdata/region/month/gadgets

Comme vous le voyez, il s'agit du même principe. Vous utilisez XPath pour parcourir des structures d'arborescence de données de la même manière dont vous utilisez les expressions de chemin pour parcourir votre système de fichiers sur le disque dur d'un ordinateur. XPath utilise la / (barre oblique avant) pour séparer les éléments individuels sur le chemin comme Linux et MacOS qui utilise ce caractère pour séparer des répertoires.

Chose intéressante, cette analogie aux chemins de répertoires vaut pour deux abréviations très communes dans XPath : de même qu'un point . fait référence au répertoire actuel dans un système de fichier, le point . fait référence à l'élément actuel dans XPath, et le double point .. qui fait référence à un répertoire parent dans un système de fichiers, fait également référence à l'élément parent dans XPath.

Attributs

Si vos sources de données sont un document XML ou une donnée XML retournée par un service web, les données contenues dans cette structure d'arborescence sont réparties en deux catégories : les éléments et les attributs. Les éléments sont les pièces de données principales de XML et ils peuvent être imbriqués de manière à ce qu'un élément puisse avoir des enfants dans la structure d'arborescence. Les attributs, en revanche, sont de simples valeurs de données qui sont attachées à des éléments. Dans les arborescences situées sous les Sources de page, vous verrez que les attributs sont affichés avec un = (symbole égal) placé avant leur nom. Dans un document XML, les attributs sont écrits de la manière suivante : par ex. color="green".

Si vous souhaitez vous référer à des attributs dans une expression XPath, vous devez écrire un symbole @ avant leur nom :

$XML1/salesdata/region/@name

Sinon, vous pouvez faire la même chose avec des éléments et des attributs, c. à. d. que vous pouvez utiliser leurs valeurs dans un graphique aussi bien pour des calculs que pour des graphiques et vous pouvez attribuer les deux à des objets d'interface utilisateur dans un design MobileTogether.

Prédicats

Parfois la spécification du chemin d'accès vers un élément de vos données n'est pas suffisante. Ce qu'il vous faut, c'est de sélectionner des données correspondant à des critères particuliers pour, par ex., les présenter dans un graphique ou les montrer à l'utilisateur dans une table.

Si vous avez déjà travaillé avec des bases de données relationnelles, cela revient à utiliser la clause WHERE dans une déclaration SQL. Elle vous permet de sélectionner les données depuis vos bases de données selon certains critères

Le concept équivalent dans XPath se nomme "Prédicats". Un prédicat XPath vous permet de spécifier les critères de sélection qui ne choisiront que certains éléments correspondant aux critères spécifiés. Les prédicats sont saisis en tant que test logique compris dans des [] (crochets) par exemple.

$XML1/salesdata/region[@name=”East”]/Month

Le moyen d'interpréter cette expression est : dans la source de données $XML1, se rendre dans l'élément salesdata, puis aller dans son élément enfant region et ne choisir que les régions dont le nom d'attribut est équivalent à « East », puis sélectionner leur élément enfant Month respectif.

Opérateurs

Nous avons précisé au début que XPath est un langage d'expression complet. Cela signifie que non seulement elle vous laisse choisir certains éléments de données mais elle vous permet également de procéder à toutes les opérations mathématiques classiques sur les données pour calculer de nouvelles valeurs. De même que les formules dans Excel vous permettent de calculer de nouvelles valeurs à partir de vos données existantes, les expressions XPath dans MobileTogether vous permettent de faire exactement la même chose.

Si, par exemple, vous souhaitez créer une solution de facturation mobile et que vous souhaitez afficher le montant total pour un poste dans votre formulaire mobile :

$DB1/sales/invoice/item/quantity * $DB1/sales/invoice/item/price

En assumant que votre structure de données comporte des éléments séparés pour la quantité et le prix (pouvant être édité par l'utilisateur), vous pouvez simplement calculer le montant total pour ce poste avec la multiplication ci-dessus en utilisant * (astérisque).

Une des fonctions les plus intéressantes de XPath est que, pour vous éviter une saisie fastidieuse, vous pouvez faire la multiplication dans le XPath en utilisant les parenthèses lorsque vous arrivez à l'endroit correct du chemin, donc cette version abrégée sera équivalente à l'expression supérieure :

$DB1/sales/invoice/item/(quantity * price)

De même, vous pouvez utiliser + (plus) et - (moins) en tant qu'opérateurs mathématiques. En revanche, vous devrez utiliser un signe différent pour la division. Puisque vous utilisons déjà le signe / (barre oblique avant) pour séparer des éléments individuels sur un chemin, nous ne pouvons pas utiliser le même caractère pour une division. C'est pourquoi l'opérateur des divisions dans XPath est le mot div pour une division de nombres réels et idiv pour une division entière (par ex. si vous souhaitez que le résultat soit un nombre entier plutôt qu'un nombre réel).

De plus, il est judicieux (et parfois même essentiel) de placer des espaces autour de vos opérateurs pour assurer qu'ils ne seront pas inclus dans un nom d'élément ou d'attribut. Cela vaut particulièrement pour l'opérateur - (moins).

Séquences

Une différence importante entre XPath et les chemins de répertoire est qu'alors qu'une expression de chemin de répertoire identifie généralement un seul fichier ou répertoire, une expression XPath peut référencer plus qu'un nœud de données (par ex. un élément ou un attribut). En fait, chaque expression XPath retourne toujours une séquence de nœuds en tant que résultat.

Pour mieux comprendre le système, vous pouvez imaginer que la plupart des bases de données contiennent des lignes de données possédant une structure similaire, de même que la plupart des documents XML contiennent une série d'éléments possédant le même nom et partageant une structure semblable. XPath a été créé pour permettre à un développeur de travailler aisément avec de tels ensembles de données. Il est donc extrêmement avantageux d'adresser un ensemble de nœuds complet en une fois comme nous le verrons dans les chapitres suivants.

Dans le même temps, il est parfois nécessaire de définir explicitement des séquences dans une expression XPath. Vous pouvez le faire en énumérant les valeurs dans la formule suivante :

(1, 2, 3, 4, 5)

Les séquences sont classées de manière à ce que la séquence supérieure soit nettement différente de la séquence (3, 5, 2, 4, 1). Les séquences peuvent contenir des nœuds provenant de vos données et des valeurs numériques constantes ou des valeurs de string constantes.

Par exemple, une séquence de strings possible pourrait être :

("a", "b", "c", "d", "e")

Enfin, vous pouvez spécifier des séquences de valeurs numériques en utilisant l'opérateur d'intervalle to :

(1 to 5)

C'est l'équivalent de la séquence (1, 2, 3, 4, 5) – comme vous pouvez le voir, cet opérateur d'intervalle peut être utilisé pour construire rapidement des séquences de valeurs numériques qui seraient trop fastidieuses à énumérer manuellement lorsque les nombres deviennent trop importants.

Expression for

Si vous avez eu l'occasion de travailler avec des langages de programmation vous reconnaîtrez la boucle for. Il s'agit d'un outil fréquemment utilisé qui existe dans la plupart des langages modernes sous l'une ou l'autre forme et qui fait également partie intégrante du langage d'expression XPath.

Dans sa forme la plus simple, une expression for dans XPath vous permet d'itérer sur une séquence de valeurs ou de nœuds en utilisant une variable de boucle temporaire définie directement dans l'expression for. Par exemple, l'expression

for $i in (1 to 10) return 2 * $i

produira la séquence numérique (2, 4, 6, 8, 10, 12, 14, 16, 18, 20) en itérant sur la séquence originale (1 à 10) en utilisant la variable $i puis en calculant 2 * $i pour chaque point de données dans la séquence.

Maintenant que nous savons que toute expression XPath peut retourner une séquence de nœuds, nous pouvons aussi utiliser l'expression for pour itérer sur ces nœuds et effectuer des opérations mathématiques. Par exemple, pour itérer sur tous les postes d'une facture et calculer le montant respectif pour ce poste, nous pourrions utiliser cette expression :

for $x in $DB1/sales/invoice/item return $x/price * $x/quantity

Dans ce cas, $x sera la variable de boucle qui itèrera sur chaque élément d'objet et cette expression retournera une séquence qui contient les sommes pour chaque poste dans notre facture. Supposons que nous avons les deux éléments d'objet suivants dans notre donnée de source de facture :

<item>
<quantity>5</quantity>
<price>12,50</price>
</item>
<item>
<quantity>3</quantity>
<price>27,85</price>
</item>

Alors l'expression XPath précédente retournera la séquence (62.5 83.55) qui constitue les montants respectifs pour chaque poste de notre facture.

Fonctions

Dans XPath, les fonctions sont semblables aux fonctions d'une formule Excel ou de la plupart des autres langages de programmation : vous appelez une fonction en utilisant son nom et en passant un ensemble de paramètres de fonctions entre parenthèses (). Par exemple, pour additionner la séquence (3, 9, 14), vous écrirez :

sum( (3, 9, 14) )

Le résultat est donc 26. Veuillez noter que dans ce cas, les parenthèses extérieures font partie de l'appel de fonction pour la fonction sum(), alors que les parenthèses intérieures font partie de la séquence que nous faisons passer à la fonction en tant que paramètre unique.

De même, nous pouvons maintenant calculer le total de la facture à partir de l'exemple précédent en additionnant tous les postes :

sum( for $x in $DB1/sales/invoice/item
return $x/price * $x/quantity )

Cela peut être très utile par exemple pour construire des formes interactives dans une solution mobile où vous pouvez afficher des valeurs de données pour des totaux qui changeront dynamiquement lorsque l'utilisateur saisira des données dans le formulaire.

XPath contient un nombre important de fonctions intégrées pour des valeurs numériques (par ex. round, abs, floor, etc.), la manipulation de string (par ex. concat, lower-case, contains, replace), des durées, des dates et des heures, ainsi que des opérations d'agrégation sur des séquences (par ex. count, sum, avg, min, max). Grâce à l'utilisation de ces fonctions, le constructeur XPath contenu dans MobileTogether permet une écriture facile des expressions XPath parce qu'il contient un répertoire pratique de toutes les fonctions disponibles accompagné d'une brève description et d'informations concernant les paramètres requis. Les fonctions sont affichées dans des groupes logiques. Il est donc très aisé de trouver la fonction nécessaire pour vos besoins particuliers.

Expression if

Cette expression est souvent utilisée dans les langages de programmation, ainsi que dans les langages d'expression, pour décider d'une manière différente de calculer un résultat particulier selon le fait qu'un critère particulier soit rempli ou non. C'est à ce niveau que la déclaration if entre en jeu. Elle vous permet de définir des résultats alternatifs sur la base d'un critère-test que vous pouvez spécifier.

Dans XPath, la déclaration if prend la forme suivante :

if ( test-expression ) then expression else expression

dans notre cas, l'expression-test est une expression XPath logique qui retourne true ou false.

Par exemple, nous pouvons utiliser ce type de déclaration dans MobileTogether pour rendre la couleur du texte d'un libellé ou d'un champ éditable dépendant de la valeur numérique contenue dans les données. Si par exemple, nous associons un élément de notre source de donnée avec un champ éditable. Nous pouvons sélectionner ce champ et nous rendre à l'onglet de propriétés où nous pouvons sélectionner la propriété Couleur de texte. Au lieu de définir la couleur avec le sélectionneur de coloris, nous pouvons cliquer sur l'icône XPath dans la barre d'outils pour définir la couleur de texte de ce champ d'entrée par le biais d'une expression XPath :

if ( $MT_ControlValue >= 0 ) then "green" else "red"

Ici, nous utilisons une de nos variables intégrées MobileTogether pour nous référer à la commande actuelle et nous testons si la valeur est supérieure ou égale à zéro.

Selon le résultat du test, le résultat sera soit "green" soit "red" et la couleur de notre texte changera dynamiquement selon les entrées de l'utilisateur.

Vous trouverez de nombreuses variables commençant avec $MT_ qui vous permettent de prendre des décisions sur la base de la taille de l'écran de l'appareil, le système d'exploitation, le langage et d'autres facteurs. Toutes ces variables globales intégrées peuvent être consultées dans le dialogue Variables globales dans le menu Projet dans MobileTogether Designer.

XQuery

Jusqu'à présent, nous nous sommes concentrés sur XPath pour des raisons historiques, puisqu'il s'agit du langage d'expression sur base XML le plus connu. Il est utilisé depuis environ 15 ans. Néanmoins, outre XPath, MobileTogether prend également en charge le langage XQuery, plus puissant. XQuery est un sur-ensemble de XPath, ce qui signifie que chaque expression XPath valide est également une expression XQuery valide. XQuery, néanmoins, rajoute quelques constructions puissantes supplémentaires qui vous permettent de faire plus de choses et de manipuler ou construire instantanément des documents XML entiers.

Expression FLWOR

L'expression XQuery la plus importante est la soit-disante expression FLWOR. FLWOR est l'acronyme de “For-Let-Where-Order-Return” et se prononce “flower” (fleur en anglais). Son fonctionnement est semblable à la déclaration SQL SELECT qui comporte des clauses semblables, telles que FROM, WHERE, ORDER BY, etc. L'expression FLWOR nous permet d'interroger des données XML et de bases de données de façon bien plus efficace et puissante qu'avec des expressions XPath normales et elle constitue la pierre angulaire de XQuery.

Nous avons déjà traité la partie for de l'expression au cours de notre exposé sur XPath, cette partie de l'expression FLOWR vous sera donc probablement familière. De même, nous avons étudié la clause de retour dans la même expression. Néanmoins, XQuery améliore considérablement la flexibilité de la clause de retour en vous permettant de créer des arborescences XML complètes dès le début à l'aide des constructeurs. En principe, comme auparavant, la clause de retour est évaluée pour chaque objet dans la boucle for, mais au lieu de produire uniquement une valeur dans une séquence, vous pouvez maintenant construire une sous-arborescence XML complète comme nous allons le voir dans les exemples ci-dessous.

L'objectif de la clause let de l'expression FLOWR est de définir des variables supplémentaires que nous pourrons utiliser plus tard pour nos résultats. Cela pourrait provenir de la même source de données ou même d'une source de données différente, mais vous pouvez par exemple utiliser la variable loop pour sélectionner certains éléments provenant d'autres sources.

Par exemple, en admettant qu'une source de données contient des informations concernant les départements d'une entreprise et qu'une autre source de données contient des informations concernant les employés, cela pourrait constituer le début d'une expression FLOWR qui choisit des employés dans un ensemble particulier de départements :

for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]

La clause where nous permet de filtrer les données sur la base de certains critères, de la même manière que nous avons utilisé des prédicats dans des expressions XPath auparavant. Par exemple, nous pouvons utiliser cela pour filtrer les départements sur la base du nombre d'employés y étant occupés :

for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
where count($e) >= 10

Enfin, la clause order by nous permet de trier les résultats selon n'importe quel critère, ce qui est particulièrement utile lors de la construction de nouveaux documents XML de résultats.

À présent, nous allons rassembler l'expression FLOWR complète en utilisant les deux sources de données des départements et des employés mentionnées précédemment. Par exemple, nous pouvons générer une nouvelle table de données à afficher dans une solution mobile qui présenterait des informations d'agrégation sur le nombre d'employés et le salaire moyen pour les départements occupant plus de 10 employés :

for $d in $DEPARTMENTS/depts/deptno
let $e := $EMPLOYEES/emps/emp[deptno = $d]
where count($e) >= 10
order by avg($e/salary) descending
return
<big-dept>
{ $d,
<headcount>{count($e)}</headcount>,
<avgsal>{avg($e/salary)}</avgsal>
}
</big-dept>

Dans un autre exemple, en utilisant nos données précédentes concernant nos factures mobiles à postes, nous pouvons maintenant effectuer une boucle sur plusieurs factures à partir d'une certaine date pour calculer le total des facture puis construire une table des résultats classés que nous pouvons afficher avec, en tête, la somme totale la plus importante et en dernier, la somme la plus petite :

for $inv in $DB1/sales/invoice
let $total := sum (for $x in item return $x/price * $x/quantity)
where $inv/date >= "2014-01-01"
order by $total descending
return <invtotal>{ $total }</invtotal>

Comme vous pouvez le constater, la flexibilité et la puissance de ces expressions XQuery est bien plus importante que ce que nous aurions pu atteindre avec les seules expressions XPath. Malgré tout, une augmentation de la puissance entraîne une complexité plus importante ; il se peut donc qu'il vous faudra investir un peu de temps avant de maîtriser complètement XQuery.

Dans le même temps le constructeur et évaluateur XPath et XQuery dans MobileTogether peut vous apporter une aide précieuse dans la rédaction d'expressions sans fautes et pour les tester avec vos données. En combinaison avec le simulateur puissant qui vous permet d'exécuter vos solutions mobiles directement dans MobileTogether Designer, vous pouvez très simplement tester et déboguer votre sélection de données avec XPath et XQuery et construire des applis mobiles puissantes bien plus rapidement qu'avec d'autres méthodes.

Résumé

Dans ce document, nous nous sommes efforcés de vous fournir une introduction en douceur aux concepts les plus importants de XPath et XQuery pour vous aider à vous lancer dans le maniement des données dans MobileTogether. Nous avons effleuré les concepts de base des expressions XPath et de certaines des fonctions XQuery plus puissantes qui devraient vous permettre de créer des sélections de données puissantes dans votre flux de travail mobile, de produire des graphiques exacts de vos données et de personnaliser l'interface utilisateur de votre solution mobile en réponse aux éléments de données spécifiques selon vos besoins.

Ce document ne constitue qu'une initiation et n'a pas la prétention de constituer un tutoriel complet ou d'expliquer tous les aspects de ces langages. Vous pouvez en apprendre plus dans notre cours de formation XPath en ligne très complet et gratuit qui convient parfaitement pour les débutants et pour les utilisateurs confirmés.

MobileTogether prend entièrement en charge les langages XPath 3.0 et XQuery 3.0. L'avantage d'utiliser un standard international comme XPath et XQuery est que de nombreux développeurs ont probablement déjà appris à se servir de XPath s'ils ont travaillé avec XML, XSLT ou XML Schema auparavant. La possibilité de réutiliser ces connaissances dans MobileTogether constitue donc un grand avantage. Et la mise à jour de vos connaissances de XPath 1.0 ou 2.0 à 3.0 n'est pas compliquée.

De même, XPath et XQuery sont des standards développés par W3C. Il ne s'agit pas de langages propriétaires inventés par une entreprise, l'apprentissage de ces standards peut donc s'avérer utile dans d'autres contextes.

Pour consulter la spécification complète de XPath 3.0 et de XQuery 3.0, veuillez voir les documents de spécification technique suivants :

Enfin, l'utilisation de XPath et XQuery dans MobileTogether signifie que vous pouvez aisément utiliser XMLSpy pour élaborer un prototype, développer et déboguer des expressions XPath et XQuery plus complexes si vous avez besoin d'aller un peu plus loin. XMLSpy fournit un évaluateur XPath et un débogueur XQuery complets, y compris un profileur pour une optimisation de la performance.

Pour en savoir plus sur XPath 3.0 et XQuery 3.0, veuillez vous référer aux pages Altova de formation en ligne et de documentation. De même, n'hésitez pas à poser vos questions concernant XPath et XQuery dans le forum de support MobileTogether sous https://support.mobiletogether.com/