cyclo: Eingebette Elemente in laufendem Text erkennen und behandeln

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>