Modul-Resolver verwenden
Die Schnittstelle "XModuleResolver" kann implementiert und die Implementierung bei XStaticContext registriert werden, um das Standardverhalten für die Auflösung von XQuery-Modulen zu überschreiben. Module werden aufgelöst, wenn ein XQuery-Modulimport gefunden wird.
Informationen zu diesem Vorgang
Standardmäßig wird bei der Modulauflösung versucht, ein Modul für jeden im Modulimport angegebenen Hinweis zu finden. Bei der Standardauflösung wird versucht, für jeden Positionshinweis relative URIs mithilfe des Basis-URL, sofern verfügbar, aus dem statischen Inhalt aufzulösen. Falls kein Basis-URL verfügbar ist, wird versucht, die relativen URIs als Dateipfade relativ zum aktuellen Arbeitsverzeichnis aufzulösen. Absolute URIs werden unverändert verwendet. Wenn für einen Positionhinweis kein Modul gefunden wird, ignoriert der Prozessor das Modul, sofern nicht der Fall eintritt, dass keine Module für den Namespace geladen werden können. In diesem Fall gibt der Prozessore eine Fehlernachricht aus.
Vorgehensweise
Die Methode "getModule" gibt eine Instanz der Schnittstelle "java.util.List" zurück. Dies kann darauf zurückzuführen sein, dass es mehrere Moduldokumente für einen bestimmten Namespace und mehrere Gruppen von Positionshinweisen gibt.
Beispiel
XFactory factory = XFactory.newInstance();
// Statischen Kontext erstellen
XStaticContext staticContext = factory.newStaticContext();
// Modul-Resolver erstellen und im statischen Kontext registrieren
staticContext.setModuleResolver(new AModuleResolver(replacementBase));
// Abfrage vorbereiten
XQueryExecutable executable = factory.prepareXQuery(new StreamSource(queryFile), staticContext);
// Transformation ausführen
Source source = new StreamSource(inputFile);
Result result = new StreamResult(System.out);
executable.execute(source, result);
class AModuleResolver implements XModuleResolver
{
String _replacementBase;
public AModuleResolver(String replacementBase)
{
_replacementBase=replacementBase;
}
// URI auflösen und vom URI repräsentierte Quelle zurückgeben
// Pseudoschema "rebase:" wird implementiert
public List<? extends Source> getModule(String namespace, List<String> locations, String baseURI) {
String rebasePrefix="rebase:";
List<StreamSource> list = new ArrayList<StreamSource>();
for (int i = 0; i < locations.size(); i++) {
String href = locations.get(i);
String base = baseURI;
if(href.startsWith(rebasePrefix)) {
href=href.substring(rebasePrefix.length());
base=_replacementBase;
}
java.net.URI uri;
StreamSource source=null;
try {
// Basis-URI-Objekt abrufen
uri = new java.net.URI(base);
// Relativer Bezug zum Basis-URI aufgelöst
URI resolvedURI = uri.resolve(href);
// Leseversuch...
source = new StreamSource(resolvedURI.toString());
} catch (java.net.URISyntaxException use) {
throw new RuntimeException(use);
}
list.add(source);
}
return list;
}
}