L'écriture XPath utilisée dans TIBCO EBX® doit être conforme à la syntaxe abrégée du XML Path Language (XPath) Version 1.0 standard, avec certaines restrictions. Ce document décrit la syntaxe abrégée supportée.
L'expression générale XPath est :
path[predicate]
/bibliotheque/livres/
./Auteur
../Titre
//livres
../../livre/[auteur_id = 0101 and (editeur = 'harmattan')]
/bibliotheque/livres/[not(editeur = 'dumesnil')]
starts-with(col3,'xxx') and ends-with(col3,'yyy') and osd:is-not-null(./col3))
contains(col3 ,'xxx') and ( not(col1=100) and date-greater-than(col2,'2007-12-30') )
author_id = $param1 and publisher = $param2
où les paramètres$param1
et$param2
ont respectivement pour valeurs0101
et'harmattan'
col1 < $param1 and col4 = $param2
où les paramètres$param1
et$param2
ont respectivement pour valeurs100
et'true'
contains(col3,$param1) and date-greater-than(col2,$param2)
où les paramètres$param1
et$param2
ont respectivement pour valeurs'xxx'
et'2007-12-30'
L'utilisation de cette notation est uniquement limitée à l'API Java puisque les valeurs des paramètres peuvent uniquement être définies par la méthode Request.setXPathParameter
.
osd:label(./delivery_date)='12/30/2014' and ends-with(osd:label(../adress),'Beijing - China')
osd:contains-record-label('dumesnil') or osd:contains-record-label('harmattan')
osd:has-validation-item()
osd:has-validation-item('error,info')
osd:contains-validation-message('xxx')
osd:contains-validation-message('xxx','info,warning')
Les fonctions XPath de validation sont interdites pour les associations et pour les filtres de clé étrangère.
Les prédicats osd:label
, osd:contains-record-label
et osd:contains-validation-message
sont localisés. La locale peut être définie par l'une des méthodes de l'API Java Request.setLocale
ou Request.setSession
.
Afin de garantir que le rapport de validation est à jour lors de la recherche, il est nécessaire de valider explicitement la table juste avant d'utiliser ces prédicats.
Expression | Format | Exemple |
---|---|---|
Expression XPath | <chemin container>[predicate] |
|
<container path> | <chemin absolu> ou <chemin relatif> | |
<absolute path> |
|
|
<relative path> |
|
|
Expression | Format | Notes/Exemple |
---|---|---|
<predicate> | Exemple : A et (B et non(C)) A,B,C : <expression atomique> | Composition de : parenthèses d'opérateurs logiques, not() et expressions atomiques. |
<atomic expression> | <chemin><comparateur><critère> ou méthode(<chemin>,<critère>) |
|
<path> | <chemin relatif> ou osd:label(<chemin relatif>) | Relatif à la table qui le contient :
|
<comparator> | <comparateur booléen>, <comparateur numérique> ou <comparateur 'string'> | |
<boolean comparator> |
| |
<numeric comparator> |
| |
<string comparator> |
| |
<method> | <méthode date>, <méthode 'string'>, méthode | |
<date, time & dateTime method> |
| |
<string method> |
| |
<criterion> | <critère booléen>, <critère numérique>, <critère 'string'>, <critère date>, <critère 'time'>, ou <critère 'dateTime'> | |
<boolean criterion> |
| |
<numeric criterion> | Un entier ou un décimal |
|
<string criterion> | Chaîne de caractères entre apostrophes |
|
<date criterion> | Entre apostrophes et formaté comme suit 'aaaa-MM-jj' |
|
<time criterion> | Entre apostrophes et formaté comme suit 'HH:mm:ss' ou 'HH:mm:ss.SSS' |
|
<dateTime criterion> | Entre apostrophes et formaté comme suit 'aaaa-MM-jjTHH:mm:ss' ou 'aaaa-MM-jjTHH:mm:ss.SSS' |
|
Il est possible d'utiliser une formule XPath 1.0 dans la partie valeur du critère d'une expression de prédicat atomique (côté droit).
Par exemple, au lieu de [./a=3]
, il est possible d'utiliser l'expression [./a=(floor(./d)+ 2.0)]
.
En raison de la forte dépendance des prédicats et le type du noeud du critère, la portion de chemin de l'expression du prédicat atomique (côté gauche) doit être un chemin de noeud et ne peut être une formule XPath. Par exemple, l'expression /table[floor(./a) > ceiling(./d)]
n'est pas valide.
La fonction osd:label()
peut être appliquée à la portion de chemin du prédicat atomique, afin de résoudre le prédicat sur le libellé et non sur la valeur. Dans ce cas, seuls les opérateurs et les critères de chaîne peuvent être utilisés, i.e. ends-with(osd:label(./price),'99')
.
Un prédicat sur libellé est localisé, le critère doit donc être exprimé dans la même locale que la requête filtrée par prédicat. Par exemple : request.setLocale(Locale.FRENCH); request.setXPathFilter("osd:label(./delivery_date)='30/12/2014'");
Il est interdit d'utiliser la fonction osd:label
si la partie droite du prédicat est une valeur contextuelle.
Si la fonction osd:label
est utilisée dans un modèle de données, par exemple dans une sélection ou dans le prédicat de filtre du noeud de référence d'une table, la locale par défaut du modèle de données (telle que définie dans sa déclaration de module) doit être utilisée pour le format du critère (même si cela n'est généralement pas recommandé).
Pour les prédicats se rapportant à un noeud de sélection, la valeur du critère (à savoir, le coté droit du prédicat) peut être remplacée par un chemin contextuel utilisant la syntaxe ${<relative-path>}
où <relative-path> est l'emplacement de l'élément lié au noeud de sélection.
Lors de l'appel à une méthode, le critère est le deuxième paramètre, et le premier paramètre ne peut pas être une valeur relative.
Pour les prédicats sur listes groupées, le prédicat renvoie true
indépendamment du comparateur si l'un des éléments de la liste vérifie le prédicat.
Une attention particulière doit être portée au comparateur !=
. Par exemple, pour une liste groupée, ./list != 'a'
est différent de not(./list = 'a')
. Là où la liste contient les éléments (e1,e2,..)
, le premier prédicat équivaut à e1 != 'a' or e2 != 'a' ...
, alors que le second équivaut à e1 != 'a' and e2 != 'a' ...
.
Les valeurs Null doivent être traitées explicitement dans uns prédicat utilisant les opérateurs osd:is-null
et osd:is-not-null
.
Par exemple, /root/products[./price<100]
ou /root/products[./price!=100]
ne retournera aucun produit dont les prix ne sont pas définis (null
). Dans ce cas, pour retourner également les valeurs non définies, le prédicat devrait plutôt être : /root/products[./price!=100 or osd:is-null(./price)]
.
Par défaut, une expression littérale est délimitée par des apostrophes simples ('
). Si l'expression littérale contient des apostrophes simples et pas d'apostrophes doubles, l'expression doit être délimitée par des apostrophes doubles ("
). Si l'expression littérale contient des apostrophes simples et doubles, les apostrophes simples doivent être doublées.
Géré par la méthode XPathExpressionHelper.encodeLiteralStringWithDelimiters
dans l'API Java.
Exemples d'utilisation de encodeLiteralStringWithDelimiters
Valeur de l'expression littérale | Résultat de cette méthode |
---|---|
| 'Coeur' |
| "Coeur d'Alene" |
| 'Il a dit: "Ils vivent dans Coeur d''Alene".' |
Dans EBX®, les clés étrangères sont regroupées dans un champ unique avec la déclaration osd:tableRef
.
La syntaxe XPath standard a été étendue afin d'extraire la valeur de n'importe quel champ de clé primaire ciblé.
Si la table /root/tableA
a un champ osd:tableRef
nommé 'fkB' dont la cible est /root/tableB
et la clé primaire de tableB
a deux champs, id
de type xs:int
et date
de type xs:date
, alors les expressions suivantes sont valides :
/root/tableB[ fkB = '123|2008-01-21' ]
, où la chaîne "123|2008-01-21" est une représentation de l'intégralité de la valeur de la clé primaire.
Voir Syntaxe de la représentation de la chaîne interne des clés primaires pour plus d'informations.
/root/tableA[ fkB/id = 123 and date-equal(fkB/date, '2008-01-21') ]
, où ce prédicat est un équivalent plus efficace que celui de l'exemple précédent.
/root/tableA[ fkB/id >= 123 ]
, où n'importe quel opérateur numérique pourrait être utilisé, puisque le champ de clé primaire cible est de type xs:int
.
/root/tableA[ date-greater-than( ./fkB/date, '2007-01-01' ) ]
, où n'importe quel opérateur date pourrait être utilisé, puisque le champ de clé primaire cible est de type xs:date
;
/root/tableA[ fkB = "" ]
n'est pas valide puisque la clé primaire cible possède deux colonnes.
/root/tableA[ osd:is-null(fkB) ]
vérifie si une clé étrangère est null
(non définie).
Utilisation de XPath dans l'API Java :
En API Java, la classe XPathFilter
permet de définir des prédicats XPath et d'exécuter des requêtes sur ceux-ci.
La classe XPathExpressionHelper
offre des méthodes utilitaires pour manipuler les prédicats et les chemins XPath.