Ant: Как мне исправить WrappedRuntimeException при использовании задачи <xslt>? - PullRequest
0 голосов
/ 05 марта 2009

Я пытался использовать задачу xslt в Ant для изменения файла отображения Hibernate (*.hbm.xml) с помощью XSLT. Однако я продолжал получать com.sun.org.apache.xml.internal.utils.WrappedRuntimeException.

Если я извлекаю объявление !DOCTYPE в исходном XML-файле, следующая цель запускается без ошибок. Может кто-нибудь сказать мне, что я делаю не так? Спасибо!

Вот моя цель Муравья:

<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>

Вот мой вывод журнала:

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

[Редактировать] Вот DOCTYPE, который я удалил, чтобы заставить его работать

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

[Edit2]: я нашел исправление, но я не знаю, является ли это «правильным» способом или нет. Я скачал файл DTD и поместил его в директорию моего проекта. Я ссылался на файл (как показано ниже) вместо URL, и теперь он работает.

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

1 Ответ

2 голосов
/ 05 марта 2009

Ах, я думаю, я знаю проблему. В своем задании xslt вы указали xmlcatalog:

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

xmlcatalog используется, чтобы помочь задаче xslt найти DTD и другие элементы, необходимые для синтаксического анализа и проверки XML. Если вы перейдете по URL, указанному вами как location, вы получите DTD. (Какой Firefox показывает пустую страницу, но при просмотре «источника страницы» вы видите содержимое DTD.) Поскольку DTD фактически присутствует по этому URL, я не знаю точно, почему сборка имела проблему с чтением этого DTD может быть, есть разница в кодировке или сайт не отвечает должным образом. Если вы запустите ANT с параметром -verbose, вы увидите больше сброса стека вокруг сбоя, если вы действительно захотите его отладить. Вы бы увидели оригинал Exception, завернутый в Exception, который вы видели.

В любом случае, если вы загрузите DTD, о котором идет речь, а затем укажите свой location в элементе dtd в локальном файле, как вы это сделали:

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

тогда парсер сможет найти DTD, в котором он нуждается, гарантированно, и он отлично работает.

Так что да, ваше решение - правильное решение. Таким образом, ваши сборки не зависят от доступности внешнего веб-сайта и наличия файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...