Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Zusammenfuehren mehrere XHTML-Dateien zu einer

20 views
Skip to first unread message

Andreas Borutta

unread,
Jan 3, 2012, 8:26:13 AM1/3/12
to
Moin.

Ich spiele ein wenig mit dem Format ePub herum.

Dafür benötige ich ein Werkzeug, welches in einem Rutsch /mehrere/
(nicht nur zwei) XHTML-Dateien zu einem zusammenführen kann.
Plattform: Windows 7 64bit

Vermutlich fehlen mir passende Schlagwörter um so ein Werkzeug zu
finden.
Mein Editor Ultraedit kann's nicht.
Sigil auch nicht.
vHTMLMerger dito (kann nur HTML).

Über einen Tipp freue ich mich.

Danke.

Andreas

Falls hier zufällig ein ePub-Enthusiast mitliest, der bereits einige
bewährte RegEx zum Reinigen typischer, von Verlagen in grausligster
Markup-Qualität ausgelieferter Quelltexte, erstellt hat: ich wäre
interessiert.

Martin Honnen

unread,
Jan 3, 2012, 10:13:13 AM1/3/12
to
Andreas Borutta wrote:

> Dafür benötige ich ein Werkzeug, welches in einem Rutsch /mehrere/
> (nicht nur zwei) XHTML-Dateien zu einem zusammenführen kann.
> Plattform: Windows 7 64bit

> Über einen Tipp freue ich mich.

XSLT kann so etwas sicherlich mit einem geeigneten XSLT-Stylesheet. In
welcher Form sollen denn die Dokumente zusammengeführt werden?
Insbesondere bei "head"-Elementen ist ja einfach ein Kopieren aller
"title" oder "base" oder "link" wenig sinnvoll.



--

Martin Honnen --- MVP Data Platform Development
http://msmvps.com/blogs/martin_honnen/

Andreas Borutta

unread,
Jan 3, 2012, 10:27:12 AM1/3/12
to
Martin Honnen schrieb:

>> Dafür benötige ich ein Werkzeug, welches in einem Rutsch /mehrere/
>> (nicht nur zwei) XHTML-Dateien zu einem zusammenführen kann.
>> Plattform: Windows 7 64bit
>
>> Über einen Tipp freue ich mich.
>
> XSLT kann so etwas sicherlich mit einem geeigneten XSLT-Stylesheet.

Nun ja, ich suche ein fertiges Werkzeug für den Zweck. Ich will/kann
kein eigenes Skript dafür schreiben.

Klar die überflüssigen Head-Elemente müsste ich danach manuell per
Search&Replace rauswerfen.
Das ist aber OK.

Andreas
Message has been deleted

Andreas Borutta

unread,
Jan 5, 2012, 5:08:23 AM1/5/12
to
Stefan Ram schrieb:

>>Über einen Tipp freue ich mich.
>
> Vielleicht gibt es hier auch eine »Save As ...«-Möglichkeit:
>
> http://dev.w3.org/Amaya/doc/WX/MakeBook.html

Danke für den Hinweis.
Ich habe Amaya installiert und versucht die Anwendung des Befehls
"Extras > Buch erstellen" auf eine Gruppe von Dokumenten zu verstehen.
Bisher ohne Erfolg.
Ich konnte nicht herausfinden, wie man mehrere Dokumente "an diesen
Befehl übergibt".

Andreas

Thomas Braun

unread,
Jan 5, 2012, 11:46:11 AM1/5/12
to
Andreas Borutta wrote:

> Danke für den Hinweis.
> Ich habe Amaya installiert und versucht die Anwendung des Befehls
> "Extras > Buch erstellen" auf eine Gruppe von Dokumenten zu verstehen.
> Bisher ohne Erfolg.
> Ich konnte nicht herausfinden, wie man mehrere Dokumente "an diesen
> Befehl übergibt".

Soweit ich das verstanden habe baust du ein html dokument in dem die
Teildokumente verlinkt sind - dann ruft man den Befehl auf und Amaya
erzeugt ein komplettes Dokument in dem alle Links durch den eigentlichen
Teldokumenten-Body ersetzt sind:

# You use typed links for linking chapters, by associating an attribute
# rel="chapter" or rel="subdocument"
...
# Then, when you activate the Make book function, all blocks (<li> elements
# in the above example) containing a typed link to a chapter will be
# replaced by the corresponding actual web pages

Thomas

Andreas Borutta

unread,
Jan 5, 2012, 12:53:52 PM1/5/12
to
Thomas Braun schrieb:

