2009-03-04 8 views
0

J'ai essayé d'utiliser la tâche xslt dans Ant pour modifier un fichier de mappage Hibernate (*.hbm.xml) à l'aide de XSLT. Cependant, j'ai continué à obtenir un com.sun.org.apache.xml.internal.utils.WrappedRuntimeException.Ant: Comment réparer une exception WrappedRuntimeException lors de l'utilisation de la tâche <xslt>?

Si je supprime la déclaration !DOCTYPE dans le fichier XML source, la cible suivante s'exécute sans erreur. Quelqu'un pourrait-il me dire ce que je fais de mal? Merci!

Voilà mon objectif Ant:

<target name="generatePermHbmXml"> 
    <xslt in="${base.configuration.hibernate.dir}\Test.hbm.xml" 
     out="${base.configuration.hibernate.dir}\TestPerm.hbm.xml" 
     style="${base.configuration.hibernate.dir}\perm.xsl"> 
    <xmlcatalog> 
     <dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN" 
      location="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"/> 
    </xmlcatalog> 
    </xslt>  
</target> 

Voici mon sortie du journal:

[xslt] : Error! hibernate.sourceforge.net 
[xslt] : Error! com.sun.org.apache.xml.internal.utils.WrappedRuntimeException: hibernate.sourceforge.net 

[Modifier] Voici le DOCTYPE que j'enlevé pour le faire fonctionner

<!DOCTYPE hibernate-mapping 
PUBLIC 
"-//Hibernate/Hibernate Mapping DTD//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

[Edit2 ]: J'ai trouvé un correctif, mais je ne sais pas si c'est la "bonne" façon ou non. J'ai téléchargé le fichier DTD et l'ai placé dans mon dossier de projet. J'ai référencé le fichier (comme indiqué ci-dessous) au lieu de l'URL, et cela semble fonctionner maintenant.

<xmlcatalog> 
    <dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN" 
     location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/> 
</xmlcatalog> 
+0

Alors, quelle est la déclaration DOCTYPE que faire lorsque vous l'enlevez? – Eddie

+0

comme ajouté dans le post ci-dessus, je pense que c'était une DTD hibernate standard que j'ai retiré du site Hibernate. – tomato

Répondre

2

Ah, je pense que je connais le problème. Dans votre tâche xslt, vous avez spécifié un xmlcatalog:

<xmlcatalog> 
    <dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN" 
     location="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"/> 
</xmlcatalog> 

Le xmlcatalog est utilisé pour aider à la tâche xslt trouver d'autres éléments DTDs et nécessaires pour l'analyse et la validation XML. Si vous allez à l'URL que vous avez spécifié comme location vous obtenez une DTD. (Ce que Firefox montre une page vide, mais en regardant "source de la page" vous voyez le contenu DTD.) Puisque la DTD est effectivement présente à cette URL, je ne sais pas exactement pourquoi la construction a eu un problème en lisant DTD - Peut-être qu'il y a une différence dans l'encodage ou peut-être que le site n'a pas répondu correctement. Si vous exécutiez ANT avec l'option -verbose, vous verriez plus d'un vidage de pile autour de l'échec si vous vouliez vraiment le déboguer. Vous verriez l'original Exception qui a été enveloppé dans le Exception que vous avez vu.

Quoi qu'il en soit, si vous téléchargez la DTD en question, puis pointez votre location dans l'élément dtd au fichier local, comme vous l'avez fait:

<xmlcatalog> 
    <dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN" 
     location="${base.configuration.hibernate.dir}/hibernate-mapping-3.0.dtd"/> 
</xmlcatalog> 

alors l'analyseur peut trouver la DTD dont il a besoin, garantie, et ça marche bien.

Alors oui, votre solution est la bonne solution. De cette façon, vos builds ne dépendent pas d'un site web externe étant accessible et ayant un fichier disponible.

Questions connexes