web-dev-qa-db-fra.com

Comment définir Saxon comme processeur Xslt en Java?

C'est une question simple, mais à laquelle je ne trouve pas de réponse. J'ai une feuille de style XSLT 2.0 que j'essaie de traiter en Java. Il s'appuie sur des éléments XSL de Saxon.

Ma classe actuelle fonctionne très bien avec le simple XSLT 1.0, mais je reçois des erreurs concernant les éléments non reconnus avec mon 2.0 XSLT construit avec Saxon.

Je ne sais pas comment dire à Java d'utiliser Saxon comme processeur. J'utilise javax.xml.transform dans ma classe. Est-ce une propriété que je peux définir? Que dois-je la définir? Merci?

Modifié J'ai compris comment définir la propriété pour utiliser Saxon, mais maintenant je reçois cette erreur.

Provider net.sf.saxon.TransformerFactoryImpl not found

Comment inclure Saxon dans ma candidature?

33
Jeff

Il existe plusieurs façons de procéder (par ordre de priorité de recherche):

Instanciation directe

Instancier explicitement le sine saxonne (avec un clin d'œil au commentaire de Michael ci-dessus):

TransformerFactory fact = new net.sf.saxon.TransformerFactoryImpl()

Cette approche signifie que votre code est verrouillé en utilisant Saxon au moment de la compilation. Cela peut être considéré comme un avantage (aucun risque qu'il ne fonctionne avec le mauvais processeur) ou un inconvénient (aucune possibilité de configurer un processeur différent au moment de l'exécution - pas même Saxon Enterprise Edition).

Pour Saxon-PE, remplacez com.saxonica.config.ProfessionalTransformerFactory. Pour Saxon-EE, remplacez com.saxonica.config.EnterpriseTransformerFactory.

Spécifiez le nom de la classe

Spécifiez la classe d'usine lors de sa construction:

TransformerFactory fact = TransformerFactory.newInstance(
        "net.sf.saxon.TransformerFactoryImpl", null);

Remarque: disponible à partir de Java 6 . Le version Java 5 n'a pas cette méthode.

Cette approche vous permet de choisir le processeur au moment de l'exécution, tout en évitant les coûts et les risques d'une recherche de chemin de classe. Par exemple, votre application pourrait fournir un mécanisme de configuration pour lui permettre de fonctionner avec différentes éditions saxonnes en choisissant entre les différentes classes d'usine saxonnes.

Utiliser la propriété système

Met le javax.xml.transform.TransformerFactory propriété système avant de créer une instance:

System.setProperty("javax.xml.transform.TransformerFactory",    
        "net.sf.saxon.TransformerFactoryImpl");

Ou sur la ligne de commande (ligne interrompue pour plus de lisibilité):

Java -Djavax.xml.transform.TransformerFactory=
        cnet.sf.saxon.TransformerFactoryImpl YourApp

Cette approche a l'inconvénient que les propriétés du système affectent l'ensemble Java VM. La définition de cette propriété pour sélectionner Saxon peut signifier qu'un autre module de l'application, que vous peut même ne pas être au courant, commence à utiliser Saxon au lieu de Xalan, et ce module peut échouer en conséquence s'il utilise des constructions XSLT spécifiques à Xalan.

Utiliser le fichier de propriétés

Créez le fichier suivant:

JRE/lib/jaxp.properties

Avec le contenu suivant:

javax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl

Cette approche a des conséquences similaires à l'utilisation de la propriété système.

Chargeur de service

Créez le fichier suivant dans n'importe quel JAR du CLASSPATH:

META-INF/services/javax.xml.transform.TransformerFactory

Avec le contenu suivant:

net.sf.saxon.TransformerFactoryImpl

Cette approche présente l'inconvénient qu'une petite modification du chemin de classe peut entraîner l'exécution de l'application avec un moteur XSLT différent, peut-être celui avec lequel l'application n'a jamais été testée.

Plateforme par défaut

Si rien de ce qui précède n'est fait, alors l'instance par défaut de la plate-forme TransformerFactory sera chargée. Une description conviviale de cette couche de connectivité peut être trouvée ici .

Notez que "plate-forme" signifie ici la machine virtuelle Java, pas le matériel ou le système d'exploitation sur lequel il s'exécute. Pour tous les courants connus Java VMs, la plate-forme par défaut est une version de Xalan (qui ne supporte que XSLT 1.0). Il n'y a aucune garantie que cela sera toujours vrai pour chaque Java VM dans le futur.

Je considérerais cette réponse comme un argument contre la manière de faire des choses Java.

69
Wayne Burkett

J'ai écrit un wrapper autour de l'analyseur Saxon afin de rendre son utilisation simple, et je l'ai appelé " EasySaxon ": vous pouvez le trouver ici , avec un extrait de code d'échantillons.

J'espère que cela aide.

Francesco

0

Vous pouvez explicitement construire les objets Source et Result requis pour vous assurer que ce sont des implémentations saxonnes plutôt que celles par défaut.

0
user268396