[XSL] Verschachtelte Elemente ausgeben

kaepten

Lt. Commander
Registriert
Apr. 2005
Beiträge
1.549
Wie transformiere ich dieses XML
Code:
<Root>
    <content>Anfang des Textes <b>das wäre dann fett</b> und hier ginge der Text weiter</content>
</Root>
Dass ich den Text anstelle von fett z.B. kursiv ausgeben kann? Mein exemplarisches Testbeispiel XSL um die <b> Stelle aufzufinden:
Code:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="content">
        <xsl:value-of select="."  />
        <xsl:apply-templates select="b"/>
    </xsl:template>
    
    <xsl:template match="b">
    TEST
    </xsl:template>

</xsl:stylesheet>
Hiermit wird immer TEST am Ende der Zeile ausgeben, was auch logisch ist. Ich will jedoch erreichen, dass alles was in <b>...</b> enthalten ist, mit TEST ersetzt wird. Aber wie greife ich das <b> innerhalb des Textes ab?

Vielen Dank für Antworten
kaepten
 
Auf den Inhalt des b-Elements greifst du mit

Code:
<xsl:apply-templates select="b"/>

zu, andernfalls würde der XSL-Prozessor ja nicht am Ende TEST ausgeben. Was du erreichen willst ist ja, daß der Prozessor den Inhalt von content übernimmt und den Inhalt von b übernimmt und in ein i-Element packt:

Code:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">

    <xsl:template match="content">
        <xsl:apply-templates/>
    </xsl:template>
    
    <xsl:template match="b">
        <xsl:element name='i'>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

xsl:apply-templates wendet auf den Inhalt des Elements Templates an, sofern welche existieren, für Kindselemente ohne Templates wird der Inhalt as-is übernommen.

greetings, Keita
 
Danke Keita

Ich glaube ich verstehe. Die "normale" Textausgabe, die ja auch erfolgt über
Code:
<xsl:apply-templates />

ruft implizit ein Standard Template auf, nehm ich an. Ansonsten würde der Text ausserhalb des <b> tags ja nicht ausgegeben. Wie sieht es denn aus, bzw. welches sind die Standard Templates? Sind das viele?

Wobei es ja geht, aber mehr Wissen als grad eine Zeile Code ist immer besser :D
 
Es gibt u.a. folgende Regeln, die in diesem Fall greifen:
  • wenn ein Template auf ein Element angewandt wird, werden auch die Kindselemente verarbeitet
    [*wenn ein Template auf ein Text-Element angewandt wird, wird dessen Inhalt wiedergegeben

In deinem Fall findet apply-templates folgende Struktur vor:
Code:
(textnode1/)
(b)
  (textnode2/)
(/b)
(textnode3/)

Das bedeutet, daß
1. der Prozessor textnode1 findet und as-is ausgibt
2. der Prozessor b-node findet und das Template für b anwendet
2a. das Template für b textnode2 findet und es as-is ausgibt
3. der Prozessor textnode3 findet und es as-is ausgibt

greetings, Keita
 
Zurück
Oben