2009-03-04 11 views
0

XSLT kullanarak bir Hazırda Bekletme eşleme dosyasını (*.hbm.xml) değiştirmek için Ant'deki xslt görevini kullanmayı denedim. Ancak bir com.sun.org.apache.xml.internal.utils.WrappedRuntimeException almaya devam ettim.Ant: <xslt> görevini kullanırken WrappedRuntimeException'ı nasıl düzeltebilirim?

Kaynak xml dosyasında !DOCTYPE bildirimini çıkarırsam, aşağıdaki hedef herhangi bir hata olmadan çalışır. Birisi bana neyi yanlış yaptığımı söyleyebilir mi? Teşekkürler!

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

İşte benim günlük çıkış var:

İşte benim Ant hedef var

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

[Düzenle] Burada

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

[EDIT2 çalışma almak için ben kaldırıldı DOCTYPE var ]: Bir düzeltme buldum, ama "doğru" yol olup olmadığını bilmiyorum. DTD dosyasını indirdim ve bunu proje direktifime yerleştirdim. Dosyayı (aşağıda gösterildiği gibi) URL yerine başvuruyordum ve şu an çalışıyor gibi görünüyor.

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

Peki, DOCTYPE bildirimi, onu kaldırdığınızda ne işe yarar? Yukarıdaki gönderiye ek olarak – Eddie

+0

, bence Hazırda Bekletme sitesinden çıkardığım standart hiberneli bir DTD idi. – tomato

cevap

2

Ah, sanırım sorunu biliyorum. senin xslt görev, bir xmlcatalog belirtilen:

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

xmlcatalogxslt görev DTD'ler ve XML ayrıştırma ve doğrulama için gerekli diğer öğeleri bulmanıza yardımcı olmak için kullanılmaktadır. location olarak belirttiğiniz URL'ye giderseniz, bir DTD alırsınız. (Hangi Firefox boş bir sayfa gösterir, ancak "sayfa kaynağı" yı görüntülerken, DTD içeriğini görürsünüz.) DTD gerçekte bu URL'de bulunduğundan, yapının DTD'yi okumakta neden bir sorun olduğunu tam olarak bilmiyorum - Belki de kodlamada bir fark var veya belki de site düzgün cevap vermedi. ANT'yi -verbose seçeneğiyle çalıştırırsanız, gerçekten hata ayıklamak istediğinizde, başarısızlık etrafında yığın yığınının daha fazlasını görürsünüz. Gördüğünüz Exception'a sarılmış orijinal Exception göreceksiniz.

Neyse, söz konusu DTD indirmek ve yaptığınız gibi, daha sonra yerel dosyaya dtd elemanda location açınızı eğer:

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

sonra ayrıştırıcı garantili, ihtiyacı DTD'yi bulabilirsiniz, ve iyi çalışıyor.

Evet, çözümünüz doğru çözümdür. Bu sayede, yapılarınız erişilebilir bir harici web sitesine ve bir dosyaya sahip olmaya bağlı değildir.