Eingebette Elemente in laufendem Text erkennen und behandeln
cyclo
- xsl
Ich möchte Elemente in laufendem Text erkennen und wie folgt behandeln.
Beispiel XML:
<buch>
<text>
Im Inhalt kann man folgendes finden:
<inhaltsverzeichnis>
<num>1.</num><kap>Einleitung</kap>
<num>2.</num><kap>Hauptteil</kap>
<num>3.</num><kap>Schluss</kap>
</inhaltsverzeichnis>
Anschliessend gehts mit der Geschichte los.
</text>
</buch>
Soll zu folgendem HTML umgebaut werden (exemplarisch)
<html>
<body>
<p>Im Inhalt kann man folgendes finden:</p>
<table>
<tr><td>1. Einleitung</td></tr>
<tr><td>2. Hauptteil</td></tr>
<tr><td>3. Schluss</td></tr>
</table>
<p>Anschliessend gehts mit der Geschichte los.</p>
</body>
</html>
Das Problem liegt nun im Satz "Anschliessend gehts mit der Geschichte los.".
Innerhalb eines Absatztes <p>...</p>
ist eine Tabelle in HTML (oder nehmt eine beliebige andere DTD) nicht erlaubt. Der erwähnte Satz als auch der erte Satz "Im Inhalt kann man folgendes finden:" muß deshalb jeweils in ein eigenes <p>...</p>
-Paar gepackt werden. Die Frage ist nun, wie kann ich in XSLT ein Konstrukt bauen, dass erkennt dass innerhalb von <text>
ein <inhaltsverzeichnis>
steht, es entsprechend behandelt und den Text vor und nach <inhaltsverzeichnis>
gesondert ein ein anderes Element (hier <p>...</p>
) einpackt.
Natürlich kann man zu Beginn von <inhaltsverzeichnis>
erst einmal ein </p>
ausgeben und nach dem Ende ein <p>
, so dass beim Auftreten von <inhaltsverzeichnis>
immer folgendes Konstrukt erscheint:
<p>...</p>
<table>...</table>
<p>...</p>
Das hat aber den Nachteil, dass falls vor <inhaltsverzeichnis>
oder nach </inhaltsverzeichnis>
im XML kein Text kommt (kann ja auch sein), immer ein leeres Absatzpärchen <p></p>
ausgegeben wird - wäre nicht schön. Ausserdem meckert der XSLT compiler das an, der Umweg über <xsl:text>
ist ebenfalls unschön und führt zu zusätzlichen Leerzeichen in der Ausgabe :-(
Ich wäre sehr froh über Hilfe aus dem Forum, Danke!
Ein entsprechendes Template, das aber ein falsches HTML erzeugt, wäre:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html><head></head><body>
<xsl:apply-templates />
</body></html>
</xsl:template>
<xsl:template match="text">
<p><xsl:apply-templates /></p>
</xsl:template>
<xsl:template match="inhaltsverzeichnis">
<table>
<xsl:apply-templates />
</table>
</xsl:template>
<xsl:template match="eintrag">
<tr><td><xsl:value-of select="." /></td></tr>
</xsl:template>
</xsl:stylesheet>