Utilización de variables externas con XQuery
Cuando utilice una expresión XQuery que emplee variables externas, suministre (o enlace) valores para cada variable utilizando una instancia XDynamicContext y, de forma opcional, declare los tipos de variables utilizando una instancia XStaticContext.
Procedimiento
- Cuando esté preparando una expresión XQuery que utilice variables externas, declare los tipos de las variables utilizando una instancia
XStaticContext.
Las variables declaradas en XStaticContext sólo son visibles para el módulo principal. Para hacer que una variable externa sea visible para un módulo de biblioteca, debe declararse en el prólogo del módulo de biblioteca con una declaración de variable externa.
La declaración de la variable en XStaticContext es opcional. Si una variable no se declara, el procesador supone que su tipo es item()*. En otras palabras, el valor de la variable puede ser una secuencia de cualquier longitud que conste de elementos de cualquier tipo. La declaración de un tipo para las variables puede ayudar al procesador a detectar algunos errores de uso estáticamente durante la preparación.
La interfaz XStaticContext tiene dos métodos declareVariable y cada uno de ellos tiene dos parámetros, uno para el nombre y otro para el tipo de variable. El nombre siempre se proporciona como objeto QName pero el tipo puede ser QName o XSequenceType.Tabla 1. Métodos declareVariable de XStaticContext. En la tabla siguiente se explica cuándo se debe utilizar cada forma del método declareVariable.
Firma de método Finalidad declareVariable(QName name, QName type) Se utiliza cuando el valor de la variable es un valor atómico simple QName debe hacer referencia a un tipo incorporado o a un tipo global declarado en un esquema que se ha registrado en la instancia XFactory que se utiliza para crear la instancia XStaticContext. Si QName hace referencia a un tipo no atómico, el procesador tratará la variable como si tuviera el tipo element(*, ns:type), siendo ns:type es el valor de QName indicado. La interfaz XTypeConstants tiene disponibles constantes adecuadas que proporcionan un objeto QName para cada tipo incorporado.
declareVariable(QName name, XSequenceType type) Se utiliza cuando el valor de la variable es un nodo simple o una secuencia de valores o nodos atómicos XQuery también permite declarar variables en el prólogo de una expresión XQuery. La siguiente expresión XQuery utiliza dos variables, una declarada en el prólogo y la otra no.
La variable no declarada en la propia expresión XQuery se puede declarar opcionalmente utilizando una instancia XStaticContext para proporcionar al procesador información de tipo.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>
En el ejemplo siguiente se muestra cómo preparar la expresión XQuery anterior proporcionando el tipo de la variable no declarada en la propia expresión XQuery. Se supone que la expresión está accesible utilizando el objeto fuente 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);
- Para ejecutar una expresión XQuery que utiliza variables externas, suministre (o enlace) valores para cada
variable utilizando una instancia XDynamicContext.
Los enlaces para variables externas estarán disponibles para el módulo principal y para los módulos de biblioteca que tengan una declaración de variable externa en su prólogo para esa variable.
Se llega a un error si no proporciona un valor para una variable que se utiliza cuando se ejecuta la expresión XQuery.
XDynamicContext tiene una cantidad de métodos bind, bindItem y bindSequence. Cada uno tiene dos parámetros, siendo el primero un objeto QName correspondiente al nombre del parámetro y el segundo un valor.Tabla 2. Métodos bind, bindItem y bindSequence de XDynamicContext. En la tabla siguiente se explica cuándo se utiliza cada forma de los métodos bind, bindItem y bindSequence de XDynamicContext.
Método Finalidad bind Se utiliza cuando se enlaza a un valor atómico simple Hay una forma de este método para cada tipo Java™ que se utilice en la correlación estándar de tipos incorporados para tipos Java. Hay dos formas adicionales: una que toma un nodo y otra que toma un origen. Se utilizan para enlazar un nodo de un árbol DOM y analizar un origen nuevo para obtener un nodo de documentos, respectivamente.
bindItem Se utiliza cuando se enlaza un elemento simple a un objeto XItemView Un objeto XItemView se puede obtener del resultado de ejecutar otra expresión o se puede construir utilizando una instancia XItemFactory.
bindSequence Se utiliza cuando se enlazan secuencias menores o mayores que un elemento Hay una forma de este método para cada tipo Java que se utilice en la correlación estándar de tipos incorporados para tipos Java; cada uno de ellos acepta una matriz de valores del tipo indicado.
Hay una forma adicional que toma XSequenceCursor. XSequenceCursor puede ser el resultado de ejecutar otra expresión o se puede construir utilizando una instancia XItemFactory.
El ejemplo siguiente ejecuta la expresión XQuery preparada en el primer ejemplo, enlazando primero los valores de cada variable que utiliza.// 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
File name: txml_vars_xquery.html