>> Ich habe Amaya installiert und versucht die Anwendung des Befehls
>> "Extras > Buch erstellen" auf eine Gruppe von Dokumenten zu verstehen.
>> Bisher ohne Erfolg.
>> Ich konnte nicht herausfinden, wie man mehrere Dokumente "an diesen
>> Befehl übergibt".
>
> Soweit ich das verstanden habe baust du ein html dokument in dem die
> Teildokumente verlinkt sind - dann ruft man den Befehl auf und Amaya
> erzeugt ein komplettes Dokument in dem alle Links durch den eigentlichen
> Teldokumenten-Body ersetzt sind:

Danke für den Hinweis.

Dann nützt mir Amaya nix.

Es wird mir wohl nix übrig bleiben als 30mal Copy&Paste zu bemühen.

Hätte ja sein können, dass freie Editoren existieren, die mehrere
Dokumente verschmelzen können.

Andreas

Peter Mueller

unread,
Jan 5, 2012, 1:41:33 PM1/5/12
to
Andreas Borutta schrieb am 03.01.2012 14:26:
> Moin.
>
> Ich spiele ein wenig mit dem Format ePub herum.
>
> Dafür benötige ich ein Werkzeug, welches in einem Rutsch /mehrere/
> (nicht nur zwei) XHTML-Dateien zu einem zusammenführen kann.
> Plattform: Windows 7 64bit
>
> Vermutlich fehlen mir passende Schlagwörter um so ein Werkzeug zu
> finden.
> Mein Editor Ultraedit kann's nicht.
> Sigil auch nicht.
> vHTMLMerger dito (kann nur HTML).
>
> Über einen Tipp freue ich mich.

Textpad kann das (bearbeiten-einfügen-erweitert-Datei), den gibt es auch
auf deutsch und auch für Windows 7 64bit.

Viele Grüße,

Peter

Andreas Borutta

unread,
Jan 5, 2012, 1:54:23 PM1/5/12
to
Peter Mueller schrieb:

>> Ich spiele ein wenig mit dem Format ePub herum.
>>
>> Dafür benötige ich ein Werkzeug, welches in einem Rutsch /mehrere/
>> (nicht nur zwei) XHTML-Dateien zu einem zusammenführen kann.
>> Plattform: Windows 7 64bit
>>
>> Vermutlich fehlen mir passende Schlagwörter um so ein Werkzeug zu
>> finden.
>> Mein Editor Ultraedit kann's nicht.
>> Sigil auch nicht.
>> vHTMLMerger dito (kann nur HTML).
>>
>> Über einen Tipp freue ich mich.
>
> Textpad kann das (bearbeiten-einfügen-erweitert-Datei), den gibt es auch
> auf deutsch und auch für Windows 7 64bit.

Das klingt danach, als ob man so zwei Dateien, nicht aber 30 in einem
Rutsch verschmelzen kann.

Oder verstehe ich Dich falsch?

Andreas

Peter Mueller

unread,
Jan 5, 2012, 2:28:20 PM1/5/12
to
Man kann in dem Dialog dann mehrere Dateien (z.B. auch alle aus einem
Verzeichnis) auswählen, die dann in das bestehende Dokument eingefügt
werden. Limit wird durch das Betriebssystem gesetzt, ebenso die
Einschränkung dass die Dateien in einem Verzeichnis sein müssen.

Viele Grüße,

Peter

Thomas 'PointedEars' Lahn

unread,
Jan 5, 2012, 2:38:39 PM1/5/12
to
Andreas Borutta wrote:

> Es wird mir wohl nix übrig bleiben als 30mal Copy&Paste zu bemühen.

Oder Du bemühst 1mal ein XSLT-Tutorial Deines geringsten Misstrauens.


kopfschüttelnd,

PointedEars
--
Andererseits wäre auf einer Seite unter vu-Domain mit Zappelgifs,
Mustertapete, MS Sans Comic und Frames ein fehlender Counter ein
glatter Stilbruch.
(Olaf Pöhlmann in dciwam <asl6a6$rm0$04$1...@news.t-online.com>)

Thomas 'PointedEars' Lahn

unread,
Jan 5, 2012, 2:57:01 PM1/5/12
to
Andreas Borutta wrote:

> Martin Honnen schrieb:
>>> Dafür benötige ich ein Werkzeug, welches in einem Rutsch /mehrere/
>>> (nicht nur zwei) XHTML-Dateien zu einem zusammenführen kann.
>>> Plattform: Windows 7 64bit
>>> Über einen Tipp freue ich mich.
>> XSLT kann so etwas sicherlich mit einem geeigneten XSLT-Stylesheet.
>
> Nun ja, ich suche ein fertiges Werkzeug für den Zweck. Ich will/kann
> kein eigenes Skript dafür schreiben.

XSLT (eXtensible Stylesheet Language Transformations)-Dokumente sind keine
Scripts, es sind *Stylesheets*.

> Klar die überflüssigen Head-Elemente müsste ich danach manuell per
> Search&Replace rauswerfen.

Mit XSLT ist das nicht notwendig, denn Du kannst den Inhalt der body-
Elemente direkt extrahieren.

