XML in meherer HTML Dateien transformieren
Christian
- xml
0 Thomas J.S.0 MudGuard0 Christian
Hallo,
leider konnte ich im Netz nichts finden, was mein Problem beheben könnte (ihr habt bestimmt ein Link Tipp :-), deshalb meine Frage:
Ich habe 1 XML File welches ich in mehrere HTML Dateien aufteilen will.
Beispiel:
XML Datei:
<Stadt>München</Stadt>
<Strasse>Berliner Strasse</Strasse>
<Stadt>München</Stadt>
<Strasse>Hamburger Strasse</Strasse>
<Stadt>Berlin</Stadt>
<Strasse>Münchner Strasse</Strasse>
<Stadt>Berlin</Stadt>
<Strasse>Frankfurter Strasse</Strasse>
Was ich erhalten will:
HTML Datei:
münchen.html enhält Links zu der Berliner und Hamburger Strasse
münchen/berliner-strasse.html
münchen/hamburger-strasse.html
berlin.html enhält Links zu der Münchner und Frankfurter Strasse
berlin/münchner-strasse.html
berlin/frankfurter-strasse.html
Das ganze soll einmal im Monat neu "gerendert" werden, sprich aus dem XML File die HTML Dateien erzeugt werden. Muss also nicht online passieren. Die HTML Dateien kann ich manuell hochladen.
Gibt es hierfür ein Tool oder wie mache ich das am besten?
Viele Grüße
Christian
Hallo,
leider konnte ich im Netz nichts finden, was mein Problem beheben könnte (ihr habt bestimmt ein Link Tipp :-), deshalb meine Frage:
Ich habe 1 XML File welches ich in mehrere HTML Dateien aufteilen will.
Dazu gibts im Moment zwei Wege:
Z.B. libxslt http://xmlsoft.org/XSLT/ unterstüzt die EXSLT "exsl:document" Erweiterung http://exslt.org/exsl/elements/document/index.html
Das ganze soll einmal im Monat neu "gerendert" werden, sprich aus dem XML File die HTML Dateien erzeugt werden. Muss also nicht online passieren. Die HTML Dateien kann ich manuell hochladen.
Na ja, du kennst am Server entweder einen Cron-Job dafür einreichten, oder du machst es dann mit Saxon auf deinem Rechner (unter Windows wäre Saxon einfacher zu bedienen als libxslt)
Grüße
Thomas
Hi,
Dazu gibts im Moment zwei Wege:
Drei. (vielleicht auch mehr)
- du kannst parsereigene Erweiterungen nutzen, sofern welche angeboten werden,
- oder du benützt einen Prozessor, der xsl:result-document aus XSLT 2.0 unterstütz (wie z.B. Saxon)
Ich mach sowas mit dem msxsl-Teil im Command-Line-Interpreter von Windows.
cu,
Andreas
Hi,
Dazu gibts im Moment zwei Wege:
Drei. (vielleicht auch mehr)
- du kannst parsereigene Erweiterungen nutzen, sofern welche angeboten werden,
- oder du benützt einen Prozessor, der xsl:result-document aus XSLT 2.0 unterstütz (wie z.B. Saxon)
Das mit dem XSLT klingt doch ganz gut. Wie gehe ich hierzu aber mit den Deeplinks zu den Unterseiten um? Vorallem wenn ich einen Tree anlegen will?
- oder einen XSLT-Parser, der Parameter erlaubt - im XSL-Stylesheet wird dann anhand des Parameter-Wertes die Ausgabe erzeugt. Pro zu erzeugender Datei wird der Parser einmal aufgerufen. Wenn die Anzahl der möglichen Parameter-Werte nicht konstant ist, sondern aus der XML-Datei selbst geholt werden soll, kann man auch das Batch-File, das die einzelnen HTML-Dateien erzeugen soll, per XSLT generieren.
Ich mach sowas mit dem msxsl-Teil im Command-Line-Interpreter von Windows.
cu,
Andreas
Thx für Eurer Tipps
Chris
Hallo,
Das mit dem XSLT klingt doch ganz gut. Wie gehe ich hierzu aber mit den Deeplinks zu den Unterseiten um? Vorallem wenn ich einen Tree anlegen will?
Dein XML ist nicht ganz so glücklich gewählt. z.B. wäre eine Aufbau wie:
<Stadt Name="München">
<Strasse>Berliner Strasse</Strasse>
<Strasse>Hamburger Strasse</Strasse>
</Stadt>
besser geeignet. So muss du halt ein wenig mehr in deinem XSLT "programmieren".
Folgende Stylesheet erzeugt mit Saxon (habe jetzt mit dem 8er ausprobiert) eine:
index.html
Berlin.html
München.html
Berlin\Frankfurter Strasse.html
Berlin\Münchner Strasse.html
etc.
----------------------------------------------------------------
<?xml version="1.0" encoding="iso-8859-1"?>
<Staedte>
<Stadt Name="München">
<Strasse>Berliner Strasse</Strasse>
<Strasse>Hamburger Strasse</Strasse>
</Stadt>
<Stadt Name="Berlin">
<Strasse>Münchner Strasse</Strasse>
<Strasse>Frankfurter Strasse</Strasse>
</Stadt>
</Staedte>
----------------------------------------------------------------
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output name="staedte" method="html" indent="yes"
encoding="ISO-8859-1"
doctype-system="http://www.w3.org/TR/html4/loose.dtd"
doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN" />
<xsl:template match="/Staedte">
<xsl:result-document href="index.html" format="staedte">
<html>
<head><title>Städte und Straßen</title></head>
<body>
<h1>Städte und Straßen</h1>
<xsl:for-each select="Stadt">
<p><a href="{@Name}.html"><xsl:value-of select="@Name"/></a></p>
</xsl:for-each>
</body>
</html>
</xsl:result-document>
<xsl:for-each select="Stadt">
<xsl:result-document href="{@Name}.html" format="staedte">
<html>
<head><title><xsl:value-of select="@Name"/></title></head>
<body>
<h1><xsl:value-of select="@Name" /></h1>
<xsl:for-each select="Strasse">
<p><a href="{.}.html"><xsl:value-of select="."/></a></p>
</xsl:for-each>
</body>
</html>
</xsl:result-document>
</xsl:for-each>
<xsl:apply-templates select="Stadt/Strasse" />
</xsl:template>
<xsl:template match="Strasse">
<xsl:result-document href="{concat(parent::*/@Name, '/', escape-uri(., true()))}.html" format="staedte">
<html>
<head><title><xsl:value-of select="."/></title></head>
<body>
<h1><xsl:value-of select="." /></h1>
<p>Zurück zu: <a href="../{parent::*/@Name}.html"><xsl:value-of select="parent::*/@Name"/></a></p>
</body>
</html>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
Mit XSLT 1.0 geht das auch, da hat Andreas recht, da er das bereits verwendet ist es besser, wenn er das dir erklärt ;-)
(und ich darf derweilen faulenzen)
Grüße
Thomas
Vielen Dank Thomas. Das muss ich jetzt gleich mal ausprobieren. Ich gebe Dir Feedback asap.
Thx
Chris