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

Mit der Methode setSchemaResolver der XFactory-Klasse können Sie einen Schema-Resolver registrieren.

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

Das folgende Basisbeispiel zeigt die Verwendung eines Schema-Resolvers.
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);
Das folgende Basisbeispiel zeigt eine XSchemaResolver-Implementierung.
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;
    }
}

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_resolvers_schema
Dateiname:txml_resolvers_schema.html