# XSL/XPath - Nur ersten Wert mit selben Attribut



## miketech (28. Sep 2005)

Hi zusammen,

ich sitz gerade vor einem XML / XSLT Problem, vielleicht hat jemand von Euch ja eine Idee.

Wenn ich folgenden Baum habe:


<irgendwas>
<knoten id="1" value="x"/>
<knoten id="2" value="x"/>
<knoten id="3" value="y"/>
</irgendwas>

Jetzt möchte ich mit XSL nur die Knoten, die unterschiedliche Values haben, also ich möchte Knoten mit ID 1 und mit ID 3. Die ID 2 möchte ich nicht, da ich X bereits mit ID 1 abgedeckt habe.

Meine Idee war jetzt mit for-each (ich bin gerade am Knoten "irgendwas"):

<xsl:for-each select="knoten[@id=../knoten[@value=current()/@value][1]/@id]">

   ...irgendwas

</xsl:for-each>

D.h. ich hätte alle knoten abgefragt, die die ID des ersten Knotens mit selbigem Value haben. Das geht aber so nicht, da current() mir wohl den falschen Knoten zurückliefert. Ich muss ja bei [@value=current()/@value] mit dem Value des Knoten vergleichen, den ich gerade angesprochen habe. Hat jemand eine Idee, wie ich das realisieren kann?

Gruß

Mike


----------



## Bleiglanz (28. Sep 2005)

sollte mit xsl:key gehen

so ala

<xsl:key name="verschiedeneValues" match="knoten" use="@value"/>

usw, ist leider immer kompliziert


----------



## miketech (28. Sep 2005)

Das war das passende Stichwort! Danke!!

Mike


----------



## miketech (28. Sep 2005)

Hi,

leider gibts doch noch ein Problem. Prinzipiell geht das schon in die richtige Richtung. 

Wenn ich meine Struktur etwas verkompliziere:


```
<irgendwas>
<knoten id="1" value="x">
  <knoten id="4" value="x"/>
  <knoten id="5" value="y"/>
</knoten>
<knoten id="2" value="x"/>
<knoten id="3" value="y"/>
</irgendwas>
```

Ich möchte immer noch gerne nur die Knoten der aktuellen Ebene, wo ich bin, d.h. ich möchte immer noch die Knoten mit der ID 1 und 3. Allerdings entfernt mir key nun auch den mit der ID 3, da er bereits "y" in der ID 5 gefunden hat. Ich  müsste key irgendwie sagen können, dass es nur auf der aktuellen Ebene suchen soll, nicht im ganzen Dokument. Kann ich das irgendwie einschränken?


Derzeit habe ich es so versucht:

<xsl:key name="knotenValues" match="knoten" use="@value"/>
<xsl:for-each select="predicate[generate-id(.)=generate-id(key('predicateValues', @value)[1])]">


Gruß

Mike


----------



## miketech (28. Sep 2005)

Hi,

ich habs  Ich hab noch als Bedingung [../@id=$id] ergänzt, wobei $id die ID des Vaterknotens ist. Somit kann ich sichergehen, dass er nicht in der Tiefe sucht.

Danke nochmal und Gruß

Mike


----------

