Collection-Resolver registrieren
Sie können Implementierungen des Interface XCollectionResolver im XDynamicContext registrieren.
Vorgehensweise
Registrieren Sie einen Collection-Resolver beim dynamischen Kontext.
Die im XDynamicContext registrierte XCollectionResolver-Implementierung wird während der Ausführung verwendet, um die Gruppe der Knoten abzurufen, die dem in Aufrufen der Methode fn:collection angegebenen URI zugeordnet ist. Wenn im XDynamicContext kein Collection-Resolver registriert ist, führen Aufrufe von fn:collection zu einem behebbaren Fehler und als Gruppe wird die leere Sequenz verwendet.
Beachten Sie, dass der Collection-Resolver und die Funktion fn:collection nicht zur Auflösung von Dokument-URIs bestimmt sind. Für diesen Zweck sollten Sie den Quellen-Resolver und die Funktion fn:doc verwenden.
Beispiel
Das folgende Basisbeispiel zeigt die Verwendung eines Collection-Resolvers.
XFactory factory = XFactory.newInstance();
// XPath-Ausdruck erstellen
XPathExecutable executable = factory.prepareXPath("count(collection('typeA-typeB'))"
// Collection-Resolver im dynamischen Kontext registrieren
XCollectionResolver collectionResolver = new ACollectionResolver(factory);
XDynamicContext dynamicContext = factory.newDynamicContext();
dynamicContext.setCollectionResolver(collectionResolver);
// XPath-Ausdruck ausführen
XSequenceCursor cursor = executable.execute(dynamicContext);
Das folgende Basisbeispiel zeigt eine XCollectionResolver-Implementierung.
public class ACollectionResolver implements XCollectionResolver {
private XFactory m_factory;
public ACollectionResolver(XFactory factory) {
m_factory = factory;
}
public XSequenceCursor getCollection(String uri, String base) {
// Standardgruppe abrufen
if (uri.equals("")) {
return getCollection("default", base);
}
// Angeforderte Gruppe abrufen
ArrayList<XItemView> list = new ArrayList<XItemView>();
StringTokenizer tokenizer = new StringTokenizer(uri, "-");
XSequenceCursor cursor = null;
while (tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken();
XSequenceCursor temp = getNodes(new StreamSource("collections.xml"), "/doc/" + token);
if (cursor == null) {
cursor = temp;
} else {
cursor = cursor.append(temp);
}
}
return cursor;
}
private XSequenceCursor getNodes(Source source, String expression) {
XPathExecutable executable = m_factory.prepareXPath(expression);
XSequenceCursor cursor = executable.execute(source);
return cursor;
}
}