[XSL] Tabel genereren: geneste for-each

Pagina: 1
Acties:
  • 209 views sinds 30-01-2008
  • Reageer

  • mr_star
  • Registratie: Maart 2003
  • Laatst online: 20-04 11:42
Ik heb volgende XML:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<Framework>
  <Groups>
    <Group>
      <ID>3</ID>
      <Name>Global Admin</Name>
      <Joined/>
      <Permissions>
        <AccessAdminSection>1</AccessAdminSection>
        <AccessMaintenance>1</AccessMaintenance>
        <DebugInfo>1</DebugInfo>
        <ProductDelete>0</ProductDelete>
      </Permissions>
    </Group>
    <Group>
      <ID>6</ID>
      <Name>Shop Admin</Name>
      <Joined>1</Joined>
      <Permissions>
        <AccessAdminSection>1</AccessAdminSection>
        <AccessMaintenance>0</AccessMaintenance>
        <DebugInfo>0</DebugInfo>
        <ProductDelete>1</ProductDelete>
      </Permissions>
    </Group>
    <Group>
      <ID>4</ID>
      <Name>Users</Name>
      <Joined>1</Joined>
      <Permissions>
        <AccessAdminSection>0</AccessAdminSection>
        <AccessMaintenance>0</AccessMaintenance>
        <DebugInfo>0</DebugInfo>
        <ProductDelete>0</ProductDelete>
      <Permissions>
    </Group>
  </Groups>
  <Permissions>
    <Permission Name="AccessAdminSection" ID="14"/>
    <Permission Name="AccessMaintenance" ID="16"/>
    <Permission Name="DebugInfo" ID="15"/>
    <Permission Name="ProductDelete" ID="2"/>
  </Permissions>
</Framework>


Nu wil ik hier een tabel van genereren zoals deze:

Global AdminShop AdminUsers
AccessAdminSection110
AccessMaintenance100
DebugInfo100
ProductDelete010


Dit probeer ik te bereiken met:

XML:
1
2
3
4
5
6
7
8
9
10
<xsl:for-each select="Permissions/Permission">
  <tr>
    <td><xsl:value-of select="@Name" /></td>
    <xsl:variable name="Permission" select="@Name"/>
              
    <xsl:for-each select="/framework/Groups/Group">
      <td><xsl:value-of select="Permissions/$Permission" /></td>
    </xsl:for-each>
    </tr>
</xsl:for-each>


Maar dit gaat niet omdat ik geen variabele kan gebruiken in een select. Op welke manier kan ik binnen mijn 2e for-each waarden gebruiken die ik in mijn eerste for-each gebruik? Misschien zit ik weer te veel op de programmeer-manier te denken en niet genoeg op xsl-manier (templates e.d.)

Verwijderd

Ipv:
code:
1
<xsl:value-of select="Permissions/$Permission" />

dit:
code:
1
<xsl:value-of select="/framework/Groups/Group/Name/" />

Weet niet zeker of dat werkt...

[ Voor 65% gewijzigd door Verwijderd op 22-11-2005 15:45 ]


  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
je maakt het jezelf gemakkelijker als je

<AccessAdminSection>1</AccessAdminSection>
vervangt door
<permission name="AccessAdminSection">1</persmission>

  • mr_star
  • Registratie: Maart 2003
  • Laatst online: 20-04 11:42
Verwijderd schreef op dinsdag 22 november 2005 @ 15:43:
Ipv:
code:
1
<xsl:value-of select="Permissions/$Permission" />

dit:
code:
1
<xsl:value-of select="/framework/Groups/Group/Name/" />

Weet niet zeker of dat werkt...
Dan krijg ik gewoon in elke cel de naam van mijn eerste groep.
joopst schreef op dinsdag 22 november 2005 @ 16:01:
je maakt het jezelf gemakkelijker als je

<AccessAdminSection>1</AccessAdminSection>
vervangt door
<permission name="AccessAdminSection">1</persmission>
Je kan wel eens gelijk hebben, ik ga dit meteen proberen.

  • .Johnny
  • Registratie: September 2002
  • Laatst online: 19-03 12:22
