Hi,
ich versuche gerade, eine kleine Navigation zu basteln - es gibt einen Haufen Namen in einer Liste, es soll obendrüber eine Liste der vorhandenen Anfangsbuchstaben kommen, die dann als Links dienen sollen, damit man schnell z.B. zu den mit W beginnenden Namen kommt (also eine Buchstabenleiste).
Das versuche ich so zu lösen:
Für das erste Element (position 1) wird der Link auf jeden Fall ausgegeben.
Für die weiteren Elemente wird der Link nur dann ausgegeben, wenn der Anfangsbuchstabe sich vom Anfangsbuchstaben des vorherigen Elements unterscheidet.
Das Problem dabei ist der Zugriff auf das in der Sortierreihenfolge vorherige Element.
Wenn ich die Position des aktuellen Elements um 1 verringert für den Zugriff benutze, bekomme ich das entsprechende Element aus der XML-Dokumentreihenfolge, nicht aus der Sortierreihenfolge.
Was muß ich machen, um auf das vorherige Element bezüglich der Sortierreihenfolge zugreifen kann?
Oder gibt es einen besseren (weil funktionierenden) Weg, das zu lösen?
Eine Sortierung der XML-Daten kommt nicht in Frage, da das gleiche Spielchen noch mit anderen Attributen gemacht werden soll - das Dokument müßte also gleichzeitig in verschiedenen Sortierungen vorliegen...
Hier der Ausschnitt aus dem XSL:
<!-- das aufrufende Template, das für die Sortierung sorgt -->
<xsl:template match="allelems">
<!-- diverser anderer Kram, der mit dem Problem nichts zu tun hat... -->
<xsl:apply-templates select="elem" mode="shortnavi">
<xsl:sort select="@name"/>
</xsl:apply-templates >
<!-- diverser anderer Kram, der mit dem Problem nichts zu tun hat... -->
</xsl:template>
<!-- das Template, das die Kurz-Navigation erzeugen soll -->
<xsl:template match="elem" mode="shortnavi">
<!-- $current enthält erstes Zeichen des name-Attributs als Großbuchstabe) -->
<xsl:variable name="current" select="translate(substring(@name,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')"/>
<!-- $thispos enthält Position des Elements (minus 1) entsprechend der Sortierung -->
<xsl:variable name="thispos" select="position()-1"/>
<!-- falls nicht das erste Element: -->
<xsl:if test="$thispos>0">
<!-- $current sollte das erste Zeichen des Vorgängers enthalten -->
<!-- leider wird aber die Position auf die Reihenfolge der Elemente im XML bezogen, nicht auf die sortierte Reihenfolge -->
<xsl:variable name="previous" select="translate(substring(../elem[$thispos]/@name,1,1),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />
<!-- was muß ich ändern, damit ich an das vorherige Element in der Sortierreihenfolge komme? -->
<!-- bei nicht-Übereinstimmung: Link erzeugen -->
<xsl:if test="$previous != $current">
<a href="#label{$current}"><xsl:value-of select="$current"/></a>
</xsl:if>
</xsl:if>
</xsl:template>
cu,
Andreas
MudGuard? Siehe http://www.Mud-Guard.de/