我尝试使用Ant中的xslt
任务来使用XSLT修改Hibernate映射文件(*.hbm.xml
)。但是我继续获得com.sun.org.apache.xml.internal.utils.WrappedRuntimeException
。
如果我在源xml文件中取出!DOCTYPE
声明,则以下目标运行时没有任何错误。有人可以告诉我我做错了什么吗?谢谢!
这是我的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>
这是我的日志输出:
[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>
答案 0 :(得分:2)
xslt
任务中,您指定了xmlcatalog
:
<xmlcatalog>
<dtd publicId="-//Hibernate/Hibernate Mapping DTD//EN"
location="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"/>
</xmlcatalog>
xmlcatalog
用于帮助xslt
任务查找XML解析和验证所需的DTD和其他项目。如果您转到指定为location
的URL,则会获得DTD。 (哪个Firefox显示一个空页面,但查看“页面源”,你会看到DTD内容。)由于DTD实际上存在于该URL,我不知道为什么构建在读取DTD时出现问题 - 也许在编码方面存在差异,或者网站可能没有正确响应。如果您使用-verbose
选项运行ANT,如果您真的想要调试它,您会看到更多的堆栈转储。您会看到原始的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,保证,并且它工作正常。
是的,您的解决方案是正确的解决方案。这样,您的构建不依赖于可访问的外部网站并且可以使用文件。