Question

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 .

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

Voici ma cible 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 la sortie de mon 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'ai 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 le "droit" chemin ou pas. J'ai téléchargé le fichier DTD et l'ai placé dans mon répertoire de projet. J'ai référencé le fichier (comme indiqué ci-dessous) au lieu de l'URL, et il semble fonctionner maintenant.

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

La solution

Ah, je pense connaître 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 les DTD et autres éléments nécessaires à l'analyse et à la validation XML. Si vous accédez à l'URL que vous avez spécifiée comme emplacement , vous obtenez une DTD. (Firefox affiche une page vide, mais vous voyez le contenu de la DTD en affichant "source de page".) La DTD étant en fait présente à cette adresse URL, je ne sais pas exactement pourquoi la construction a eu un problème de lecture de cette DTD - - Peut-être qu'il y a une différence d'encodage ou que le site n'a pas répondu correctement. Si vous exécutiez ANT avec l'option -verbose , vous verriez davantage de dump de pile autour de l'échec si vous souhaitiez vraiment le déboguer. Vous verriez le Exception d'origine 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 emplacement dans l'élément dtd du 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, garanti, et cela fonctionne bien.

Alors oui, votre solution est la bonne. Ainsi, vos versions ne dépendent pas de la disponibilité d’un site Web externe et de la disponibilité d’un fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top