Pergunta

Eu tentei usar a tarefa xslt no Ant para modificar um arquivo de mapeamento Hibernate (*.hbm.xml) usando XSLT. No entanto eu continuei recebendo uma com.sun.org.apache.xml.internal.utils.WrappedRuntimeException.

Se eu tirar a declaração !DOCTYPE no arquivo xml fonte, as seguintes corridas alvo sem qualquer erro. Alguém poderia me dizer o que eu estou fazendo errado? Obrigado!

Aqui é o meu alvo 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>

Aqui está a minha saída do log:

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

[Edit] Aqui está o DOCTYPE que eu removido para fazê-lo funcionar

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

[Edit2]: Eu encontrei uma solução, mas eu não sei se se é o caminho "certo" ou não. Eu baixei o arquivo DTD e colocou isso no meu dir projeto. Eu referenciado o arquivo (como mostrado abaixo) em vez da URL, e parece estar trabalhando agora.

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

Solução

Ah, eu acho que sei o problema. Em sua tarefa xslt, você especificou uma xmlcatalog:

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

O xmlcatalog é usado para ajudar os DTDs Encontra-tarefa xslt e outros itens necessários para análise XML e validação. Se você vai para o URL especificado como location você receber um DTD. (Mostra quais Firefox um uma página vazia, mas a visualização "fonte da página" você verá o conteúdo DTD.) Desde o DTD é de fato presente na URL, eu não sei exatamente por que a construção teve uma leitura de problema que DTD - talvez haja uma diferença na codificação ou talvez o site não respondeu corretamente. Se você executou ANT com a opção -verbose, você veria mais de um despejo de pilha em torno do fracasso se você realmente queria depurá-lo. Você iria ver o Exception original que ficou envolto na Exception você viu.

De qualquer forma, se você baixar o DTD em questão e, em seguida, apontar o seu location no elemento dtd no arquivo local, como você fez:

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

, em seguida, o analisador pode encontrar o DTD que precisa, garantida, e funciona bem.

Então, sim, a sua solução é a solução correta. Desta forma, seu constrói não dependem de um site externo a ser acessível e ter um arquivo disponível.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top