sowieso heb je $permission nergens geset.
Volgens mij kun je prima met accolades { } variablen te pas en te onpas inzetten, maar dan moet je wel een variabele setten...

Maargoed, het is inderdaad netter met een attribuut.

  • mr_star
  • Registratie: Maart 2003
  • Laatst online: 20-04 11:42
Ik heb het opgelost met de attribuut (zoals joopst zei) en dan voor de tweede for-each:
XML:
1
2
3
<xsl:for-each select="/Framework/Groups/Group/Permissions/Permission[@Name = $Permission]">
  <td><xsl:value-of select="text()" /></td>
</xsl:for-each>

Soms kan een probleem waar je enkele uren op zit te staren en naar zit te zoeken toch zo simpel zijn :)

  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
@GIJoke
volgens mij mag je geen dynamische xpaths maken in xslt 1

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Toch even laten zien dat het niet hoeft met for-each :P
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" version = "1.0" > 
    
    <xsl:template match="/">
        <html>
            <body>
                <table>
                    <tr>
                        <th></th>
                        <xsl:apply-templates select="//Name" />
                    </tr>
                    <xsl:apply-templates select="//Permission" />           
                </table>
            </body>
        </html>
    </xsl:template>
                
    <xsl:template match="Name">
        <th>
            <xsl:value-of select="." />
        </th>
    </xsl:template>
    
    <xsl:template match="Permission">
        <tr>
            <td>
                <xsl:value-of select="@Name" />
            </td>
            <xsl:apply-templates select="//Groups//Permissions">
                <xsl:with-param name="permission_name" select="@Name" />
            </xsl:apply-templates>
        </tr>
    </xsl:template>
    
    <xsl:template match="Permissions">
        <xsl:param name="permission_name" />
        <td><xsl:value-of select="*[name()=$permission_name]" /></td>   
    </xsl:template>
    
</xsl:stylesheet> 

[ Voor 26% gewijzigd door Genoil op 22-11-2005 16:55 ]


  • joopst
  • Registratie: Maart 2005
  • Laatst online: 01-10-2024
:Y) goed bezig

ik had ook net een versie af zonder for-each, maar toen had ie zelf al net de oplossing bij elkaar gefietst .. goed van je dat je nog ff de moeite nam om het te posten :P

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Ja je kunt met xsl:for-each meestal wel iets in elkaar frotten maar in elke tutorial, boek of klas waarin je xsl leert wordt men meestal aangeraden het gebruik ervan zoveel mogelijk te vermijden. Als je eenmaal een beetje de kracht van apply-templates en parameters doorhebt is dat ook helemaal niet moeilijk meer :). Dus ik dacht ik predik het evangelie even ongevraagd ;)

  • mr_star
  • Registratie: Maart 2003
  • Laatst online: 20-04 11:42
Genoil schreef op dinsdag 22 november 2005 @ 17:38:
Ja je kunt met xsl:for-each meestal wel iets in elkaar frotten maar in elke tutorial, boek of klas waarin je xsl leert wordt men meestal aangeraden het gebruik ervan zoveel mogelijk te vermijden. Als je eenmaal een beetje de kracht van apply-templates en parameters doorhebt is dat ook helemaal niet moeilijk meer :). Dus ik dacht ik predik het evangelie even ongevraagd ;)
Ik weet dat ik veel te veel bezig ben met loops e.d. Ik heb ooit een poging ondernomen om het template gebeuren te doorgronden maar door tijdsgebrek ben ik er nooit ver in gegaan. Ik ga in ieder geval jouw voorbeeld grondig doorspitten ;)

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Genoil schreef op dinsdag 22 november 2005 @ 17:38:
Ja je kunt met xsl:for-each meestal wel iets in elkaar frotten maar in elke tutorial, boek of klas waarin je xsl leert wordt men meestal aangeraden het gebruik ervan zoveel mogelijk te vermijden. Als je eenmaal een beetje de kracht van apply-templates en parameters doorhebt is dat ook helemaal niet moeilijk meer :). Dus ik dacht ik predik het evangelie even ongevraagd ;)
Heel goed, dan hoef ik het niet meer te doen. ;)

Rustacean

Pagina: 1