Utilización de variables externas con XPath
Cuando utilice una expresión XPath 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 XPath que utilice variables externas, declare los tipos de las variables utilizando una instancia
XStaticContext.
Este paso es opcional. Si no se ha declarado una variable, el procesador supone es 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 En el ejemplo siguiente se muestra cómo preparar una expresión XPath que utiliza variables, con dos declaradas en el contexto estático y una no declarada.// 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);
- Para ejecutar una expresión XPath que utiliza variables externas, suministre (o enlace) valores para cada
variable utilizando una instancia XDynamicContext.
Se llega a un error si no proporciona un valor para una variable que se utiliza cuando se ejecuta la expresión XPath.
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 XPath 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 "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
File name: txml_vars_xpath.html