Visualización de los resultados
Una vez la aplicación ha preparado o cargado el objeto XExecutable para una expresión XPath (un objeto XPathExecutable), una hoja de estilo XSLT (un objeto XSLTExecutable) o una expresión XQuery (un objeto XQueryExecutable), se aplica el objeto XExecutable a algunas entradas y, a continuación, se hace alguna cosa con el resultado. El origen de la entrada que se proporciona y lo que desea realizar con el resultado determinan el método de ejecución que se debe utilizar.
Procedimiento
- Visualización de resultados XPath.
En el caso de una expresión XPath, los métodos de ejecución de la interfaz XPathExecutable devuelven una instancia de la clase XSequenceCursor que contiene la secuencia que se genera a partir de la evaluación de la expresión con el elemento de contexto determinado y el contexto dinámico, si lo hay.
También hay un conjunto de métodos executeToList en la interfaz XPathExecutable. Estos métodos devuelven la secuencia como una instancia de la interfaz java.util.List<XItemView>, en que cada elemento de la secuencia que deriva de la evaluación de la expresión XPath se representa en la lista como una instancia de la interfaz XItemView. Las entradas de esa lista están en el mismo orden que en la secuencia que se ha generado a partir de la evaluación de la expresión XPath.
El ejemplo siguiente muestra cómo obtener el coste de cada elemento en una orden de compra como un XSequenceCursor.XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath( "/purchaseOrder/item/(@unit-price * @quantity)"); XSequenceCursor exprResult = expr.execute(new StreamSource("input.xml"));
En el ejemplo siguiente se muestra cómo obtener el coste de cada elemento en una orden de compra de una instancia de la interfaz java.util.List.XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath( "/purchaseOrder/item/(@unit-price * @quantity)"); List<XItemView> exprResult = expr.executeToList(new StreamSource("input.xml"));
- Utilización de la interfaz XItemView.
Puede acceder a cada elemento de una secuencia utilizando los métodos de la interfaz XItemView. Puede utilizar el método XItemView.isAtomic() para determinar si el elemento es un valor atómico o un nodo. Si el elemento es un valor atómico, puede utilizar el método getValueType() en la interfaz XItemView. El método devuelve una instancia del tipo enumerado XTypeConstants.Type. Si el valor atómico es una instancia de un tipo atómico incorporado o un tipo definido por el usuario que deriva de un tipo atómico incorporado,el resultado del método getValueType() es el valor enumerado correspondiente a ese tipo. Para un valor atómico que podría ser de un tipo derivado definido por el usuario, también puede resultarle útil utilizar el método XItemView.getValueTypeName() con el fin de determinar el tipo preciso del valor.
Dado el tipo de un valor atómico, puede utilizar el método apropiado para obtener el valor.XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath( "sum(/purchaseOrder/item/(@unit-price * @quantity))"); XItemView exprResult = expr.execute(new StreamSource(purchaseOrder)); double totalCost = 0.0; // Decide how to get result based on the type of the value switch (exprResult.getValueType()) { case DOUBLE: { totalCost = exprResult.getDoubleValue(); break; } case FLOAT: { totalCost = exprResult.getFloatValue(); break; } case INTEGER: { totalCost = exprResult.getLongValue(); break; } case DECIMAL: { totalCost = exprResult.getDecimalValue().doubleValue(); break; } default: { System.err.println("Unexpected type for result"); } }
La interfaz XItemView también se amplía a la interfaz XNodeView, por lo que si el resultado de llamar al método XItemView.isAtomic() es false, es decir, el elemento es un nodo, puede utilizar los métodos heredados de la interfaz XNodeView para acceder a la información sobre el nodo. El método XNodeView.getNodeQName() devolverá el nombre del nodo y el método XNodeView.getKind() devolverá un valor del tipo enumerado XNodeView.Kind que indica la clase de nodo que es el elemento: XNodeView.DOCUMENT, XNodeView.ELEMENT, etcétera.XFactory factory = XFactory.newInstance(); // Prepare an expression to get the first node whose string value matches a given query string XPathExecutable expr = factory.prepareXPath( "(/descendant-or-self::node()/(self::node()|@*)[. = 'search'])[1]"); XItemView exprResult = expr.execute(new StreamSource(inputFile)); // Print the kind of node found and its name, if appropriate switch (exprResult.getKind()) { case ELEMENT: { System.out.print("Element " + exprResult.getNodeQName().toString()); break; } case ATTRIBUTE: { System.out.print("Attribute " + exprResult.getNodeQName().toString()); break; } case COMMENT: { System.out.print("Comment "); break; } case PROCESSING_INSTRUCTION: { System.out.print("PI " + exprResult.getNodeQName().toString()); } }
También puede explorar el árbol que contiene un nodo utilizando la interfaz XTreeCursor.
- Visualización de los resultados XSLT y XQuery.
Todos los métodos execute y executeToList disponibles desde la interfaz XPathExecutable se heredan de la interfaz XExecutable, por lo que estarán disponibles para que se utilicen en instancias de la interfaz XSLTExecutable o también de la interfaz XQueryExecutable. En el caso de una instancia de la interfaz XQueryExecutable, el objeto que devuelve el método contiene la secuencia que resulta de la evaluación de la consulta. En el caso de la interfaz XSLTExecutable, la secuencia contiene el nodo de documentos del resultado primario de la evaluación de la hoja de estilo, si lo hay.
Las interfaces XSLTExecutable y XQueryExecutable también definen métodos ejecutables que aceptan una instancia de la interfaz javax.xml.transform.Result. El objeto resultante que proporciona la aplicación contendrá el resultado primario de la evaluación de la hoja de estilo, en el caso de la interfaz XSLTExecutable, o el resultado de evaluar la consulta, en el caso de XQueryExecutable.
El ejemplo siguiente genera un árbol DOM como resultado de una transformación y almacena el árbol en la instancias de la clase DOMResult que se pasa como argumento al método XSLTExecutable.execute.XFactory factory = XFactory.newInstance(); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); DOMResult res = new DOMResult(); style.execute(new StreamSource("purchase.xml"), res); Node node = res.getNode();
El ejemplo siguiente genera una instancia de la interfaz XSequenceCursor como resultado de la transformación.XFactory factory = XFactory.newInstance(); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); XSequenceCursor xformResult = style.execute(new StreamSource("purchase.xml"));
- Utilización de XResultResolver y XSLT.
Una hoja de estilo XSLT 2.0 puede generar más de un documento resultante si se utiliza la instrucción xsl:result-document. El resultado primario de la transformación se genera para cada árbol de resultados que construye la hoja de estilo que no se encuentra en una instrucción xsl:result-document o que se encuentra en una instrucción xsl:result-document que tiene un atributo href cuyo valor efectivo es una serie de longitud cero. El resultado primario se devuelve a su aplicación utilizando los diversos medios descritos anteriormente.
Si la hoja de estilo evalúa una instrucción xsl:result-document que tiene un atributo href cuyo valor efectivo no es una serie de longitud cero, el valor predeterminado que resulta se graba en una corriente de salida. El URI de la corriente de salida se determina resolviendo el valor efectivo del atributo href con el valor del URI de salida base en el contexto dinámico.
Puede sustituir este comportamiento predeterminado suministrando una instancia de la interfaz XResultResolver en XDynamicContext que se utiliza para la transformación. Se llama al método getResult de la interfaz XResultResolver si se invoca a alguna instrucción xsl:result-document; el resultado del método getResult es una instancia de la interfaz Result donde se dirige el resultado de la instrucción xsl:result-document. La utilización de la interfaz XResultResolver permite que su aplicación decida caso por caso dónde va a dirigir el resultado de todas las instrucciones xsl:result-document de las hojas de estilo. Si la aplicación no proporcionaba ninguna instancia de la interfaz Result para el resultado primario del método execute de la interfaz XSLTExecutable, se llamará al método getResult de XResultResolver también para el resultado primario.
Si el método getResult de XResultResolver devuelve una referencia no válida, se restaurará el comportamiento predeterminado para ese resultado en particular, es decir, el resultado se grabará en una corriente de salida, en el caso de un resultado secundario, o se devolverá como resultado del método execute como una instancia de la interfaz XSequenceCursor, en el caso del resultado primario.
En el ejemplo siguiente se utiliza una instancia de la interfaz XResultResolver para capturar todos los resultados generados por una hoja de estilo como instancias de la clase XSequenceCursorResult en la variable allResults. Entonces, la aplicación podría extraer la instancia de la interfaz XSequenceCursor que contiene cada instancia de la clase XSequenceCursorResult utilizando el método XSequenceCursorResult.getSequenceCursor().
final ArrayList<XSequenceCursorResult> allResults = new ArrayList<XSequenceCursorResult>(); XFactory factory = XFactory.newInstance(); XDynamicContext context = factory.newDynamicContext(); // Create XResultResolver that saves XSequenceCursorResult // instances in allResults context.setResultResolver(new XResultResolver() { public Result getResult(String href, String base) { XSequenceCursorResult result = new XSequenceCursorResult(); allResults.add(result); return result; } }); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); style.execute(new StreamSource("purchase.xml"), context); // All results, including the primary, are now available from the allResults variable.


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_results_view
File name: txml_results_view.html