Frage

Ich habe versucht, die xslt Aufgabe in Ant zu verwenden, um eine Hibernate Mapping-Datei (*.hbm.xml) mit XSLT zu ändern. Allerdings hielt ich auf eine com.sun.org.apache.xml.internal.utils.WrappedRuntimeException bekommen.

Wenn ich die !DOCTYPE Deklaration in der XML-Quelldatei nehmen, läuft das folgende Ziel ohne Fehler. Könnte mir bitte jemand sagen, was mache ich falsch? Dank!

Hier ist mein Ant-Ziel:

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

Hier ist meine Log-Ausgabe:

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

[Bearbeiten] Hier ist die DOCTYPE, die ich entfernt, um es arbeiten

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

[Edit2]: Ich habe eine fix gefunden, aber ich weiß nicht, ob, wenn es der „richtige“ Weg ist oder nicht. Ich habe die DTD-Datei und platziert, dass in meinem Projekt Richt. I verweisen die Datei (wie unten dargestellt) anstelle der URL, und es scheint jetzt zu funktionieren.

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

Lösung

Ach, ich glaube, ich kenne das Problem. In Ihrer xslt Aufgabe haben, haben Sie eine xmlcatalog:

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

Die xmlcatalog wird verwendet, die xslt Aufgabe benötigt DTDs und andere Elemente für XML-Parsing und Validierung finden zu helfen. Wenn Sie die URL gehen Sie wie location angegeben Sie tun, um eine DTD erhalten. (Welche Firefox zeigt eine eine leere Seite, aber viewing „Seitenquelle“ können Sie die DTD Inhalte zu sehen.) Da die DTD in der Tat vorhanden ist, zu dieser URL, ich nicht genau wissen, warum die Build ein Problem hatte, dass die DTD zu lesen - vielleicht gibt es einen Unterschied in der Codierung oder vielleicht hat die Website nicht richtig reagieren. Wenn Sie ANT mit der -verbose Option laufen, würden Sie eher ein Stapelabbild um den Fehler sehen, wenn Sie es wirklich debuggen wollen. Sie würden die ursprünglichen Exception, die in dem Exception gewickelt habe Sie gesehen haben.

Wie auch immer, wenn Sie die DTD in Frage herunterladen und dann location im dtd Elemente auf der lokalen Datei zeigen, wie Sie getan haben:

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

dann kann der Parser finden die DTD es braucht, garantiert, und es funktioniert gut.

Also ja, Ihre Lösung ist die richtige Lösung. Auf diese Weise Ihr baut auf einer externen Website hängen nicht zugänglich ist und eine Datei zur Verfügung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top