Problemen met filteren

Status
Niet open voor verdere reacties.

mjvis

Gebruiker
Lid geworden
29 apr 2009
Berichten
17
Dit is eigenlijk een vervolg vraag op een eerder gestelde vraag.

Ik heb een XML lijst:
---
<customers>
<customer> (repeating)
<code></code>
<name></name>
<contacts> (repeating)
<contactfunction></contactfunction>
<contactname></contactname>
<contactphone></contactphone>
<contactmail></contactmail>
</contacts>
<services> (repeating)
<service></service>
<team></team>
<link></link>
</services>
</customer>
<customer>
---

Ik heb de volgende XSL code:
---
01 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
02 <xsl:variable name="AantalKlanten" select="count(/customers/customer)"/>
03 <xsl:variable name="AantalKolommen" select="4"/>
04 <xsl:variable name="TotaalCellen" select="$AantalKlanten"/>
05 <xsl:variable name="ExtraCellen" select="$TotaalCellen mod $AantalKolommen"/>
06 <xsl:template match="/">
07 <p><br/>
08 <xsl:if test="$AantalKlanten &gt; 0">
09 <table>
10 <xsl:call-template name="Tabel"/>
11 </table>
12 </xsl:if>
13 </p>
14 </xsl:template>
15 <xsl:template name="Tabel">
16 <xsl:param name="Index" select="1"/>
17 <xsl:if test="$Index &lt; $AantalKlanten">
18 <xsl:call-template name="Regel"><xsl:with-param name="Index" select="$Index"/></xsl:call-template>
19 <xsl:call-template name="Tabel">
20 <xsl:with-param name="Index" select="$Index + $AantalKolommen"/>
21 </xsl:call-template>
21 </xsl:if>
22 </xsl:template>
23 <xsl:template name="Regel">
24 <xsl:param name="Index" select="1"/>
25 <tr>
26 <xsl:call-template name="Cel">
27 <xsl:with-param name="Index" select="$Index"/>
28 <xsl:with-param name="Teller" select="$Index + $AantalKolommen - 1"/>
29 </xsl:call-template>
30 </tr>
31 </xsl:template>
32 <xsl:template name="Cel">
33 <xsl:param name="Index" select="1"/>
34 <xsl:param name="Teller" select="1"/>
35 <td>
36 <p align="center">
37 <xsl:for-each select="/customers/customer">
38 <xsl:sort order="ascending" select="name"/>
39 <xsl:if test="position() = $Index">
40 <xsl:value-of select="code"/>
41 </xsl:if>
42 </xsl:for-each>
43 </p>
44 </td>
45 <xsl:if test="$Teller &gt; $Index">
46 <xsl:call-template name="Cel">
47 <xsl:with-param name="Index" select="$Index + 1"/>
48 <xsl:with-param name="Teller" select="$Teller"/>
49 </xsl:call-template>
50 </xsl:if>
51 </xsl:template>
52 </xsl:stylesheet>
---

Dit script geeft als resultaat een tabel van een aantal kolommen (variabel "AantalKolommen"), waarin elke cel de inhoud staat van een node uit de XML lijst.

Echter lukt het me niet te filteren. Als ik in regel 39 de filter aanpas heb ik de volgende problemen:
- Als ik bijvoorbeeld bepaalde <code> of <naam> niet in de tabel wil hebben, krijg ik een lege cel in de tabel.
- Verder heb ik geen flauw idee hoe ik bijvoorbeeld op de inhoud van <service> of <team> kan filteren omdat dit herhalende elementen zijn.

Kan iemand mij helpen?
 
oplossing

De oplossing was makkelijker dan ik dacht.

---
01 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
02 <xsl:variable name="Filter">COM1020</xsl:variable>
03 <xsl:variable name="AantalKlanten" select="count(/customers/customer)"/>
04 <xsl:variable name="AantalKolommen" select="4"/>
05 <xsl:variable name="TotaalCellen" select="count(/customers/customer[services/team=$Filter])"/>
06 <xsl:variable name="ExtraCellen" select="$TotaalCellen mod $AantalKolommen"/>
07 <xsl:template match="/">
08 <p><br/>
09 <xsl:if test="$TotaalCellen &gt; 0">
10 <table>
11 <xsl:call-template name="Tabel"/>
12 </table>
13 </xsl:if>
14 </p>
15 </xsl:template>
16 <xsl:template name="Tabel">
17 <xsl:param name="Index" select="1"/>
18 <xsl:if test="$Index &lt; $AantalKlanten">
19 <xsl:call-template name="Regel"><xsl:with-param name="Index" select="$Index"/></xsl:call-template>
20 <xsl:call-template name="Tabel">
21 <xsl:with-param name="Index" select="$Index + $AantalKolommen"/>
22 </xsl:call-template>
23 </xsl:if>
24 </xsl:template>
25 <xsl:template name="Regel">
26 <xsl:param name="Index" select="1"/>
27 <tr>
28 <xsl:call-template name="Cel">
29 <xsl:with-param name="Index" select="$Index"/>
30 <xsl:with-param name="Teller" select="$Index + $AantalKolommen - 1"/>
31 </xsl:call-template>
32 </tr>
33 </xsl:template>
34 <xsl:template name="Cel">
35 <xsl:param name="Index" select="1"/>
36 <xsl:param name="Teller" select="1"/>
37 <td>
38 <p align="center">
39 <xsl:for-each select="/customers/customer[services/team=$Filter]">
40 <xsl:sort order="ascending" select="name"/>
41 <xsl:if test="position() = $Index">
42 <xsl:value-of select="name"/><br/>
43 </xsl:if>
44 </xsl:for-each>
45 </p>
46 </td>
47 <xsl:if test="$Teller &gt; $Index">
48 <xsl:call-template name="Cel">
49 <xsl:with-param name="Index" select="$Index + 1"/>
50 <xsl:with-param name="Teller" select="$Teller"/>
51 </xsl:call-template>
52 </xsl:if>
53 </xsl:template>
54 </xsl:stylesheet>
---

regel 2 toegevoegd om de waarde van het filter in te stellen.
regel 5 (oud regel 4) aangepast omdat je alleen het totaal aantal wilt weten wat voldoet aan het filter.
regel 39 aangepast om de filter toe te passen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan