In Abfragen deklarierte externe Funktionen mit XQuery verwenden
Ale Alternative zur Bindung von Java™-Methoden an Funktionen in einer Abfrage über die API können externe Java-Funktionen direkt in einer Abfrage deklariert werden. Die einzige zusätzlich erforderliche Konfiguration ist, dass während der Abfrageausführung gebundene Java-Klassen im Klassenpfad vorhanden sind.
Vorgehensweise
declare option xltxe:java-extension "Präfix = Klassenname";
Präfix:Methodenname(Parameter*)
Beispiel
Statische Methoden aufrufen
declare namespace calc="http://com.example/myApp/Calculator";
declare namespace sf="http://com.example/myApp/standardFormat";
declare namespace xltxe="http://www.ibm.com/xmlns/prod/xltxe-j";
declare option xltxe:java-extension "calc = org.company.Calculator";
declare option xltxe:java-extension "sf = org.standards.Formatter";
sf:format(calc:sqrt(64), "ISO-42.7")
// Factory erstellen
XFactory factory = XFactory.newInstance();
// Ausführbares XQuery-Objekt für die Abfrage erstellen
XQueryExecutable executable = factory.prepareXQuery(xquerySource);
// Ergebnisobjekt zum Speichern des Umsetzungsergebnisses erstellen
Result result = new StreamResult(System.out);
// Ausführbare XSLT-Datei ausführen
XSequenceCursor xsc = executable.execute();
// Ergebnis ausgeben
xsc.exportSequence(res);
In der bereitgestellten Beispielabfrage wird angenommen, dass die Klasse "org.company.Calculator" eine statische Methode "sqrt()" enthält, die einen Parameter akzeptiert, und dass die Klasse "org.standards.Formatter" eine statische Methode "format()" enthält, die zwei Parameter akzeptiert. Während der Vorbereitung sind die Klassen im Klassenpfad nicht erforderlich. Während der Ausführung der Abfrage müssen die Klassen jedoch vorhanden sein.
package org.company;
public class Calculator {
public static int sqrt(int val) {
return (int)Math.sqrt(val);
}
package org.standards;
public class Formatter {
public static String format(int val, String pattern) {
return "Formatting " + val + " using pattern " + pattern;
}
}
Instanzdefinitionsmethoden aufrufen
Präfix:new(Params*)
declare namespace car="http://com.example/myApp/car";
declare namespace xltxe="http://www.ibm.com/xmlns/prod/xltxe-j";
declare option xltxe:java-extension "car = org.automobile.Car";
declare variable $var := car:new(3);
car:getDoors($var)
// Factory erstellen
XFactory factory = XFactory.newInstance();
// Ausführbares XQuery-Objekt für die Abfrage erstellen
XQueryExecutable executable = factory.prepareXQuery(xquerySource);
// Ergebnisobjekt zum Speichern des Umsetzungsergebnisses erstellen
Result result = new StreamResult(System.out);
// Ausführbare XSLT-Datei ausführen
XSequenceCursor xsc = executable.execute();
// Ergebnis ausgeben
xsc.exportSequence(res);
Die Beispielabfrage setzt voraus, dass die Klasse "org.automobile.Car" einen Konstruktor enthält, der ein Argument des Typs "int" akzeptiert. Außerdem enthält die Klasse "org.automobile.Car" eine Instanzdefinitionsmethode "getDoors()", die keine Argumente akzeptiert. Die Syntax für den Aufruf von Instanzdefinitionsmethoden über externe Funktionen, die in einer Abfrage deklariert sind, erfordert, dass das erstellte Instanzobjekt als erstes Argument übergeben wird.
package org.automobile;
public class Car {
private int doors;
public Car (int doors) {
this.doors = doors;
}
public int getDoors() {
return doors;
}
}
declare namespace car="http://com.example/myApp/car";
declare namespace sedan="http://com.example/myApp/sedan";
declare namespace xltxe="http://www.ibm.com/xmlns/prod/xltxe-j";
declare option xltxe:java-extension "car = org.automobile.Car";
declare option xltxe:java-extension "sedan = org.automobile.Sedan";
declare variable $var := sedan:new(5);
car:getDoors($var)
package org.automobile;
public class Sedan extends Car {
public Sedan (int doors) {
super(doors);
}
}