Schema-Resolver registrieren
Das Interface XSchemaResolver kann implementiert und die Implementierung dann in der XFactory registriert werden, um das Standardauflösungsverhalten für Schemata außer Kraft zu setzen. Dies gilt auch für die Auflösung von Importen für Schemata, die mit der Methode registerSchema in der XFactory registriert wurden, und für die Auflösung von Schemata, die mit der Deklaration xsl:import-schema in XSLT-Style-Sheets importiert wurden.
Informationen zu diesem Vorgang
Bei Importen innerhalb eines Schemas wird standardmäßig der Basis-URI des Schemas verwendet, um die Position des importierten Schemas aufzulösen. Bei XSLT-Schemaimporten wird standardmäßig der Basis-URI der Deklaration xsl:import-schema verwendet, um die in der Deklaration angegebene Position aufzulösen.
Vorgehensweise
Die Methode getSchema gibt eine Instanz des Interface java.util.List zurück, weil die Definitionen der Schemakomponenten für einen bestimmten Namespace auf mehrere eigenständige Schemadokumente verteilt werden können. Mit der Methode getSchema können Sie alle Schemadokumente für den Zielnamespace zurückgeben, der allen angegebenen Positionshinweisen zugeordnet ist.
Beispiel
XFactory factory = XFactory.newInstance();
// Validating auf true setzen
factory.setValidating(true);
// Schema-Resolver erstellen und in der Factory registrieren
factory.setSchemaResolver(new ASchemaResolver(replacementBase));
// Style-Sheet vorbereiten
XSLTExecutable executable = factory.prepareXSLT(new StreamSource(stylesheetFile));
// Transformation ausführen
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;
}
// URI auflösen und vom URI repräsentierte Quelle zurückgeben
// Pseudoschema "rebase:" wird implementiert
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 {
// 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;
}
}