Utilisation des variables externes avec XPath
Quand vous utilisez une expression XPath 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 XPath qui utilise des variables externes, déclarez les types des variables à l'aide d'une instance XStaticContext.
Cette étape est facultative. Si une variable n'est pas déclarée, le processeur considère qu'elle est du 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. L'exemple suivant montre comment préparer une expression XPath qui utilise des variables dont deux sont déclarées dans le contexte statique et une n'est pas déclarée.// Create the factory XFactory factory = XFactory.newInstance(); // Create a new static context from the factory XStaticContext staticContext = factory.newStaticContext(); // Define QNames for the names of the variables to be declared final QName taxRate = new QName("taxRate"); final QName partNumbers = new QName("partNumbers"); // Declare a variable called "taxRate" as an xs:float staticContext.declareVariable(taxRate, XTypeConstants.FLOAT_QNAME); // Obtain an XSequenceTypeFactory instance from the factory XSequenceTypeFactory typeFactory = factory.getSequenceTypeFactory(); // Define a sequence type for a sequence of xs:integer values XSequenceType integerSequence = typeFactory.atomic(XTypeConstants.INTEGER_QNAME, XSequenceType.OccurrenceIndicator.ZERO_OR_MORE); // Declare a variable called "partNumbers" as a sequence of xs:integer values staticContext.declareVariable(partNumbers, integerSequence); // Create an XPath expression that uses the declared variables, as well as another variable "discount" // that the processor will assume has type item()* String expression = "sum(for $partNumber in $partNumbers return /inventory/part[@num=$partNumber]/@price) * (1 - $discount) * (1 + $taxRate)"; // Prepare the XPath expression XPathExecutable xpath = factory.prepareXPath(expression, staticContext);
- Pour exécuter une expression XPath qui utilise des variables externes, indiquez (ou associez) des valeurs à chaque variable à l'aide d'une instance XDynamicContext.
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 XPath.
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 XPath 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 "taxRate" and "discount" variables dynamicContext.bind(taxRate, 0.13f); dynamicContext.bind(new QName("discount"), 0.40); // Bind a sequence of atomic values for the "partNumbers" variable dynamicContext.bindSequence(partNumbers, new int[] {2, 1, 2, 3, 2}); // Create an XML input document String xml = "<inventory>" + "<part num='1' price='9.99'/>" + "<part num='2' price='4.47'/>" + "<part num='3' price='12.99'/>" + "</inventory>"; StreamSource source = new StreamSource(new StringReader(xml)); // Execute the expression XSequenceCursor result = xpath.execute(source, dynamicContext);


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