Thomas J.S.: mit xsl im xml nach elementen mit attributen suchen und ausgeben

Beitrag lesen

Hallo,

okay wegen a) großer Fehler von mir.
zudem habe ich deinen weg unter b) angewendet und auch inhaltlich nachvollzogen. trotzdem greift der filter nicht, es werden wieder alle Element angezeigt, ob doch eigentlich nur die mit booking BFV100 angezeigt werden sollen. hier dies angepasste xsl (habe die tabelle aus Gründen der Übersichtlichkeit entfernt.

Das ist logisch, denn es wird nur überprüft, ob irgendeine der Elemente @booking=.... hat und weil/wenn das der Fall ist, wird alles ausgegeben.

Als gewünschtes Ergbnis würde ich gerne das Ergebnis haben wollen:

Jetzt verstehe ich was du möchtest:
Es empfiehlt sich eine globale Variable zu erstellen (d.h. gleich nach <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">)

<xsl:variable name="booking" select="'BFV100'" />

Und dann so:
<xsl:template match="root">
 <!-- <xsl:if test="*[@booking= $booking]"> -->
 <form>
  <xsl:for-each select="*">
   <p>
    <xsl:value-of select="local-name()" />:
    <xsl:if test="@booking= $booking">
     <xsl:value-of select="." />
    </xsl:if>
   </p>
 </form>
 <!-- </xsl:if> -->
</xsl:template>

Ich habe die if-Abfrage auskommentiert, du brauchst sie nur dann, wenn es überhaupt nichts ausgegeben werden soll, falls bei keinem einzigen Element ein @booking-Attribut vorhanden ist.

Willst du nicht den Namen des Elements ausgeben, sondern einen eigenen Text, muss du entweder für jede Element eine Abfrage schreiben:
<p>hosen:
<xsl:if test="hosen[@booking= $booking]">
  <xsl:value-of select="hosen" />
</xsl:if>
</p>
<p>taschen:
 <xsl:if test="tasche[@booking= $booking]">
   <xsl:value-of select="tasche" />
</xsl:if>
</p>

oder wenn du das XML erweitern kannst z.B. so: <hosen name="Hosen">...</hosen>, dann einfach statt  <xsl:value-of select="local-name()" />: ein <xsl:value-of select="@name" />: schreiben im obigen Template.

Entsprechend geht das auch mit einer Tabelle:
<xsl:template match="root">
 <!-- <xsl:if test="*[@booking= $booking]"> -->
 <xsl:for-each select="*">
 <tr>
  <td width="20%">
   <xsl:value-of select="local-name()" />
  </td>
  <td width="20%">
   <xsl:if test="@booking= $booking">
    <xsl:value-of select="." />
   </xsl:if>
  </td>
 </tr>
 </xsl:for-each>
 <!-- </xsl:if> -->
</xsl:template>

Grüße
Thomas