Externe Variablen mit XQuery verwenden
Wenn Sie einen XQuery-Ausdruck mit externen Variablen verwenden, geben Sie mit einer XDynamicContext-Instanz supply-Werte (oder bind-Werte) für alle Variablen an und deklarieren Sie bei Bedarf die Variablentypen mit einer XStaticContext-Instanz.
Vorgehensweise
- Wenn Sie einen XQuery-Ausdruck erstellen, der externe Variablen verwendet,
deklarieren Sie die Variablentypen
mit einer
XStaticContext-Instanz.
In XStaticContext deklarierte Variablen sind nur für das Hauptmodul sichtbar. Wenn Sie eine externe Variable für ein Bibliotheksmodul sichtbar machen möchten, muss die Variable im Prolog des Bibliotheksmodul mit einer externen Variablendeklaration deklariert werden.
Die Deklaration der Variablen in XStaticContext ist optional. Wird eine Variable nicht deklariert, nimmt der Prozessor für diese Variable den Typ item()* an. Der Wert der Variablen kann somit eine Sequenz beliebiger Länge sein, die aus Elementen eines beliebigen Typs besteht. Wenn Sie für Ihre Variablen einen Typ deklarieren, kann der Prozessor während der Vorbereitung einige Syntaxfehler leichter statisch feststellen.
Das Interface XStaticContext stellt zwei declareVariable-Methoden mit jeweils zwei Parametern bereit, einem Parameter für den Namen und einem für den Typ der Variablen. Der Name wird immer als ein QName-Objekt angegeben. Der Typ kann jedoch ein QName oder XSequenceType sein.Tabelle 1. declareVariable-Methoden von XStaticContext. In der folgenden Tabelle ist die Verwendung der einzelnen Varianten der Methode declareVariable erläutert.
Methodensignatur Zweck declareVariable(QName name, QName type) Verwendung, wenn die Variable einen einzelnen atomaren Wert hat Der QName muss auf einen integrierten Typ verweisen oder einen globalen Typ, der in einem Schema deklariert ist, das in der für die Erstellung der XStaticContext-Instanz verwendeten XFactory-Instanz registriert ist. Wenn der 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. Im Interface XTypeConstants sind komfortable Konstanten verfügbar, die für jeden integrierten Typ ein QName-Objekt bereitstellen.
declareVariable(QName name, XSequenceType type) Verwendung, wenn die Variable ein einzelner Knoten oder eine Sequenz atomarer Werte bzw. Knoten ist XQuery erlaubt auch die Deklaration von Variablen im Prolog eines XQuery-Ausdrucks. Der folgende XQuery-Ausdruck verwendet zwei Variablen, von denen eine im Prolog deklariert ist und die andere nicht.
Die Variable, die nicht im eigentlichen XQuery-Ausdruck deklariert ist, kann optional mit einer XStaticContext-Instanz deklariert werden, um die Typinformation für den Prozessor anzugeben.declare namespace xs = "http://www.w3.org/2001/XMLSchema"; declare variable $searchTerms as xs:string+ external; <table> <tr><td>Title</td><td>Author</td></tr> { for $book in /library/book let $value := $book/@*[local-name()=$searchField] where exists(for $term in $searchTerms return if (contains($value, $term)) then true() else ()) return <tr> <td>{ string($book/@title) }</td> <td>{ string($book/@author) }</td> </tr> } </table>
Das folgende Beispiel veranschaulicht die Erstellung des obigen XQuery-Ausdrucks unter Angabe eines Typs für die Variable, die nicht im eigentlichen XQuery-Ausdruck deklariert ist. Es wird vorausgesetzt, dass mit dem Quellenobjekt xquerySource auf den Ausdruck zugegriffen werden kann.// Factory erstellen XFactory factory = XFactory.newInstance(); // Neuen statischen Kontext aus der Factory erstellen XStaticContext staticContext = factory.newStaticContext(); // QName für den Namen der zu deklarierenden Variablen definieren final QName searchField = new QName("searchField"); // Variable mit der Bezeichnung "searchField" als xs:string deklarieren staticContext.declareVariable(searchField, XTypeConstants.STRING_QNAME); // XQuery-Ausdruck erstellen XQueryExecutable xquery = factory.prepareXQuery(xquerySource, staticContext);
- Wenn Sie einen XQuery-Ausdruck ausführen, der externe Variablen verwendet, geben Sie
mit einer XDynamicContext-Instanz supply-Werte (oder bind-Werte) für alle Variablen an.
Die Bindungen für externe Variablen stehen dem Hauptmodul und allen Bibliotheksmodulen zur Verfügung, die eine Deklaration für diese Variable in ihrem Prolog enthalten.
Ist für eine bei Ausführung des XQuery-Ausdrucks verwendete Variable kein Wert angegeben, tritt ein Fehler auf.
Der XDynamicContext stellt eine Reihe von bind-, bindItem- und bindSequence-Methoden bereit. Jede dieser Methoden hat zwei Parameter, von denen der erste ein QName-Objekt für den Namen des Parameters und der zweite der Wert ist.Tabelle 2. bind-, bindItem- und bindSequence-Methoden von XDynamicContext. In der folgenden Tabelle ist die Verwendung der einzelnen Varianten der bind-, bindItem- und bindSequence-Methoden von XDynamicContext erläutert.
Methode Zweck bind Verwendung, wenn ein einzelner atomarer Wert gebunden werden soll Für jeden Java-Typ, der in der Standardzuordnung von integrierten Typen zu Java™-Typen verwendet wird, gibt es eine Variante dieser Methode. Darüber hinaus gibt es zwei Varianten, von denen eine einen Knoten und die andere eine Quelle verwendet. Diese Varianten werden zum einen für die Bindung eines beliebigen Knotens aus einer DOM-Struktur verwendet und zum anderen für die Syntaxanalyse einer neuen Quelle, um einen Dokumentknoten zu erhalten.
bindItem Verwendung, wenn ein einzelnes Element als XItemView-Objekt gebunden werden soll Ein XItemView-Objekt kann aus dem Ergebnis der Ausführung eines anderen Ausdrucks angefordert oder mit einer XItemFactory-Instanz konstruiert werden.
bindSequence Verwendung, wenn Sequenzen mit weniger oder mehr als einem Element gebunden werden sollen Für jeden Java-Typ, der in der Standardzuordnung von integrierten Typen zu Java-Typen verwendet wird, gibt es eine Variante dieser Methode, die jeweils ein Array mit Werten des gegebenen Typs akzeptiert.
Es gibt noch eine weitere Variante, die einen XSequenceCursor verwendet. Ein XSequenceCursor kann das Ergebnis der Ausführung eines anderen Ausdrucks sein oder mit einer XItemFactory-Instanz konstruiert werden.
Im folgenden Beispiel wird der im ersten Beispiel erstellte XQuery-Ausdruck ausgeführt. Dabei werden zunächst die Werte für jede verwendete Variable gebunden.// Neuen dynamischen Kontext aus der Factory erstellen XDynamicContext dynamicContext = factory.newDynamicContext(); // Atomaren Wert für die Variable "searchField" binden dynamicContext.bind(searchField, "title"); // Sequenz atomarer Werte für die Variable "searchTerms" binden dynamicContext.bindSequence(new QName("searchTerms"), new String[] {"Lost", "Gables"}); // XML-Eingabedokument erstellen String xml = "<library>" + "<book title='Lost in the Barrens' author='Farley Mowat'/>" + "<book title='Anne of Green Gables' author='L. M. Montgomery'/>" + "</library>"; StreamSource source = new StreamSource(new StringReader(xml)); // Ausdruck ausführen XSequenceCursor result = xquery.execute(source, dynamicContext);


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