becherglas: Problem bei Templates für bold, italic ...

Hallo,

hänge wieder mal fest *hrr*

und zwar geht es um Folgendes: Ich habe einen Text indem mittendrin Teile mit einem <b>....</b> versehen sind.
Nun möchte ich dass diese Elemente ebenfalls in HTML so ausgegeben werden. Dazu habe ich in etwa (vereinfacht) folgende Templates angelegt.
Jedoch gibt er mir dann die Teile des Textes die sich zwischen den Einzelnen und nach dem Letzten <b> bzw. <i> Tag befinden nicht mehr aus. Wenn ich apply-templates ohne select Anweisung abrufe geht es zwar allerdings haut er dann auch gleich alle anderen xml Elemente mitrein.

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>

<xsl:template match="b">
      <b><xsl:value-of select="."/></b>
   </xsl:template>

<xsl:template match="i">
      <i><xsl:value-of select="."/></i>
   </xsl:template>

Danke!
Mfg
Johannes

  1. 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

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

      Ich merke mir mangeld es noch etwas am Verständnis aber so isses nunmal mit allem neuen. Jedenfalls danke für die hilfe thomas.
      Oben zitiertes funktioniert übrigens einwandfrei. nochmals danke!

      ciao