Moderne Browser haben XSLT-Prozessoren übrigens eingebaut, so dass man nicht
mal mehr serverseitig per Programmiersprache einen XSLT-Prozessor anwerfen
muss (aber kann).

> Das ist aber OK.

Wer nicht will, der hat schon.


PointedEars
--
Anyone who slaps a 'this page is best viewed with Browser X' label on
a Web page appears to be yearning for the bad old days, before the Web,
when you had very little chance of reading a document written on another
computer, another word processor, or another network. -- Tim Berners-Lee

Thomas 'PointedEars' Lahn

unread,
Jan 5, 2012, 5:42:50 PM1/5/12
to
Thomas 'PointedEars' Lahn wrote:

> Andreas Borutta wrote:
>> Es wird mir wohl nix übrig bleiben als 30mal Copy&Paste zu bemühen.
>
> Oder Du bemühst 1mal ein XSLT-Tutorial Deines geringsten Misstrauens.

Ich habe mich inzwischen näher mit dem Problem beschäftigt und dabei
gemerkt, dass aufgrund des Default-XHTML-Namespace das Extrahieren aus
XHTML-Dokumenten im Unterschied zum Extrahieren aus XML-Dokumenten (kein
Namespace notwendig) nicht trivial ist.

Den entscheidenden Hinweis hierzu fand ich unter
<http://www.xmlplease.com/xhtmlxhtml>.

A) XML-Dokument als Basis, XHTML-Dokumente als Quellen (einfacher):

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="include-from-xml.xsl"?>
<includes>
<include src="../XHTML/test.xhtml"/>
<include src="../XHTML/test2.xhtml"/>
</includes>

Entsprechendes Stylesheet (include-from-xml.xsl):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xhtml"/>

<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>Including XHTML with XSLT, based on XML</title>
</head>

<body>
<h1>Including XHTML with XSLT, based on XML</h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>

<xsl:template match="includes">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>

<xsl:template match="include">
<xsl:variable name="doc" select="document(@src)"/>
<li><xsl:value-of
select="$doc/xhtml:html/xhtml:head/xhtml:title"/></li>
</xsl:template>
</xsl:stylesheet>

Testcase: <http://PointedEars.de/markup/xml/XSL/include.xml>


B) XHTML-Dokument als Basis, XHTML-Dokumente als Quellen:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="include-from-xhtml.xsl"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
[
<!ATTLIST div
src CDATA #IMPLIED>
]>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Including XHTML with XSLT, based on XHTML</title>
</head>

<body>
<h1>Including XHTML with XSLT, based on XHTML</h1>
<div class="includes">
<div src="../XHTML/test.xhtml"></div>
<div src="../XHTML/test2.xhtml"></div>
</div>
</body>
</html>

Entsprechendes Stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml">
<xsl:output method="xhtml"/>

<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="xhtml:div">
<xsl:choose>
<xsl:when test="contains(@class, 'includes')">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:when>
<xsl:when test="@src">
<xsl:variable name="doc" select="document(@src)"/>
<li><xsl:value-of select="$doc/xhtml:html/xhtml:head/xhtml:title"
/></li>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>

<!-- Identitätstransformation (identity transformation):
Kopieren, wenn es kein spezielles Template gibt -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>

Testcase: <http://PointedEars.de/markup/xml/XSL/include.xhtml>

[Statt im internen Subset ein src-Attribut für das div-Element zu
deklarieren – damit das Basis-XHTML-Dokument valide ist –, kann man
natürlich auch das bereits deklarierte class-Attribut und den Inhalt des
entsprechenden div-Elements verwenden. Die Lösung mit src-Attribut hat
den Vorteil, dass man im Fehlerfall nichts sieht. Die Lösung mit Inhalt
hat den Vorteil, dass man im Fehlerfall immer etwas sieht.]


Das "Kopieren" des Inhalts der body-Elemente der XHTML-"Datenquellen" sowie
die Transformation der hN- in h(N+1)-Elemente u. ä. bleibt dem geneigten
Leser zur Übung überlassen.


PointedEars
--
> If you get a bunch of authors […] that state the same "best practices"
> in any programming language, then you can bet who is wrong or right...
Not with javascript. Nonsense propagates like wildfire in this field.
-- Richard Cornford, comp.lang.javascript, 2011-11-14

Andreas Borutta

unread,
Jan 5, 2012, 6:48:54 PM1/5/12
to
Peter Mueller schrieb:

>>> Textpad kann das (bearbeiten-einfügen-erweitert-Datei), den gibt es auch
>>> auf deutsch und auch für Windows 7 64bit.
>>
>> Das klingt danach, als ob man so zwei Dateien, nicht aber 30 in einem
>> Rutsch verschmelzen kann.
>
> Man kann in dem Dialog dann mehrere Dateien (z.B. auch alle aus einem
> Verzeichnis) auswählen, die dann in das bestehende Dokument eingefügt
> werden. Limit wird durch das Betriebssystem gesetzt, ebenso die
> Einschränkung dass die Dateien in einem Verzeichnis sein müssen.

