2009-03-04 40 views
0

我試圖在Ant中使用xslt任務來使用XSLT修改Hibernate映射文件(*.hbm.xml)。不過,我一直在獲得com.sun.org.apache.xml.internal.utils.WrappedRuntimeExceptionAnt:如何在使用<xslt>任務時修復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

那麼什麼是DOCTYPE聲明當你刪除它的東西工作? – Eddie 2009-03-04 23:48:14

回答

2

啊,我想我知道這個問題。在你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解析和驗證等物品。如果您轉到指定爲location的網址,則會獲得DTD。 (哪個Firefox顯示一個空白頁面,但查看「頁面源代碼」可以看到DTD內容。)由於DTD實際上出現在該URL中,我不清楚爲什麼構建在閱讀該DTD時遇到問題 - 也許編碼存在差異,或者網站沒有正確響應。如果您使用-verbose選項運行ANT,如果您真的想要調試它,您會在故障周圍看到更多的堆棧轉儲。你會看到原來的Exception被包裝在你看到的Exception中。

無論如何,如果你下載的DTD的問題,然後在dtd元素在本地文件指向你的location,像你一樣:

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

,解析器可以找到它所需要的DTD,保證,它工作正常。

所以是的,你的解決方案是正確的解決方案。這樣,您的構建不依賴於可訪問的外部網站並提供可用的文件。