Christian Seiler: CSS-Klasse aus mehreren Werten zusammensetzen

Beitrag lesen

Hallo!

<xsl:template match="menuItem" mode="subnav">
<li>
  <xsl:attribute name="class" value="" />
  <xsl:if test="@href = $current_file_path">
   <xsl:attribute name="class"><xsl:value-of select="concat(@class,' current')" /></xsl:attribute>
  </xsl:if>
  <xsl:if test="position()=1">
   <xsl:attribute name="class"><xsl:value-of select="concat(@class,' first')" /></xsl:attribute>
  </xsl:if>
<!-- ... etc. -->

Du solltest eher so etwas machen:

<xsl:template match="menuItem" mode="subnav">  
  <li>  
     <xsl:attribute name="class">  
       <xsl:if test="@href = $current_file_path">  
         <xsl:value-of select="' current'" />  
       </xsl:if>  
       <xsl:if test="position() = 1">  
         <xsl:value-of select="' first'" />  
       </xsl:if>  
     </xsl:attribute>  
     <!-- etc. -->  
</xsl:template>

Du hast bei Deinem Versuch zwei Dinge nicht beachtet:

  1. XSL ist eine funktionale Programmiersprache, d.h. Du kannst nicht einfach etwas Setzen und hinterher ändern. Selbst wenn Du zweimal hintereinander xsl:variable mit dem gleichen Namen hast, deklarierst Du im Endeffekt ZWEI Variablen, wobei die erste nur bis zum Auftauchen der zweiten sichtbar ist.

  2. XPath-Selektoren beziehen sich immer auf den Quell-Dokumentbaum, d.h. @class matcht garantiert *nicht* das class-Attribut des *generierten* Knotens - sondern höchstens ein potentiell existierendes class-Attribut des aktuellen Knotens im Quelldokument.

Viele Grüße,
Christian