Danke. :) Klappte auf Anhieb.

Andreas

Andreas Borutta

unread,
Jan 5, 2012, 6:52:41 PM1/5/12
to
Thomas 'PointedEars' Lahn schrieb:

> Thomas 'PointedEars' Lahn wrote:
>
>> Andreas Borutta wrote:
>>> Es wird mir wohl nix übrig bleiben als 30mal Copy&Paste zu bemühen.
>>
>> Oder Du bemühst 1mal ein XSLT-Tutorial Deines geringsten Misstrauens.
>
> Ich habe mich inzwischen näher mit dem Problem beschäftigt und dabei
> gemerkt, dass aufgrund des Default-XHTML-Namespace das Extrahieren aus
> XHTML-Dokumenten im Unterschied zum Extrahieren aus XML-Dokumenten (kein
> Namespace notwendig) nicht trivial ist.

Danke für Deine Hinweise und Beispiele und auch für Deine
Aufrichtigkeit, dass es - wider Erwarten - nicht trivial war.

Ich konnte die Aufgabe mit Peters Hinweis zu Textpad auf Anhieb lösen.

Sollte XSLT einmal für mich wichtig werden, werde ich Dein Posting als
Anregung aufgreifen.

Gruß, Andreas

Thomas 'PointedEars' Lahn

unread,
Jan 5, 2012, 9:23:56 PM1/5/12
to
Löst Textpad auch das Problem, dass das resultierende Dokument dann mehrere
Überschriften 1. Ordnung (h1-Elemente) hat (bzw. haben sollte, da jedes
einzelnde Dokument eins haben sollte), was zwar gültiges XHTML, aber
semantisch Unfug ist? Wie sieht es mit XHTML 1.0/1.1 Strict vs. 1.0
Transitional aus? Was passiert mit den Namespaces?

--
PointedEars

Andreas Borutta

unread,
Jan 6, 2012, 4:23:49 AM1/6/12
to
Thomas 'PointedEars' Lahn schrieb:
Nein, solche Dinge löst die Funktion von Textpad erwartungsgemäß
nicht.

Da die Markup-Qualität des originalen ePubs eh unterirdisch ist und -
für ein Experiment - demnach reichlichst Reinigung bedarf, fällt das
Anpassen der Überschriften unter "Kleinigkeit".

Andreas

Andreas Borutta

unread,
Jan 6, 2012, 4:47:11 AM1/6/12
to
Andreas Borutta schrieb:
Mittlerweile habe ich noch eine weit komfortablere Methode gefunden,
wo noch dazu das Werkzeug frei benutzbar ist.

Das Werkzeug heißt Calibre.

1
Buch in Calibre öffnen

2
"Bücher konvertieren > Auf einmal konvertieren > Ausgabeformat: HTMLZ"

Calibre erzeugt daraufhin eine Datei "buchname.htmlz".
Dies ist ein ZIP-Archiv. Wenn man die Endung nach "zip" ändert und
entpackt, befindet sich in diesem Archiv eine einzige Datei
index.html.
In ihr steckt der Quelltext sämtlicher XHTML-Dateien.

Andreas
Message has been deleted

Peter Mueller

unread,
Jan 6, 2012, 7:15:30 AM1/6/12
to
Andreas Borutta schrieb am 06.01.2012 00:48:
> Danke. :) Klappte auf Anhieb.

Freut mich! Viele Grüße,

Peter

Martin Honnen

unread,
Jan 14, 2012, 6:16:20 AM1/14/12
to
Thomas 'PointedEars' Lahn wrote:

> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> xmlns:xhtml="http://www.w3.org/1999/xhtml"
> xmlns="http://www.w3.org/1999/xhtml">
> <xsl:output method="xhtml"/>

Nur so am Rande, die in XSLT 1.0 definierten Ausgabemethoden sind "xml",
"html" und "text", eine Ausgabemethode "xhtml" gibt es nur in XSLT 2.0.
Also gibt dein Beispiel
"http://pointedears.de/markup/xml/XSL/include.xml" in Firefox nur ein
"Error loading stylesheet: Parsing an XSLT stylesheet failed." im
Browserfenster, in der Fehlerkonsole ist dann "Error:
Source File: http://pointedears.de/markup/xml/XSL/include-from-xml.xsl
Line: 6, Column: 31
Source Code:
<xsl:output method="xhtml"/>"
dargestellt.
So du XHTML mit XSLT 1.0 ausgeben willst, empfiehlt sich die
Ausgabemethode "xml".
0 new messages