XSL Gruppierung / leere Gruppen herausfiltern
Klaus
- xsl
0 ritschmanhard0 Klaus
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
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
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