Utilisation d'un programme de résolution de module
L'interface XModuleResolver peut être implémentée et l'implémentation enregistrée avec l'élément XStaticContext pour remplacer le comportement de résolution de module XQuery par défaut. Les modules sont résolus lorsqu'une importation de module XQuery a lieu.
Pourquoi et quand exécuter cette tâche
Le comportement de résolution du module par défaut consiste à tenter de rechercher un module pour chaque paramètre d'emplacement spécifié dans l'importation de module. Le comportement du programme de résolution par défaut pour chaque paramètre d'emplacement consiste à résoudre les URI relatifs à l'URI de base à partir du contexte statique, si l'URI de base est disponible ou à les interpréter en tant que chemins de fichier relatifs au répertoire de travail en cours si l'URI de base n'est pas disponible. Les URI absolus sont utilisés tels quels. S'il n'est pas possible de trouver de module pour un paramètre d'emplacement, le processus l'ignore tant qu'il n'est pas possible de charger de module pour l'espace de nom. Dans ce cas, le processeur émet un message d'erreur.
Procédure
La méthode getModule renvoie une instance de l'interface java.util.List. Cela est dû fait fait qu'il peut exister plusieurs documents de module pour un espace de nom particulier et un ensemble de paramètres d'emplacement.
Exemple
XFactory factory = XFactory.newInstance();
// Create the static context
XStaticContext staticContext = factory.newStaticContext();
// Create the module resolver and register it with the static context.
staticContext.setModuleResolver(new AModuleResolver(replacementBase));
// Prepare the query.
XQueryExecutable executable = factory.prepareXQuery(new StreamSource(queryFile), staticContext);
// Execute the transformation.
Source source = new StreamSource(inputFile);
Result result = new StreamResult(System.out);
executable.execute(source, result);
class AModuleResolver implements XModuleResolver
{
String _replacementBase;
public AModuleResolver(String replacementBase)
{
_replacementBase=replacementBase;
}
// Resolve URI, returning the Source that URI represents.
// Implements the "rebase:" pseudo-scheme.
public List<? extends Source> getModule(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;
}
}