So ermitteln Sie die Position eines Navigationspunktes

Dieser Artikel beschreibt, wie Sie die Position eines Navigationspunktes ermitteln können, um so z.B. den ersten und/oder letzten Navigationspunkt anders gestalten zu können.

Um in einer Navigation den ersten bzw. letzten Navigationspunkt im Menü anders darzustellen, greifen Sie einfach auf die Bordmittel von XSLT zurück. Nachfolgendes Beispiel führt an, wie Sie den letzten Navigationspunkt eines Levels z.B. mit einer anderen Klasse versehen können. Hierzu wird die xPath-Funktion position() verwendet, die die Position eines Knotens ermittelt, also z.B. auch den ersten (first: "position() = 1") oder letzten (last: "position() = last()").

...
  <xsl:template match="/wNavigation">
    <div>
      <!-- Hier steht später die generierte Navigation -->
      <xsl:apply-templates select="/wNavigation/navPoint"/>
    </div>
  </xsl:template>

  <!--Dieses Template wird auf jeden Navigtionspunkt des ersten Levels angewandt-->
  <xsl:template match="/wNavigation/navPoint">
    <xsl:choose>
      <xsl:when test="@selected = '1'">
        <a class="navLevel1Selected" href="{@link}{@navidExtIfNeeded}">
          <xsl:if test="@target != ''"><xsl:attribute name="target"><xsl:value-of select="@target"/></xsl:attribute></xsl:if>
          <xsl:value-of select="@text"/>
        </a>
      </xsl:when>
      <xsl:otherwise>
        <a class="navLevel1" href="{@link}{@navidExtIfNeeded}">
          <xsl:if test="@target != ''"><xsl:attribute name="target"><xsl:value-of select="@target"/></xsl:attribute></xsl:if>
          <xsl:if test="position() = last()"><xsl:attribute name="class">navLevel1Last</xsl:attribute></xsl:if>
          <xsl:value-of select="@text"/>
        </a>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
...

Wollen Sie zu einem bestimmten Navigationspunkt (z.B. Unternehmen) z.B. die ersten beiden Unterpunkte hervorheben, kann dies so aussehen (Auszug aus sub.wNavigation.php, Stelle: test="position()&lt;= 2 and ancestor::navPoint/@text = 'Unternehmen'"):

...
  <!--Dieses Template wird auf jeden Navigtionspunkt des zweiten Levels angewandt-->
  <xsl:template match="/wNavigation/navPoint/navPoint">
  
    <xsl:choose>
      <xsl:when test="@selected = '1' and @open = '1' and count(child::*) > 0">
        .....
      </xsl:when>
      <xsl:otherwise>
        <li class="navLevel2">
          <a class="navLevel2" title="{@title}" href="{@link}{@navidExtIfNeeded}">
            <xsl:if test="@target != '' and @target != '_self'"><xsl:attribute name="target"><xsl:value-of select="@target" /></xsl:attribute></xsl:if>
            <xsl:if test="position()&lt;= 2 and ancestor::navPoint/@text = 'Unternehmen'"><xsl:attribute name="class">navLevel2Important</xsl:attribute></xsl:if>
            <xsl:value-of select="@text"/>
          </a>
        </li>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
...