Externe Variablen mit XPath verwenden
Wenn Sie einen XPath-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 XPath-Ausdruck erstellen, der externe Variablen verwendet,
deklarieren Sie die Variablentypen
mit einer
XStaticContext-Instanz.
Dieser Schritt 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 Das folgende Beispiel zeigt die Vorbereitung eines XPath-Ausdrucks, der Variablen verwendet, von denen zwei im statischen Kontext deklariert sind und eine nicht deklariert ist.// Factory erstellen XFactory factory = XFactory.newInstance(); // Neuen statischen Kontext aus der Factory erstellen XStaticContext staticContext = factory.newStaticContext(); // QNames für die Namen der zu deklarierenden Variablen definieren final QName taxRate = new QName("taxRate"); final QName partNumbers = new QName("partNumbers"); // Variable mit der Bezeichnung "taxRate" als xs:float deklarieren staticContext.declareVariable(taxRate, XTypeConstants.FLOAT_QNAME); // Instanz von XSequenceTypeFactory aus der Factory anfordern XSequenceTypeFactory typeFactory = factory.getSequenceTypeFactory(); // Sequenztyp für eine Sequenz von xs:integer-Werten definieren XSequenceType integerSequence = typeFactory.atomic(XTypeConstants.INTEGER_QNAME, XSequenceType.OccurrenceIndicator.ZERO_OR_MORE); // Variable mit der Bezeichnung "partNumbers" als Sequenz von xs:integer-Werten deklarieren staticContext.declareVariable(partNumbers, integerSequence); // XPath-Ausdruck erstellen, der die deklarierten Variablen verwendet sowie die weitere Variable "discount", // von der der Prozessor annimmt, sie hätte den Typ item()* String expression = "sum(for $partNumber in $partNumbers return /inventory/part[@num=$partNumber]/@price) * (1 - $discount) * (1 + $taxRate)"; // XPath-Ausdruck erstellen XPathExecutable xpath = factory.prepareXPath(expression, staticContext);
- Wenn Sie einen XPath-Ausdruck ausführen, der externe Variablen verwendet, geben Sie
mit einer XDynamicContext-Instanz supply-Werte (oder bind-Werte) für alle Variablen an.
Ist für eine bei Ausführung des XPath-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 XPath-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 Variablen "taxRate" und "discount" binden dynamicContext.bind(taxRate, 0.13f); dynamicContext.bind(new QName("discount"), 0.40); // Sequenz atomarer Werte für die Variable "partNumbers" binden dynamicContext.bindSequence(partNumbers, new int[] {2, 1, 2, 3, 2}); // XML-Eingabedokument erstellen String xml = "<inventory>" + "<part num='1' price='9.99'/>" + "<part num='2' price='4.47'/>" + "<part num='3' price='12.99'/>" + "</inventory>"; StreamSource source = new StreamSource(new StringReader(xml)); // Ausdruck ausführen XSequenceCursor result = xpath.execute(source, dynamicContext);


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