Ergebnis-Resolver während der Ausführung verwenden
Wenn Sie in der Ausführungszeit einen Ergebnis-Resolver angeben, können Sie dem Prozessor mitteilen, wie im ausführbaren Objekt angegebene Ausgabe-URIs umgeleitet werden sollen.
Vorgehensweise
Registrieren Sie den Ergebnis-Resolver im dynamischen Kontext, bevor Sie
execute() aufrufen, um den Resolver zu aktivieren.
Ergebnis-Resolver führen im Wesentlichen die gleiche Funktion wie Quellen-Resolver aus, allerdings auf der Ausgabeseite des Prozessors. Mit Ergebnis-Resolvern können Sie im ausführbaren Objekt angegebene Ausgabe-URIs abfangen und umleiten, z. B. die Anweisungen xsl:result-document in einem Style-Sheet.
Standardmäßig werden Ergebnisdokumente unter Verwendung des Basisausgabe-URI aufgelöst, wenn die URI-Referenz relativ ist. Absolute URIs werden unverändert verwendet.
Das folgende Basisbeispiel zeigt einen Ergebnis-Resolver.
class AResultResolver implements XResultResolver
{
String _replacementBase;
public AResultResolver(String replacementBase)
{
_replacementBase=replacementBase;
}
// Ressource als XSLT-Style-Sheet laden und auswerten, um URIs
// aufzulösen. Ergebnis als zu verwendende Quelle zurückgeben.
public Result getResult(String href, String base) {
String rebasePrefix="rebase://";
if(href.startsWith(rebasePrefix))
{
href=href.substring(rebasePrefix.length());
base=_replacementBase;
}
java.net.URI baseURI;
Result result=null;
try {
// Basis-URI-Objekt abrufen
baseURI = new java.net.URI(base);
// Relativer Bezug zum Basis-URI aufgelöst
URI resolvedURI = baseURI.resolve(href);
// Leseversuch...
result = new StreamResult(resolvedURI.toString());
} catch (java.net.URISyntaxException use) {
throw new RuntimeException(use);
}
return result;
}
}
Das folgende Basisbeispiel zeigt die Registrierung und Verwendung des Resolvers.
XFactory factory = XFactory.newInstance();
XStaticContext staticContext = factory.newStaticContext();
// Style-Sheet vorbereiten
XSLTExecutable executable = factory.prepareXSLT(new StreamSource(stylesheetFile), staticContext);
XDynamicContext dynamicContext = factory.newDynamicContext();
// Ergebnis-Resolver im dynamischen Kontext registrieren
XResultResolver resultResolver=new AResultResolver(replacementBase);
dynamicContext.setResultResolver(resultResolver);
// XPath-Ausdruck ausführen
XSequenceCursor cursor = executable.execute(new StreamSource(inputFile), dynamicContext);