Domanda

Ho provato a utilizzare l'attività xslt in Ant per modificare un file di mappatura Hibernate ( * .hbm.xml ) usando XSLT. Tuttavia, ho continuato a ottenere un com.sun.org.apache.xml.internal.utils.WrappedRuntimeException .

Se estraggo la dichiarazione ! DOCTYPE nel file XML di origine, la seguente destinazione viene eseguita senza errori. Qualcuno potrebbe dirmi cosa sto facendo di sbagliato? Grazie!

Ecco il mio bersaglio 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>

Ecco l'output del mio registro:

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

[Modifica] Ecco il DOCTYPE che ho rimosso per farlo funzionare

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

[Modifica2]: ho trovato una correzione, ma non so se sia il "giusto" modo o no. Ho scaricato il file DTD e l'ho inserito nella mia directory di progetto. Ho fatto riferimento al file (come mostrato di seguito) anziché all'URL e sembra funzionare ora.

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

Soluzione

Ah, penso di conoscere il problema. Nell'attività xslt , hai specificato un xmlcatalog :

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

Il xmlcatalog viene utilizzato per aiutare l'attività xslt a trovare DTD e altri elementi necessari per l'analisi e la convalida XML. Se vai all'URL specificato come location otterrai un DTD. (Quale Firefox mostra una pagina vuota, ma visualizzando "sorgente pagina" vedi i contenuti del DTD.) Dato che il DTD è effettivamente presente in quell'URL, non so esattamente perché la build abbia avuto problemi a leggere quel DTD - - forse c'è una differenza nella codifica o forse il sito non ha risposto correttamente. Se avessi eseguito ANT con l'opzione -verbose , vedresti più di un dump dello stack attorno al fallimento se volessi davvero eseguirne il debug. Vedresti l'originale Exception racchiuso nel Exception che hai visto.

Comunque, se scarichi il DTD in questione e poi punti la tua posizione nell'elemento dtd sul file locale, come hai fatto:

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

quindi il parser può trovare il DTD di cui ha bisogno, garantito e funziona bene.

Quindi sì, la tua soluzione è la soluzione corretta. In questo modo, le build non dipendono dal fatto che un sito Web esterno sia accessibile e abbia un file disponibile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top