Utilisation des programmes de résolution dans un contexte J2EE

Quand vous chargez des artefacts dans un environnement Java™ 2 Platform Enterprise Edition (J2EE), prenez en compte les aspects propres au chargement de ressources depuis des artefacts de déploiement locaux.

Pourquoi et quand exécuter cette tâche

Le chargement de ressources locales, à l'aide des méthodes Class.getResource et Class.getResourceAsStream, à partir d'artefacts de déploiement locaux J2EE tels que des fichiers EAR, WAR ou JAR, peut créer des incidents lors du chargement des artefacts XML associés. Vous pourrez charger sans incident une première ressource locale avec ces mécanismes, mais le chargement des artefacts associés à cette ressource initiale échouera le plus souvent si vous ne prenez pas certaines mesures.

L'exemple suivant montre comment charger des documents pendant l'exécution avec la fonction XPath fn:doc à partir d'une feuille de style. Dans ce cas, le comportement par défaut consiste à résoudre les documents sur la base de l'URI de base issu du contexte statique.
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
	<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
  
	<xsl:variable name="names" select="doc('names.xml')"/>
	
	<xsl:template name="loadnames">
		<xsl:copy-of select="$names"/>
	</xsl:template>
	
</xsl:stylesheet>
Voyons à présent un chargement avec le code Java suivant exécuté dans un environnement J2EE :
// create the factory
XFactory factory = XFactory.newInstance();

// load the XSLT file from a local resource within a J2EE deployment artifact
StreamSource source = new StreamSource(XSLTDocFunction.class.getResourceAsStream("/samplexslts/doc.xsl"));

// Create an XSL transform executable
XSLTExecutable xslTransform = factory.prepareXSLT(source);
        
// Create the result
Result result = new StreamResult(new ByteArrayOutputStream());
        
// Create a dynamic context specifying the XSLT initial template
XDynamicContext dc = factory.newDynamicContext();
dc.setXSLTInitialTemplate(new QName("loadnames"));
        
// Execute the transformation
xslTransform.execute(dc, result);
Le message d'erreur suivant apparaît :
IXJXE0364W: FATAL ERROR:  IXJXE0774E: [ERR 0693][ERR FODC0005] 
The URI string 'names.xml' does not map to an available document.

La cause de cette erreur est qu'au moment du chargement de l'artefact XML initial (doc.xsl), aucun contexte statique n'a été établi pour l'URI de base. Dans ce cas, le processeur examine le répertoire de travail en cours, ce qui n'a pas de sens dans un environnement J2EE.

Il existe trois manières possibles pour corriger cette situation. Voici les deux premières :
  • Définir l'URI de base dans le contexte statique.
    L'exemple suivant illustre comment définir l'URI de base dans le contexte statique :
    // create the factory
    XFactory factory = XFactory.newInstance();
            
    // set the baseURI in the static context
    URL dataURL = XSLTSchemaAware.class.getResource("/samplexslts/doc.xsl");
    XStaticContext staticContext = factory.newStaticContext();
    staticContext.setBaseURI(dataURL.toString());
    
    // load the XSLT file from a local resource within a J2EE deployment artifact        
    StreamSource source = new StreamSource(XSLTDocFunction.class.getResourceAsStream("/samplexslts/doc.xsl"));
    
    // Create an XSL transform executable
    XSLTExecutable xslTransform = factory.prepareXSLT(source, staticContext);
            
    // Create the result
    Result result = new StreamResult(new ByteArrayOutputStream());
    
    // Create a dynamic context specifying the XSLT initial template
    XDynamicContext dc = factory.newDynamicContext();
    dc.setXSLTInitialTemplate(new QName("loadnames"));
            
    // Execute the transformation
    xslTransform.execute(dc, result);
  • Charger la ressource d'une manière qui permette au processeur de connaître l'URI de base.
    L'exemple suivant illustre comment charger la ressource d'une manière qui permette au processeur de connaître l'URI de base en communiquant l'adresse URL absolue au constructeur StreamSource :
    // Create the factory
    XFactory factory = XFactory.newInstance();
            
    // Create the source from a URL
    URL dataURL = XSLTSchemaAware.class.getResource("/samplexslts/doc.xsl");
    StreamSource source = new StreamSource(dataURL.toString());
    
    // Create an XSL transform executable for the expression
    XSLTExecutable xslTransform = factory.prepareXSLT(source);
            
    // Create the result
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    Result result = new StreamResult(baos);
            
    // Create a dynamic context specifying the XSLT initial template
    XDynamicContext dc = factory.newDynamicContext();
    dc.setXSLTInitialTemplate(new QName("loadnames"));
            
    // Execute the transformation
    xslTransform.execute(dc, result);
Les deux approches décrites ci-dessus fonctionnent bien quand tous les artefacts XML résident dans une même unité de déploiement J2EE. En revanche, elles échouent quand des artefacts XML résident dans plusieurs unités de déploiement J2EE car il n'existe pas d'URI de base unique pour l'ensemble des artefacts XML dans ce cas.

Si vous souhaitez contrôler totalement le chargement des artefacts XML, qu'ils résident dans une ou plusieurs unités de déploiement, utilisez plutôt des programmes de résolution.

Procédure

Implémentez les programmes de résolution appropriés et enregistrez-les dans le contexte statique ou dans le contexte dynamique selon le cas.

Ces recommandations s'appliquent au chargement de tous les artefacts XML dans l'environnement J2EE pris en charge par les programmes de résolution pour les documents XML (fn:doc(), document()), les feuilles de style (xsl:include, xsl:import), les documents texte non analysés et les schémas XML (XSLT import-schema).


Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=txml_resolvers_j2ee
Nom du fichier : txml_resolvers_j2ee.html