Thomas J.S.: XSL-If Anweisung

Beitrag lesen

Hallo,

Habe zwei Fragen zu einer XSL-IF-Anweisung....
Ich will, dass wenn eine bestimmte Zeichenkette in einem XML-Tag vorkommt der Eintrag fett gedruckt wird.
Ich habe versucht es so zu machen:
<xsl:if test="tag = 1"> <b> </xsl:if>
Am Ende soll der <b> Tag wieder geschlossen werden...
<xsl:if test="tag = 1"> </b> </xsl:if>
Aber das geht nicht ;) !

<xsl:if test="tag = 1">
 <b>
  andere XSL-Anweisungen wie z.B: <xsl:value-of select="tag" />
 </b>
</xsl:if>

Wie kann ich den IF Operator auf "ähnlich" stellen? Also dass die Einträge nicht genau verglichen werden, sondern die Anweisung auch ausgeführt wird wenn das Wort innerhalb des XML-Eintrags vorkommt. Klar? :)
Bsp.:
Im XML Tag steht folgendes: <bsptag>hallolalawas</bsptag>
Wie muss ich die IF-Anweisung formulieren damit die IF Anweisung ausgeführt wird, ich den Eintrag aber nur nach "hallo" absuchen will?

<xsl:if test="bsptag = hallo">b </xsl:if>

Entweder du machst ein Einfach:
<xsl:if test="contains(bsptag, 'hallo')">
 <b>
  <xsl:value-of select="bsptag" />
 </b>
</xsl:if>

oder etwas ausgefeilter wegen Groß- und Kleinschreibung:
<xsl:if test="contains(translate(bsptag, 'ABCDEFGHIJKLMNOÖPQRSTUÜVWXYZ', 'abcdefghijklmnoöpqrstuüvwxyz'), 'hallo')">
 <b>
  <xsl:value-of select="bsptag" />
 </b>
</xsl:if>

Aber wenn du daruf "versessen" bist, nur den gesuchten Text fett zu markieren, muss du mit einem rekursiven Template arbeiten:
 <xsl:template match="Element">
  <xsl:call-template name="markieren">
   <xsl:with-param name="elem" select="." />
   <xsl:with-param name="suchtext" select="'Text der gesucht wird'" />
  </xsl:call-template>
 </xsl:template>

<xsl:template name="markieren">
  <xsl:param name="elem" />
  <xsl:param name="suchtext" />
  xsl:choose
   <xsl:when test="contains($elem, $suchtext)">
    <xsl:value-of select="substring-before($elem, $suchtext)" />
    <b><xsl:value-of select="$suchtext" /></b>
    <xsl:call-template name="markieren">
     <xsl:with-param name="elem" select="substring-after($elem, $suchtext)" />
     <xsl:with-param name="suchtext" select="$suchtext" />
    </xsl:call-template>
   </xsl:when>
   xsl:otherwise
    <xsl:value-of select="$elem" />
   </xsl:otherwise>
  </xsl:choose>
 </xsl:template>

dies berücksichtigt aber die Groß- und Kleinschriebung (d.h. wenn du nach "foo" suchst wird "Foo" oder "foO" nicht gefunden).

Grüße
Thomas