Hallo (nochmal),
bin schwer begeistert!
*hüstel* ehmm... ja. Danke ;-)
Jetzt muss ich mich mal durch die Änderungen arbeiten, um zu begreifen, was du gemacht hast.
<xsl:key name="namen" match="addressbook/member" use="name" />
Erstellt einen Knotenset, der alle addressbook/member-Elemente enthält. Als Wert des Schlüssels wird der name-element verwendet.
<xsl:for-each select="member[generate-id(.) != generate-id(key('namen', name))]">
Selektiert alljenige member-Elemente wo der generierte ID für's (gegenwertigen) Element nicht mit dem generierten ID eines Elements aus dem - vom key() - Knotenset übereinstimmt; als Vergleichsbasis dient das name-Element des gegenwertigen member-Elements
-----
es wäre hier egal gewesen, ob ich in deinem Fall [generate-id(.) != generate-id(key('namen', name))] oder generate-id(.) = generate-id(key('namen', name))] nehme.
Wenn du mehr als zwei name-Elemente mit demselben Namen hast nimm aber: <xsl:for-each select="member[generate-id(.) = generate-id(key('namen', name))]"> !
-----
<xsl:when test="position() mod 2 = 0">
Nachdem in die for-each-Schleife nur noch Elemente sind, von denen kein Duplikat mehr gibt (all das natürlich im Bezug zu member/name), kann man die Position der einzelnen Knoten in der Schleife bestimmen, deshalb kann jedes zweite Element mit einer anderen Farbe hintergelgt werden.
<xsl:for-each select="key('namen', name)">
Greift auf die Knoten zu, die im Knotenset vom key() als Wert des name-Elements denselben Wert haben wie das name-Element im gegenwertigen Element (--> das wurde ja durch das vorige for-each bestimmt).
Wenn es mehrere solche übereinstimmende Knoten im Knotenset vom key() gefunden werden, werden die Vorgaben im for-each für jede der Knoten (aus dem Knotenset vom key) angewendet.
Und im for-each kannst du dann auch wiederum sortieren etc.
Grüße
Thomas