Utilización de un solucionador de resultados en el tiempo de ejecución
Especificando un solucionador de resultados en el tiempo de ejecución, puede indicar al procesador cómo redirigir los URI de salida especificados en el ejecutable.
Procedimiento
Para activar un solucionador de resultados, regístrelo con el contexto dinámico antes de invocar a
execute().
Los solucionadores de resultados llevan a cabo esencialmente la misma función que los solucionadores de origen, pero en la parte de la salida del procesador. Le permiten interceptar y redirigir los URI de salida especificados en el ejecutable, como por ejemplo las directrices xsl:result-document en una hoja de estilo.
El comportamiento de resolución predeterminado es utilizar el URI de salida de base para resolver documentos de resultado si la referencia al URI es relativa. Los URI absolutos se utilizan sin modificar.
A continuación encontrará un ejemplo básico de un solucionador de resultados.
class AResultResolver implements XResultResolver
{
String _replacementBase;
public AResultResolver(String replacementBase)
{
_replacementBase=replacementBase;
}
// Resolve URIs by loading the resource as an XSLT stylesheet
// and evaluating it - return the result as the Source to use
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 {
// Get base URI object
baseURI = new java.net.URI(base);
// Resolved relative reference against base URI
URI resolvedURI = baseURI.resolve(href);
// Try to read...
result = new StreamResult(resolvedURI.toString());
} catch (java.net.URISyntaxException use) {
throw new RuntimeException(use);
}
return result;
}
}
A continuación encontrará un ejemplo básico de cómo registrar y utilizar el solucionador.
XFactory factory = XFactory.newInstance();
XStaticContext staticContext = factory.newStaticContext();
// Prepare the stylesheet
XSLTExecutable executable = factory.prepareXSLT(new StreamSource(stylesheetFile), staticContext);
XDynamicContext dynamicContext = factory.newDynamicContext();
// Register the result resolver with the dynamic context
XResultResolver resultResolver=new AResultResolver(replacementBase);
dynamicContext.setResultResolver(resultResolver);
// Execute the XPath expression
XSequenceCursor cursor = executable.execute(new StreamSource(inputFile), dynamicContext);