Registro de un solucionador de esquemas
La interfaz XSchemaResolver se puede implementar y la implementación se puede registrar con XFactory para sustituir el comportamiento de resolución de esquemas predeterminado. Esta acción incluye la resolución de importaciones de esquemas registrados con XFactory utilizando el método registerSchema y resolviendo esquemas importados en hojas de estilo XSLT utilizando la declaración xsl:import-schema.
Acerca de esta tarea
El comportamiento predeterminado para resolver importaciones en un esquema es utilizar el URI base del esquema para resolver la ubicación de los esquemas importados. El comportamiento predeterminado para las importaciones de esquemas XSLT es utilizar el URI base de la declaración xsl:import-schema para resolver la ubicación especificada en la declaración.
Procedimiento
El método getSchema devuelve una instancia de la interfaz java.util.List. Esto es así porque las definiciones de los componentes del esquema de un determinado espacio de nombres se pueden dividir en diversos documentos de esquema distintos. Puede utilizar el método getSchema para devolver todos los documentos de esquemas de un espacio de nombres de destino determinado asociado a todas sugerencias de ubicación especificadas.
Ejemplo
XFactory factory = XFactory.newInstance();
// Set validating to true.
factory.setValidating(true);
// Create the schema resolver and register it with the factory.
factory.setSchemaResolver(new ASchemaResolver(replacementBase));
// Prepare the stylesheet.
XSLTExecutable executable = factory.prepareXSLT(new StreamSource(stylesheetFile));
// Execute the transformation.
Source source = new StreamSource(inputFile);
Result result = new StreamResult(System.out);
executable.execute(source, result);
class ASchemaResolver implements XSchemaResolver
{
String _replacementBase;
public ASchemaResolver(String replacementBase)
{
_replacementBase=replacementBase;
}
// Resolve URI, returning the Source that URI represents.
// Implements the "rebase:" pseudo-scheme.
public List<? extends Source> getSchema(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 {
// Get base URI object
uri = new java.net.URI(base);
// Resolved relative reference against base URI
URI resolvedURI = uri.resolve(href);
// Try to read...
source = new StreamSource(resolvedURI.toString());
} catch (java.net.URISyntaxException use) {
throw new RuntimeException(use);
}
list.add(source);
}
return list;
}
}