Xalan und DTDs
Simon
- xml
Hallo,
ich habe ein Problem bei der Benutzung von Xalan (Java).
Und zwar möchte ich eine XML per XSLT in eine XHTML überführen.
Dies funktioniert allerdings nur dann, wenn ich in meiner XML keine DTD-Definition angebe. Lasse ich diese weg, so erstellt mir Xalan ein schönes HTML-Dokument.
Füge ich die DTD-Definition jedoch wieder ein, so bricht Xalan mit folgender Meldung ab:
java.net.MalformedURLException: no protocol: nureinbeispiel.dtd
Die DTD-Deklaration sieht folgendermaßen aus:
<!DOCTYPE Medienbibliothek SYSTEM "nureinbeispiel.dtd">
Ich schätze, die Meldung "no protocol" spielt darauf an, dass in der URL zur DTD keine Protokollangabe wie etwa http oder so steht. Aber das soll es ja auch gar nicht, weil es geschickerweise eine relative URL ist. (Die Dateien liegen alle im selben Verzeichnis) Nur was mache ich nun mit Xalan? Denn ich möchte ja den Bezug zur DTD in meinem XML-Dokument schon beibehalten. Wie bekomme ich Xalan dazu, die XML-Datei auch mit DTD-Deklaration zu transformieren?
Hallo,
Die DTD-Deklaration sieht folgendermaßen aus:
<!DOCTYPE Medienbibliothek SYSTEM "nureinbeispiel.dtd">Ich schätze, die Meldung "no protocol" spielt darauf an, dass in der URL zur DTD keine Protokollangabe wie etwa http oder so steht.
Das weist irgendwie darauf hin. Allerdings: Relative URIs in DTD-Deklarationen sind laut XML-Standard zulässig und sogar üblich.
Um das ganze Problem mal etwas besser zu isolieren: Welche Version von Xalan verwendest Du und wie rufst Du es auf?
Bei mir (Xalan 2.7.1) von der Kommandozeile funktioniert das folgende Beispiel aus SELFHTML (das ebenfalls eine Referenz zu einer relativen DTD enthält):
gruss.xml (lässt sich auch mit XSLT-konformen Browsern anzeigen)
gruss.xsl
gruss.dtd
Aufruf der Kommandozeile (beides liefert bei mir das gleiche):
xalan -IN gruss.xml -XSL gruss.xsl
java -jar /usr/share/xalan/lib/xalan.jar -IN gruss.xml -XSL gruss.xsl
Ausgabe:
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p style="font-family:Tahoma; font-size:64px; color:red" align="center">hallo Welt!</p>
</body>
</html>
Vielleicht solltest Du's erstmal mit diesem einfachen Beispiel probieren, um zu sehen, wo das Problem bei Dir liegt.
Viele Grüße,
Christian
Hallo Christian,
vielen Dank für deine Hilfe!
Um das ganze Problem mal etwas besser zu isolieren: Welche Version von Xalan verwendest Du und wie rufst Du es auf?
Ich verwende die aktuelle Version (2.7.1) und rufe es von der Kommandozeile aus auf.
Bei mir (Xalan 2.7.1) von der Kommandozeile funktioniert das folgende Beispiel aus SELFHTML (das ebenfalls eine Referenz zu einer relativen DTD enthält):
Habe es mal getestet. Trotz gleicher Version und ebenfalls Kommandozeile erscheint auch bei diesem Beispiel die no-protocol-Fehlermeldung.
-----
Ich habe in meine ursprüngliche XML-Datei mal anstatt der Deklaration
<!DOCTYPE Medienbibliothek SYSTEM "nureinbeispiel.dtd">
eine Deklaration mit absolutem Pfad geschrieben:
<!DOCTYPE Medienbibliothek SYSTEM "file:///C:/Users/XYZ/Documents/nur/ein/beispiel/nureinbeispiel.dtd">
So hat die Transformation ebenfalls ohne Fehlermeldungen funktioniert.
Nachtrag:
Ich habe in meine ursprüngliche XML-Datei mal anstatt der Deklaration
<!DOCTYPE Medienbibliothek SYSTEM "nureinbeispiel.dtd">
eine Deklaration mit absolutem Pfad geschrieben:
<!DOCTYPE Medienbibliothek SYSTEM "file:///C:/Users/XYZ/Documents/nur/ein/beispiel/nureinbeispiel.dtd">
So hat die Transformation ebenfalls ohne Fehlermeldungen funktioniert.
Ich habe es nun hinbekommen, dass die Transformation auch mit relativem Pfad klappt, allerdings muss nach wie vor als Protokollangabe file: davor stehen. So funktioniert es nun also:
<!DOCTYPE Medienbibliothek SYSTEM "file:nureinbeispiel.dtd">
Damit wäre das Problem allerdings noch immer nicht wirklich gelöst, denn ganz normal scheint das Verhalten von Xalan schließlich nicht zu sein, wenn es z.B. bei Christian auch mit einem "ganz normalen" relativen URI funktioniert. Daher bin ich weiterhin sehr für Tipps dankbar. Im Regelfall schreibt man ja kein file: vor seine URIs.