2012-12-10 2 views
1

Je travaille sur un bureau Java qui est distribué via un fichier JAR et qui contient tout ce dont l'application a besoin. L'application qui génère un rapport HTML pour diverses choses en générant d'abord un fichier XML, puis en utilisant un fichier XSL pour convertir le XML en HTML. Une fois que le rapport est généré, il doit être un fichier, donc tout script que je veux utiliser, je dois inclure dans le fichier, et je veux utiliser jQuery. J'ai un fichier jQuery dans un dossier de ressources et je peux l'analyser et l'ajouter au fichier XML très bien, mais quand il est temps de transformer le XML en HTML via le XSL, j'obtiens l'erreur suivante:Erreur de nom d'entité

ERROR: 'The entity name must immediately follow the '&' in the entity reference.' 
javax.xml.transform.TransformerException: javax.xml.transform.TransformerException: com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The entity name must immediately follow the '&' in the entity reference. 
ERROR: 'com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: The entity name must immediately follow the '&' in the entity reference.' 

Lecture de l'erreur Je peux voir que j'ai besoin de coder des caractères spéciaux, mais je ne suis pas prêt à encoder manuellement l'ensemble du fichier jQuery.

Donc, mon objectif final est la suivante:

1.) Nécessité d'avoir les éléments suivants dans mon rapport HTML:

<script> 
// the entire jQuery library 
</script> 

2.) Mon application principale doit être complètement contenue dans un fichier JAR

3.) Je ne voudrais pas copier/coller la bibliothèque jQuery dans le fichier XSL. Cela fonctionne, mais il semble bâclé.

MISE À JOUR # 1:

je me suis trompé sur le point 3 ci-dessus. Je ne peux pas copier/coller la bibliothèque jQuery dans le fichier XSL sans obtenir l'erreur:

java.io.UTFDataFormatException: encoded string too long: 239677 bytes 

qui est immédiatement suivi par l'erreur plus comique:

javax.xml.transform.TransformerConfigurationException: This Templates does not contain a class with the name 'GregorSamsa'. 

gregorsamsa dans The Metamorphosis

MISE À JOUR # 2:

Le début de ma feuille de style XSL se lit comme suit:

<?xml version="1.0" encoding="UTF-8"?> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 

    <xsl:output method="html"/> 

J'ai changé le numéro de version d'un 1.0 à un 2.0 mais je reçois une erreur qui se lit comme suit:

ERROR: 'Unsupported XSL element 'http://www.w3.org/1999/XSL/Transform:sequence'' 
javax.xml.transform.TransformerException: java.lang.RuntimeException: Unsupported XSL element 'http://www.w3.org/1999/XSL/Transform:sequence' 

De plus, mon fichier jQuery est dans le même endroit que ma feuille de style XSL, donc je pense que les éléments suivants devraient travailler (mais il ne fonctionne pas):

<xsl:sequence select="unparsed-text('jquery-1.8.3.min.js')" /> 

MISE À JOUR # 3:

Téléchargé Saxon pour Java here et ajouté le fichier JAR à mon application.Changer mon appel au transformateur usine à ceci:

TransformerFactory f = new net.sf.saxon.TransformerFactoryImpl(); // was TransformerFactory.newInstance(); 
Transformer t = f.newTransformer(new StreamSource(Example.class.getResourceAsStream("resource/report_style.xsl"))); 
Source s = new StreamSource(XMLFile); 
Result r = new StreamResult(HTMLFile); 
t.transform(s, r); 

En utilisant le suggère <xsl:sequence select="unparsed-text('jquery-1.8.3.min.js')" /> je reçois encore l'équivalent de mon erreur initiale, mais maintenant avec l'analyseur saxon:

net.sf.saxon.trans.XPathException: org.xml.sax.SAXParseException: The entity name must immediately follow the '&' in the entity reference. 
SXXP0003: Error reported by XML parser: The entity name must immediately follow the '&' in the entity reference. 

MISE À JOUR # 4:

Je n'arrivais à rien avec ça, alors j'ai fini par lire le fichier HTML après l'avoir créé, y avoir ajouté mon JavaScript, puis l'avoir écrit. C'est une étape supplémentaire, mais toute différence dans le temps de génération de rapport est imperceptible et cela fonctionne. Je serais toujours intéressé de savoir pourquoi XSLT 2.0 ne résolvait pas cela pour moi cependant.

+0

Etes-vous capable d'utiliser XSLT 2.0 ou êtes-vous limité à 1.0? – LarsH

+0

@LarsH J'utilise XSL 1.0 maintenant, mais je ne pense pas que je suis "limité" à cela. J'ai essayé votre solution mais j'ai toujours des problèmes. Voir 'UPDATE # 2'. – ubiquibacon

+0

Pour résoudre le problème n ° 2, vous devez vous assurer que vous utilisez un processeur XSLT XSLT 2.0. Par exemple. Saxon-HE (http://sourceforge.net/projects/saxon/). Et puis changez le numéro de version à 2.0 à nouveau. – LarsH

Répondre

1

Si vous pouvez utiliser XSLT 2.0, vous pouvez essayer

<script> 
    <xsl:sequence select="unparsed-text('path/to/jqueryvNN.js')" /> 
</script> 

Cela devrait copier dans les définitions de la bibliothèque jquery sous forme de texte, et la sortie comme il convient au HTML. Vous utilisez la méthode de sortie HTML, n'est-ce pas? Il serait également une bonne idée d'utiliser cdata-section-elements="script" (documenté here) pour induire XSLT à sérialiser le javascript d'une manière plus efficace et plus lisible par l'homme. (De toute façon, il ne sera pas très lisible, si vous utilisez la version standard minifiée de la bibliothèque.)

Puisque XSLT n'a pas besoin d'analyser le fichier js, vous n'aurez pas à vous plaindre esperluettes et ainsi de suite.