Klaus: XSL Gruppierung / leere Gruppen herausfiltern

Hallo zusammen!

ich habe ein problem mit xsl gruppierungen. und zwar ist es so, dass ich folgende xml-struktur habe.

<?xml version="1.0"?>
<?xml-stylesheet href="filme.xsl" type="text/xsl" ?>
 <filme>
 <!-- tag 1 -->
 <film id="horror" tag="day1" titel="Horror-Movie1" />
 <film id="horror" tag="day1" titel="Horror-Movie2" />
 <film id="adult" tag="day1" titel="Adult-Movie1" />
 <film id="adult" tag="day1" titel="Adult-Movie2" />

<!-- tag2 -->
 <film id="horror" tag="day2" titel="Horror-Movie3" />
 <film id="horror" tag="day2" titel="Horror-Movie4" />

<!-- tag3 -->
 <film id="horror" tag="day3" titel="Horror-Movie5" />
 <film id="horror" tag="day3" titel="Horror-Movie6" />
 <film id="adult" tag="day3" titel="Adult-Movie3" />
 <film id="adult" tag="day3" titel="Adult-Movie4" />
 </filme>

hierbei soll eine unterteilung in tag/genre(id)/filmtitel erfolgen.
ich wende dazu folgendes stylesheet an:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key match="/filme/film" name="tagSchlüssel" use="@tag"/>
 <xsl:key match="/filme/film" name="genreSchlüssel" use="@id"/>

<xsl:template match="/">
  <xsl:for-each select="/filme/film[generate-id(.)=generate-id(key('tagSchlüssel',@tag)[1])]">
   <u>
    <b> Tag ** <xsl:value-of select="@tag"/></b>
   </u>
   <br/>

<xsl:variable name="tagSchlüsselID"  select="@tag"/>
   <xsl:for-each select="/filme/film[generate-id(.)=generate-id(key('genreSchlüssel',@id)[1])]">
    Genre :
    <b><xsl:value-of select="@id"/></b> **
    <br/>

<xsl:for-each select="key('genreSchlüssel',@id)[@tag=$tagSchlüsselID]">
     <br/>Filmtitel:
      <b><xsl:value-of select="@titel"/></b>
      <br/>
   </xsl:for-each>
   <br/>
   </xsl:for-each>
   <hr/>
  </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

als ergebnis erhalte ich folgendes:

Tag ** day1
Genre : horror **

Filmtitel: Horror-Movie1

Filmtitel: Horror-Movie2

Genre : adult **

Filmtitel: Adult-Movie1

Filmtitel: Adult-Movie2

--------------------------------------------------------------------------------
Tag ** day2
Genre : horror **

Filmtitel: Horror-Movie3

Filmtitel: Horror-Movie4

Genre : adult **

--------------------------------------------------------------------------------
Tag ** day3
Genre : horror **

Filmtitel: Horror-Movie5

Filmtitel: Horror-Movie6

Genre : adult **

Filmtitel: Adult-Movie3

Filmtitel: Adult-Movie4

nun das problem: wie kann ich es hinbekommen, dass die überschriften für leere gruppen (hier: day2/adult; es kann sich aber auch um das genre "horror" handeln) nicht ausgegeben werden???

wäre für jede hilfe dankbar,

grüsse

Klaus

  1. Hi Klaus!
    Ich habe noch nie mit dem hier vorgestellten key/generate-id system gearbeitet, aber:
    Hier iterierst du ja über die Genres (lies weiter bei *):

    <xsl:for-each select="/filme/film[generate-id(.)=generate-id(key('genreSchlüssel',@id)[1])]">

    (**) somit sollte es ausreichend sein, die Schleifenbedingung hier als if bedingung zu wiederholen - wenn es einen Knoten gibt, wird die Bedingung true, sonst false:
    <xsl:if test="key('genreSchlüssel',@id)[@tag=$tagSchlüsselID]">

    Genre :
        <b><xsl:value-of select="@id"/></b> **
        <br/>

    </xsl:if>

    (*) hier folgend werden für das Genre die zugehörigen Filme ausgegeben, also ist die Bedingung der for-each schleife hinreichend, um festzustellen, wieviele Knoten im Genre vorhanden sind. Lies weiter bei (**)

    <xsl:for-each select="key('genreSchlüssel',@id)[@tag=$tagSchlüsselID]">
         <br/>Filmtitel:
          <b><xsl:value-of select="@titel"/></b>
          <br/>
       </xsl:for-each>
       <br/>
       </xsl:for-each>

    Ich hoffe das funktioniert,
    Richard

    1. Moin Richard!

      ersteinaml danke, dass du dir die zeit genommen hast!
      deine lösung funktioniert wunderbar, hatte auch eine ähnliche lösung herausgefunden:

      <xsl:if test="count(key('genreSchlüssel',@id)[@tag=$tagSchlüsselID])>0">

      nochmals danke und schöne grüsse,

      Klaus