Thomas J.S.: Problem bei Templates für bold, italic ...

Beitrag lesen

Hallo Johannes,

Dazu habe ich in etwa (vereinfacht) folgende Templates angelegt.

"Vereinfacht" ist in den meinsten Fällen schlecht, weil oft steckt das Problem in den kleinen Details, die man bei solchen Vereinfachungen ausläßt.

Kann ich das irgendwie anders lösen oder hab ich einen Fehler drin?

<xsl:template match="text">
       <xsl:value-of select="."/>
      <xsl:apply-templates select="*"/>
   </xsl:template>

Das bewirkt folgendes:
erstens wird mit <xsl:value-of select="."/> der Textinhalt des Elements selektiert und ausgegeben, aber durch:
<xsl:apply-templates select="*"/> nur bis zum ersten Element-Knoten,
ab dort greift der <xsl:apply-templates /> und du selektierst mit select="*" alle Elemente innerhalb vom <text>.
Ein <xsl:apply-templates /> ruft alle Templatest an Ort und Stelle auf, also auch Templatest von Elementen, die nicht innerhalb vom <text> leigen.

Also entweder <xsl:apply-templates /> nur für das aktuelle Element (was die beste lösung ist):
<xsl:template match="text">
    <xsl:apply-templates select="."/>
</xsl:template>

oder explizit:
<xsl:template match="text">
    <xsl:apply-templates select="text() | b | i"/>
</xsl:template>

Warum du auf <xsl:value-of select="."/> bei der Verwendung von <xsl:apply-templates select="."/> verzichten kannst ist, dass mit <xsl:apply-templates select="."/> auch der build-in Template für text() greift.

<xsl:template match="b">

»    <xsl:template match="i">

Sie sind soweit ok.

Grüße
Thomas