Resolver für nicht analysierten Text verwenden
Das Interface XUnparsedTextResolver kann implementiert und die Implementierung dann im XDynamicContext registriert werden, um das Standardauflösungsverhalten für Ressourcen außer Kraft zu setzen, die mit der XSLT-Funktion unparsed-text geladen werden.
Informationen zu diesem Vorgang
Für Ressourcen, die mit der XSLT-Funktion unparsed-text geladen werden, werden standardmäßig relative URIs ausgehend vom Basis-URI aus dem statischen Kontext aufgelöst. Wenn der Basis-URI nicht verfügbar ist, wird das aktuelle Arbeitsverzeichnis verwendet. Absolute URIs werden unverändert verwendet.
Vorgehensweise
Verwenden Sie zum Registrieren eines Resolvers für nicht analysierten Text die Methode setUnparsedTextResolver des Interface XDynamicContext.
Beispiel
Das folgende Basisbeispiel zeigt die Verwendung eines Resolvers für nicht analysierten Text.
XFactory factory = XFactory.newInstance();
// Style-Sheet vorbereiten
XSLTExecutable executable = factory.prepareXSLT(new StreamSource(stylesheetFile));
// Dynamischen Kontext erstellen und Resolver für nicht analysierten Text definieren
XDynamicContext dynamicContext = factory.newDynamicContext();
AnUnparsedTextResolver resolver = new AnUnparsedTextResolver(replacementBase);
dynamicContext.setUnparsedTextResolver(resolver);
// Transformation ausführen
Source source = new StreamSource(inputFile);
Result result = new StreamResult(System.out);
executable.execute(source, dynamicContext, result);
Das folgende Basisbeispiel zeigt die Implementierung eines Resolvers für nicht analysierten Text.
class AnUnparsedTextResolver implements XUnparsedTextResolver
{
String _replacementBase;
public AnUnparsedTextResolver(String replacementBase)
{
_replacementBase=replacementBase;
}
// URI auflösen und vom URI repräsentierte Ressource zurückgeben
// Pseudoschema "rebase:" wird implementiert
public String getResource(String href, String encoding, String base) {
String rebasePrefix="rebase:";
if (href.startsWith(rebasePrefix)) {
href = href.substring(rebasePrefix.length());
base = _replacementBase;
}
try {
// Basis-URI-Objekt abrufen
URI uri = new java.net.URI(base);
// Relativer Bezug zum Basis-URI aufgelöst
URI resolvedURI = uri.resolve(href);
// Leseversuch...
URL url = resolvedURI.toURL();
URLConnection urlCon = url.openConnection();
BufferedInputStream stream = new BufferedInputStream(urlCon.getInputStream());
StringBuffer buffer = new StringBuffer();
int s;
while ((s = stream.read())!= -1) {
// Hier beliebige Zeichenbearbeitung vornehmen
buffer.append((char)s);
}
return buffer.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}