ritschmanhard: XSL für Dummies

Beitrag lesen

Hi Roli!

Wenn jetzt meine beiden Listen noch mehrere Attribute hätten, würde das Beispiel diese auch ausgeben oder hab ich das falsch verstanden?

Ja, es werden die Inhalte aller Knoten ausgegeben, die in der Hierarchie-ebene auf dem Level des <myid> (Randbedingung: nach myid) Knotens liegen.

Wenn ich sichergehen möchte, dass aus den Listen nur Name und Preis ausgegeben werden, wäre dann meine Variante auch korrekt ?

Nein, wäre sie (leider) nicht:

Dieser Block ist noch OK: Ermittle für jedes <produkt> den Inhalt des <myid> Knotens und rufe damit die Schleife(n) auf:

<xsl:for-each select="//produkt/myid">
   <xsl:call-template name="SchleifeProdukt">
    <xsl:with-param name="Ident" select="." />
   </xsl:call-template>
  <xsl:call-template name="SchleifePreis">
    <xsl:with-param name="Ident" select="." />
   </xsl:call-template>
  </xsl:for-each>

Jetzt wird's leider falsch (beide Schleifen gleich...):

<xsl:template name="SchleifeProdukt">
<xsl:param name="Ident" />
<tr>
  <td>ident: <xsl:value-of select="$Ident"/></td>
  xsl:choose
    <xsl:when test="$Ident = /produkte/produkt/myid">
      <td>
       <xsl:value-of select="/produkte/produkt/name"/>
      </td>
      </xsl:when>
   </xsl:choose>

</tr>
</xsl:template>

Du forderst hier: WENN die oben ermittelte myid übereinstimmt mit dem _ersten_ Knoten, der der Form /produkte/produkt/myid genügt, dann gib den Inhalt des _ersten: Knotens aus, der der Form /produkte/produkt/name genügt.

Somit wird durch dein Beispiel mit jeder myid gegen den ersten Knoten des xml Dokuments abgeglichen und wenn Gleichheit der myid besteht (nur einmal der Fall) dann wird dieser Knoten ausgegeben.

Die korrekte Modifikation meines Beispiels müsste lauten - unter der Voraussetzung, dass name und akt nur einmal vorkommen und nicht sortiert wird (d.h. wenn der akt Knoten vor dem name Knoten kommt, wird er zuerst ausgegeben)
...
<xsl:when test="$Ident = ./.">
     <xsl:for-each select="./following-sibling::*[name()='name' or name()='akt']">
      <td>
       <xsl:value-of select="./."/>
      </td>
     </xsl:for-each>
</xsl:when>
...

Sollte eine Sortierung fällig werden, so weise ich noch drauf hin, dass bei dem  <xsl:for-each select="./following-sibling::*[name()='name' or name()='akt']">
eine <xsl:sort ...> Konstruktion folgen könnte; diese ist aber komplex (kann ich nicht aus dem Ärmel schütteln) und hat dann auch nicht
Name1 Preis1
Name2 Preis2
als Folge, sondern
Name1  Name2
Preis1 Preis2

Viels Spass,
Richard