Utilisation des variables externes avec XQuery
Quand vous utilisez une expression XQuery qui utilise des variables externes, vous pouvez indiquer (ou associer) des valeurs à chaque variable à l'aide d'une instance XDynamicContext et, facultativement, déclarer les types des variables à l'aide d'une instance XStaticContext.
Procédure
- Quand vous préparez une expression XQuery qui utilise des variables externes, déclarez les types des variables à l'aide d'une instance XStaticContext.
Les variables déclarées dans XStaticContext sont visibles uniquement par le module principal. Pour qu'une variable externe soit visible par un module de bibliothèque, elle doit être indiquée dans le prologue du module de bibliothèque avec une déclaration de variable externe.
La déclaration de la variable dans l'élément XStaticContext est facultative. Si aucune variable n'est déclarée, le processeur considère qu'elle est de type item()*. En d'autres mots, la valeur de cette variable peut être une séquence de n'importe quelle longueur comprenant des éléments de tous types. Le fait de déclarer le type des variables peut aider le processeur à détecter les erreurs de syntaxe statiquement pendant la préparation.
L'interface XStaticContext possède deux méthodes declareVariable qui possèdent chacune deux paramètres : un pour le nom et l'autre pour le type de la variable. Le nom est toujours indiqué par un objet QName tandis que le type peut être un objet QName ou XSequenceType.Tableau 1. Méthodes declareVariable de XStaticContext. Le tableau suivant décrit quand il convient d'utiliser chaque forme des méthodes declareVariable.
Signature de méthode Fonction declareVariable(nom_QName, type_QName) Utilisez cette méthode pour indiquer une valeur atomique unique. Le QName doit référencer un type intégré ou un type global déclaré dans un schéma enregistré dans l'instance XFactory utilisée pour créer l'instance XStaticContext. Si le QName référence un type non atomique, le processeur traite la variable comme si son type était element(*, ns:type), où ns:type est le QName fourni. L'interface XTypeConstants propose des constantes qui fournissent un objet QName pour chaque type intégré.
declareVariable(nom_QName, type_XSequenceType) Utilisez cette méthode pour indiquer une valeur de variable correspondant à un noeud unique ou à une séquence de valeurs atomiques ou de noeuds. XQuery permet aussi de déclarer les variables dans le prologue d'une expression XQuery. L'exemple d'expression XQuery suivant utilise deux variables dont l'une est déclarée dans le prologue et l'autre pas.
La variable qui n'est pas déclarée dans l'expression XQuery proprement dite peut être déclarée facultativement à l'aide d'une instance XStaticContext pour fournir des données de type au processeur.declare namespace xs = "http://www.w3.org/2001/XMLSchema"; declare variable $searchTerms as xs:string+ external; <table> <tr><td>Title</td><td>Author</td></tr> { for $book in /library/book let $value := $book/@*[local-name()=$searchField] where exists(for $term in $searchTerms return if (contains($value, $term)) then true() else ()) return <tr> <td>{ string($book/@title) }</td> <td>{ string($book/@author) }</td> </tr> } </table>
L'exemple suivant montre comment préparer l'expression XQuery précédente en indiquant un type pour la variable non déclarée dans l'expression XQuery proprement dite. L'expression est réputée accessible à l'aide de l'objet source xquerySource.// Create the factory XFactory factory = XFactory.newInstance(); // Create a new static context from the factory XStaticContext staticContext = factory.newStaticContext(); // Define a QName for the name of the variable to be declared final QName searchField = new QName("searchField"); // Declare a variable called "searchField" as an xs:string staticContext.declareVariable(searchField, XTypeConstants.STRING_QNAME); // Prepare the XQuery expression XQueryExecutable xquery = factory.prepareXQuery(xquerySource, staticContext);
- Pour exécuter une expression XQuery qui utilise des variables externes, indiquez (ou associez) des valeurs à chaque variable à l'aide d'une instance XDynamicContext.
Les liaisons des variables externes seront disponibles pour le module principal et pour les modules de bibliothèque ayant une déclaration de variable externe dans leur prologue pour cette variable.
Une erreur est générée si vous n'indiquez pas la valeur d'une variable utilisée lors de l'exécution de l'expression XQuery.
L'interface XDynamicContext contient plusieurs méthodes bind, bindItem et bindSequence. Chacune de ces méthodes utilise deux paramètres dont le premier est un objet QName correspondant au nom du paramètre et le deuxième est la valeur associée.Tableau 2. Méthodes bind, bindItem et bindSequence de XDynamicContext. Le tableau suivant décrit quand il convient d'utiliser chaque forme des méthodes bind, bindItem et bindSequence de l'interface XDynamicContext.
Méthode Fonction bind Utilisez cette méthode pour associer une valeur atomique unique. Il existe une forme spécifique de cette méthode pour chacun des types Java™ utilisés dans le mappage standard entre les types intégrés et les types Java. Il existe aussi deux formes supplémentaires dont l'une utilise un noeud et l'autre une source. Ces deux formes de la méthode servent respectivement à associer un noeud d'une arborescence DOM et à analyser une nouvelle source pour obtenir un noeud de document.
bindItem Utilisez cette méthode pour associer un élément unique en tant qu'objet XItemView. Vous pouvez obtenir un objet XItemView en tant que résultat de l'exécution d'une expression ou le construire avec une instance XItemFactory.
bindSequence Utilisez cette méthode pour associer des séquences contenant zéro ou plusieurs éléments (mais pas un seul). Il existe une forme spécifique de cette méthode pour chacun des types Java utilisés dans le mappage standard entre les types intégrés et les types Java. Chaque forme demande un tableau de valeurs du type requis.
Il existe une forme supplémentaire de cette méthode qui utilise un objet XSequenceCursor. Vous pouvez obtenir un objet XSequenceCursor en tant que résultat de l'exécution d'une expression ou le construire avec une instance XItemFactory.
L'exemple suivant montre comment exécuter l'expression XQuery préparée dans le premier exemple. Le code commence par associer des valeurs à chaque variable qu'il utilisera.// Create a new dynamic context from the factory XDynamicContext dynamicContext = factory.newDynamicContext(); // Bind an atomic value for the "searchField" variable dynamicContext.bind(searchField, "title"); // Bind a sequence of atomic values for the "searchTerms" variable dynamicContext.bindSequence(new QName("searchTerms"), new String[] {"Lost", "Gables"}); // Create an XML input document String xml = "<library>" + "<book title='Lost in the Barrens' author='Farley Mowat'/>" + "<book title='Anne of Green Gables' author='L. M. Montgomery'/>" + "</library>"; StreamSource source = new StreamSource(new StringReader(xml)); // Execute the expression XSequenceCursor result = xquery.execute(source, dynamicContext);


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_vars_xquery
Nom du fichier : txml_vars_xquery.html