XML - XSL: nummerierte Liste

saturn

Grünschnabel
Hallo Zusammen!

Ich habe ein Problem und hoffe Ihr könnt mir helfen.

Vorgegeben ist folgende XML - Struktur (vereinfacht):
Code:
<provider>
 <offer id="1" name="a">
  <location id="12345" name="abc" />
 </offer>
 <offer id="2" name="b">
  <location id="12345" name="abc" />
 </offer>
 <offer id="3" name="c">
  <location id="67890" name="def" />
 </offer>
</provider>
Nun will ich eine Liste aller <location> erstellen. In dieser soll jede <location> nur einmal vorkommen und diese sollen duchnummeriert werden. Die angegebene Id ist eindeutig, der Name nicht.

Die Liste erstelle ich mit:
Code:
<xsl:for-each select="//location">
    <xsl:value-of select="@name" />
</xsl:for-each>
Weiter komme ich allerdings nicht.

Danke für Eure Hilfe!
saturn
 
Hi.

Versuch's mal so:
XML:
<xsl:key name="id" match="location" use="@id" />

<xsl:for-each select="//location[generate-id() = generate-id(key("id", @id)[1])]">
    <xsl:value-of select="position()" /><xsl:value-of select="@name" />
</xsl:for-each>
Gruß
 
Zuletzt bearbeitet von einem Moderator:
Hallo deepthroat,

Danke für Deine Hilfe!

Es funktioniert einwandfrei und ich merke mal wieder, dass ich es viel zu kompliziert angegangen bin.

Gruß
saturn
 
Hallo zusammen,

jetzt ist nochmals eine Frage in diesem Zusammenhang aufgekommen.

Kann ich an anderer Stelle die Nummerierung dieser Liste abfragen? Also kann ich folgende Ausgabe erzielen:
Code:
    offer 1 - location 1
    offer 2 - location 1
    offer 3 - location 2
Oder geht dies nicht?

Danke und Grüße
saturn
 
Hallo zusammen,

jetzt ist nochmals eine Frage in diesem Zusammenhang aufgekommen.

Kann ich an anderer Stelle die Nummerierung dieser Liste abfragen? Also kann ich folgende Ausgabe erzielen:
Code:
    offer 1 - location 1
    offer 2 - location 1
    offer 3 - location 2
Ja, das geht:
XML:
<xsl:value-of select="count((location | preceding-sibling::offer/location)[generate-id() = generate-id(key('id', @id)[1])])" />
Gruß
 
Zuletzt bearbeitet von einem Moderator:
Hallo deepthroat,

mit count zähle ich doch alle Elemente der Liste, oder?

Mein Ziel ist es jedoch die Nummer, welche das einzelne Element in der Liste erhalten hat, auszugeben. Also:
Code:
Orte_Liste:  
      1 abc
      2 def  
    
  Angebot a:  1     
  Angebot b:  1
  Angebot c:  2

Gruß
saturn
 
Hallo deepthroat,
ich komme einfach auf keinen grünen Zweig. Vorallem verstehe ich Deinen XSL - Code nicht:
XML:
<xsl:value-of select="count((location | preceding-sibling::offer/location)[generate-id() = generate-id(key('id', @id)[1])])" />

  • count() -> zählen
  • location[Nummer] -> Zugriff auf Knoten location[Nummer]
  • preceding-sibling::eek:ffer/location[Nummer] -> Zugriff auf den offer/location[Nummer] Vorgängerknoten des aktuellen Knotens
Also werden ausgehend von der aktuellen Position die im XML - Dokument vorhanden Knoten <locations> oder ihre Vorgänger <offer/location> gesucht und gezählt.

:confused: Stimmt dies :confused:

Gruß
saturn
 
Zuletzt bearbeitet von einem Moderator:
  • count() -> zählen
  • location[Nummer] -> Zugriff auf Knoten location[Nummer]
  • preceding-sibling::eek:ffer/location[Nummer] -> Zugriff auf den offer/location[Nummer] Vorgängerknoten des aktuellen Knotens
Also werden ausgehend von der aktuellen Position die im XML - Dokument vorhanden Knoten <locations> oder ihre Vorgänger <offer/location> gesucht und gezählt.

:confused: Stimmt dies :confused:
Ja (aber nur die eindeutigen Vorgänger), das ist doch genau das was du wolltest. Oder? ;)

Gruß
 
Ja (aber nur die eindeutigen Vorgänger), das ist doch genau das was du wolltest. Oder? ;)

Ah, ok! Wir haben etwas aneinander vorbei geredet!

Also ich habe folgendes XML - Dokument (vereinfacht):
Code:
<test>
  <provider>
   <offer id="1" name="a">
    <location id="67890" name="def" />
    <location id="12345" name="abc" />
   </offer>
   <offer id="2" name="b">
    <location id="12345" name="abc" />
   </offer>
   <offer id="3" name="c">
    <location id="12345" name="abc" />
    <location id="67890" name="def" />
   </offer>
  </provider>
  <provider>
   <offer id="4" name="d">
    <location id="23456" name="xyz" />
    <location id="78901" name="uvw" />
   </offer>
   <offer id="5" name="e">
    <location id="78901" name="uvw" />
    <location id="67890" name="def" />
   </offer>
  </provider>
</test>

Ziel ist folgendes:
Code:
Orte_Liste:  
 1 def 
 2 abc 
     
Angebot a: 1, 2   
Angebot b: 2
Angebot c: 2, 1  
  
Orte_Liste:  
  1 xyz 
  2 uvw 
  3 def
     
Angebot d: 1, 2
Angebot e: 2, 3

Es soll also nicht gezählt werden, sondern beim jeweiligen Angebot die entsprechende Nummer des Ortes aus der Liste stehen.

Gruß und Danke für Deine Hilfe
saturn
 

Neue Beiträge

Zurück