Externe Funktionen mit XPath verwenden
Wenn Sie mit einem XPath-Ausdruck arbeiten, der externe Funktionen verwendet, deklarieren Sie die Funktionssignaturen mit einer XStaticContext-Instanz. Verwenden Sie außerdem für jede Funktion eine XDynamicContext-Instanz, um eine Java-Implementierung bereitzustellen (bzw. zu binden).
Vorgehensweise
- Wenn Sie einen XPath-Ausdruck erstellen, der externe Funktionen verwendet, deklarieren Sie die Funktionssignaturen mit einer
XStaticContext-Instanz.
Das Interface XStaticContext stellt zwei declareFunction-Methoden mit jeweils drei Parametern bereit, einem Parameter für den Namen, einem für den Rückgabetyp der Funktion und einem für ein Array mit den Typen der Argumente. Der Name wird immer als ein QName-Objekt angegeben. Der Typ kann jedoch ein QName oder XSequenceType sein. Der Funktionsname, der Rückgabetyp und die Argumenttypen müssen eine eindeutige Identifizierung der Funktion ermöglichen.
Tabelle 1. declareFunction-Methoden von XStaticContext. In der folgenden Tabelle ist die Verwendung der einzelnen Varianten der Methode declareFunction erläutert.
Methodensignatur Zweck declareFunction(QName name, QName type, QName[] argTypes) Verwendung, wenn der Rückgabewert und die Argumente der Funktion ausschließlich einzelne atomare Werte sind QNames für die Typen müssen auf integrierte Typen verweisen oder auf globale Typen, die in einem Schema deklariert sind, das in der für die Erstellung der XStaticContext-Instanz verwendeten XFactory-Instanz registriert ist. Wenn ein QName auf einen nicht atomaren Typ verweist, behandelt der Prozessor ihn so, als wäre er vom Typ element(*, ns:type). Hier steht ns:type für den gegebenen QName. In der Schnittstelle "XTypeConstants" sind komfortable Konstanten verfügbar, die für jeden integrierten Typ ein QName-Objekt bereitstellen.
declareFunction(QName name, XSequenceType type, XSequenceType[] argTypes) Verwendung, wenn eines der Argumente oder der Rückgabewert der Funktion ein Knoten oder eine Sequenz atomarer Werte bzw. Knoten ist Das folgende Beispiel zeigt die Vorbereitung eines XPath-Ausdrucks, der eine externe Funktion verwendet.// Factory erstellen XFactory factory = XFactory.newInstance(); // Neuen statischen Kontext erstellen XStaticContext staticContext = factory.newStaticContext(); // Namespace für die Funktion deklarieren staticContext.declareNamespace("my", "http://myfunc"); // QName für den Namen der Funktion erstellen QName methodQName = new QName("http://myfunc", "pow"); // Funktion im statischen Kontext deklarieren staticContext.declareFunction(methodQName, XTypeConstants.DOUBLE_QNAME, new QName[]{XTypeConstants.DOUBLE_QNAME, XTypeConstants.DOUBLE_QNAME}); // Ausführbares XPath-Objekt für den Ausdruck erstellen XPathExecutable executable = factory.prepareXPath("sum(/polynomial/term/(my:pow(2, @power) * @coefficient))", staticContext);
- Wenn Sie einen XPath-Ausdruck ausführen, der externe Funktionen verwendet, geben Sie
mit einer XDynamicContext-Instanz die Java-Methoden an, die die Funktionen implementieren, bzw. binden Sie diese Java-Methoden mit der genannten Instanz.
Verwenden Sie die Java-Darstellung, um ein Objekt java.lang.reflect.Method für die Funktion zu erhalten. Handelt es sich bei der Methode um eine Instanzmethode, ist zum Binden dieser Funktion ein Instanzobjekt erforderlich.
Ist für eine bei Ausführung des XPath-Ausdrucks verwendete Funktion keine Java-Methode angegeben, tritt ein Fehler auf.
XDynamicContext stellt zwei bindFunction-Methoden bereit. Jede dieser Methoden erfordert ein QName-Objekt, das dem Namen der Funktion entspricht, und ein Methodenobjekt, das die Java-Methode bezeichnet, die die Implementierung der Funktion zur Verfügung stellt.Tabelle 2. bindFunction-Methoden von XDynamicContext. In der folgenden Tabelle ist die Verwendung der einzelnen Varianten der bindFunction-Methoden von XDynamicContext erläutert.
Methodenname Zweck bindFunction(QName qname, Method method) Verwendung, wenn eine statische Methode gebunden werden soll bindFunction(QName qname, Method method, Object instanceObject) Verwendung, wenn eine Instanzmethode gebunden werden soll Im folgenden Beispiel wird der im ersten Beispiel vorbereitete XPath-Ausdruck ausgeführt. Dabei wird zunächst eine Methode für die verwendete Funktion gebunden. In diesem Beispiel wird mit der statischen Methode pow(double a, double b) der Klasse java.lang.Math die Implementierung für die externe Funktion bereitgestellt.// Neuen dynamischen Kontext erstellen XDynamicContext dynamicContext = factory.newDynamicContext(); // Objekt java.lang.reflect.Method für diese Funktion abrufen Method method = Math.class.getMethod("pow", Double.TYPE, Double.TYPE); // Funktion an den dynamischen Kontext binden dynamicContext.bindFunction(methodQName, method); // XML-Eingabedokument erstellen String xml = "<polynomial>" + "<term power='2' coefficient='3'/>" + "<term power='1' coefficient='-2'/>" + "<term power='0' coefficient='1'/>" + "</polynomial>"; StreamSource source = new StreamSource(new StringReader(xml)); // Ausdruck ausführen XSequenceCursor result = executable.execute(source, dynamicContext); // Ergebnis in System.out serialisieren result.exportItem(new StreamResult(System.out));


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