Ergebnisse anzeigen
Nachdem Ihre Anwendung das XExecutable-Objekt für einen XPath-Ausdruck (ein XPathExecutable-Objekt), für ein XSLT-Style-Sheet (ein XSLTExecutable-Objekt) oder für einen XQuery-Ausdruck (ein XQueryExecutable-Objekt) vorbereitet oder geladen hat, können Sie das XExecutable-Objekt auf Eingaben anwenden und anschließend Aktionen für das Ergebnis ausführen. Die Quelle Ihrer Eingaben und die Aktionen, die Sie für das Ergebnis ausführen, bestimmen die zu verwendende Ausführungsmethode.
Vorgehensweise
- Ziegen Sie XPath-Ergebnisse an.
Im Falle eines XPath-Ausdrucks geben die Ausführungsmethoden des Interface XPathExecutable eine Instanz der Klasse XSequenceCursor mit der Sequenz zurück, die sich bei Auswertung des Ausdrucks mit dem gegebenen Kontextelement und ggf. dem dynamischen Kontext ergibt.
Das Interface XPathExecutable stellt auch eine Reihe von executeToList-Methoden bereit. Diese Methoden geben die Sequenz als eine Instanz des Interface java.util.List<XItemView> zurück. Jedes Element dieser Sequenz, das sich durch die Auswertung des XPath-Ausdrucks ergibt, wird in der Liste als eine Instanz des Interface XItemView dargestellt. Die Einträge in dieser Liste haben dieselbe Reihenfolge wie in der Sequenz, die sich durch Auswertung des XPath-Ausdrucks ergibt.
Das folgende Beispiel zeigt, wie die Kosten für jedes Element einer Bestellung als ein XSequenceCursor abgerufen werden können.XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath( "/purchaseOrder/item/(@unit-price * @quantity)"); XSequenceCursor exprResult = expr.execute(new StreamSource("input.xml"));
Das folgende Beispiel zeigt, wie die Kosten für jedes Element einer Bestellung in einer Instanz des Interface java.util.List abgerufen werden können.XFactory factory = XFactory.newInstance(); XPathExecutable expr = factory.prepareXPath( "/purchaseOrder/item/(@unit-price * @quantity)"); List<XItemView> exprResult = expr.executeToList(new StreamSource("input.xml"));
- Verwenden Sie das Interface "XItemView".
Mit den Methoden des Interface XItemView können Sie auf jedes Element einer Sequenz zugreifen. Mit der Methode XItemView.isAtomic() können Sie feststellen, ob ein Element ein atomarer Wert oder ein Knoten ist. Wenn das Element ein atomarer Wert ist, können Sie die Methode getValueType() des Interface XItemView verwenden. Diese Methode gibt eine Instanz des Aufzählungstyps XTypeConstants.Type zurück. Falls es sich bei dem atomaren Wert um eine Instanz eines integrierten atomaren Typs handelt oder eines benutzerdefinierten Typs, der aus einem integrierten atomaren Typ abgeleitet wurde, ist das Ergebnis der Methode getValueType() der Aufzählungswert, der diesem Typ entspricht. Für einen atomaren Wert, der ggf. einen abgeleiteten benutzerdefinierten Typ hat, können Sie praktischerweise auch die Methode XItemView.getValueTypeName() verwenden, um den genauen Typ des Wertes zu ermitteln.
Sobald der Typ eines atomaren Wertes bekannt ist, können Sie die entsprechende Methode verwenden, um den Wert abzurufen.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; // Entscheiden, wie das Ergebnis ausgehend vom Typ des Wertes abgerufen werden soll 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"); } }
Das Interface XItemView erweitert auch das Interface XNodeView, sodass Sie mit den vom Interface XNodeView geerbten Methoden auf die Informationen zu einem Knoten zugreifen können, wenn der Aufruf der Methode XItemView.isAtomic() das Ergebnis "false" zurückgibt, weil das Element ein Knoten ist. Die Methode XNodeView.getNodeQName() gibt den Namen des Knotens und die Methode XNodeView.getKind() einen Wert des Auflistungstyps XNodeView.Kind zurück, der angibt, um welche Art von Knoten es sich bei dem Element handelt: XNodeView.DOCUMENT, XNodeView.ELEMENT usw.XFactory factory = XFactory.newInstance(); // Ausdruck zum Abrufen des ersten Knotens vorbereiten, dessen Zeichenfolgewert mit einer gegebenen Abfragezeichenfolge übereinstimmt XPathExecutable expr = factory.prepareXPath( "(/descendant-or-self::node()/(self::node()|@*)[. = 'search'])[1]"); XItemView exprResult = expr.execute(new StreamSource(inputFile)); // Gefundene Knotenart und ggf. den Namen ausgeben 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()); } }
Mit dem Interface XTreeCursor können Sie auch eine Struktur untersuchen, die einen Knoten enthält.
- Zeigen Sie XSLT- und XQuery-Ergebnisse an.
Alle verfügbaren Ausführungsmethoden und executeToList-Methoden des Interface XPathExecutable sind eigentlich vom Interface XExecutable geerbte Methoden, die somit auch für Instanzen des Interface XSLTExecutable oder XQueryExecutable verfügbar sind. Im Falle einer Instanz des Interface XQueryExecutable gibt die Methode ein Objekt mit der Sequenz zurück, die sich durch Auswertung der Abfrage ergeben hat. Im Falle des Interface XSLTExecutable enthält die Sequenz den Dokumentknoten des primären Auswertungsergebnisses des Style-Sheets, sofern vorhanden.
Die Interfaces XSLTExecutable und XQueryExecutable definieren darüber hinaus Ausführungsmethoden, die eine Instanz des Interface javax.xml.transform.Result akzeptieren. Da von Ihrer Anwendung bereitgestellte Ergebnisobjekt enthält im Falle des Interface XSKTExecutable das primäre Auswertungsergebnis des Style-Sheets und im Falle von XQueryExecutable das Auswertungsergebnis Ihrer Abfrage.
Im folgenden Beispiel wird im Ergebnis einer Transformation eine DOM-Struktur erzeugt. Die Struktur wird in der Instanz der DOMResult-Klasse gespeichert, die als Argument an die Methode XSLTExecutable.execute übergeben wird.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();
Im folgenden Beispiel wird als Ergebnis einer Transformation eine Instanz des Interface XSequenceCursor erzeugt.XFactory factory = XFactory.newInstance(); XSLTExecutable style = factory.prepareXSLT(new StreamSource("style.xsl")); XSequenceCursor xformResult = style.execute(new StreamSource("purchase.xml"));
- Verwenden Sie XResultResolver und XSLT.
Ein XSLT-2.0-Style-Sheet kann mithilfe der Anweisung xsl:result-document mehrere Ergebnisdokumente erzeugen. Das primäre Ergebnis der Transformation wird für jede vom Style-Sheet konstruierte Ergebnisstruktur erzeugt, die nicht in einer Anweisung xsl:result-document enthalten ist oder die in einer Anweisung xsl:result-document enthalten ist, deren Attribut href eine Zeichenfolge der Länge null als effektiven Wert hat. Das primäre Ergebnis wird wie zuvor beschrieben auf verschiedenen Wegen an Ihre Anwendung zurückgegeben.
Falls Ihr Style-Sheet eine Anweisung xsl:result-document auswertet, deren Attribut href nicht auf eine Zeichenfolge der Länge null gesetzt ist, wird das Ergebnis standardmäßig in einen Ausgabedatenstrom geschrieben. Der URI des Ausgabedatenstroms wird durch Auflösung des effektiven Wertes des Attributs href anhand der Einstellung für den Basisausgabe-URI im dynamischen Kontext bestimmt.
Sie können dieses Standardverhalten außer Kraft setzen, indem Sie für den XDynamicContext, den Sie für die Transformation verwenden, eine Instanz des Interface XResultResolver angeben. Die Methode getResult des Interface XResultResolver wird aufgerufen, wenn eine Anweisung xsl:result-document aufgerufen wird. Das Ergebnis des Methode getResult ist eine Instanz des Result-Interface, an die das Ergebnis der Anweisung xsl:result-document weitergeleitet wird. Wenn Ihre Anwendung das Interface XResultResolver verwendet, kann sie von Fall zu Fall entscheiden, wohin das Ergebnis aller Anweisungen xsl:result-document in Ihren Style-Sheets weitergeleitet werden soll. Falls Ihre Anwendung für das primäre Ergebnis der Ausführungsmethode des Interface XSLTExecutable keine Instanz des Result-Interface angegeben hat, wird für das primäre Ergebnis außerdem die Methode getResult von XResultResolver aufgerufen.
Gibt die Methode getResult von XResultResolver eine Nullreferenz zurück, wird für dieses konkrete Ergebnis das Standardverhalten wiederhergestellt. Das Ergebnis wird also im Falle des sekundären Ergebnisses in einen Ausgabedatenstrom geschrieben oder im Falle des primären Ergebnisses als Ergebnis der Ausführungsmethode in Form einer Instanz des Interface XSequenceCursor zurückgegeben.
Im folgenden Beispiel wird eine Instanz des Interface XResultResolver verwendet, um alle von einem Style-Sheet als Instanzen der Klasse XSequenceCursorResult in der Variablen allResults erzeugten Ergebnisse zu erfassen. Die Anwendung könnte anschließend mit der Methode XSequenceCursorResult.getSequenceCursor() die in jeder Instanz der XSequenceCursorResult-Klasse enthaltene Instanz des Interface XSequenceCursor extrahieren.
final ArrayList<XSequenceCursorResult> allResults = new ArrayList<XSequenceCursorResult>(); XFactory factory = XFactory.newInstance(); XDynamicContext context = factory.newDynamicContext(); // XResultResolver erstellen, um alle Instanzen von XSequenceCursorResult // in allResults zu speichern 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); // Alle Ergebnisse, auch das primäre Ergebnis, sind jetzt in der Variablen allResults verfügbar.


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