Toon posts:

XSL attribute vraagje...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben een aantal ASP scriptjes aan het overzetten naar XML. In het ASP scriptje gebruikte ik hetvolgede stukje code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
agkleur = "#FFFFFF"

While Not RS.eof
  if agkleur = "#FFFFFF" then
    agkleur = "#EEEEEE"
  else
    agkleur = "#FFFFFF"
  end if

  <tr bgcolor=" & agkleur & ">
  .....
  .....
Wend

Er worden dus records uit een DB gehaald en voor ieder record wordt een nieuwe row in een tabel aangemaakt. Deze rows moeten om en om van kleur wisselen.
Nu wil ik dit gaan gebruiken binnen een XML bestandje, of ja, in de XSL dus. Ik geef voor ieder record dat opgehaald wordt een kleur mee. Maar nu moet deze kleur nog aan de <tr> toegekend worden. Daar kom ik niet uit.....
Ik hoop dat het een beetje duidelijk is wat ik bedoel ???

  • Orphix
  • Registratie: Februari 2000
  • Niet online
code:
1
2
3
<tr>
  <xsl:attribute name="bgcolor"><xsl:value-of select="color" /></xsl:attribute>
</tr>

Let erop dat de attribute tag direct na hbet element moet komen

Verwijderd

Topicstarter
OK zover was ik eigenlijk al ;)

Dit is de code die ik heb:
code:
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
    
<xsl:template match="/">
    <table width="100%" border="1" cellpadding="0" cellspacing="0">
     <tr>
      <td colspan="6">
       <div class="UserGenericHeader">Users overview</div>
      </td>
     </tr>
     <tr>
    <td width="60" valign="top"></td>
    <td width="200"><font size="1"><b>Name</b></font></td>
    <td width="200"><font size="1"><b>Account</b></font></td>
    <td width="100"><font size="1"><b>Building</b></font></td>
    <td width="80"><font size="1"><b>Room</b></font></td>
    <td width="80"><font size="1"><b>Phone</b></font></td>
     </tr>
     <xsl:for-each select="USERS/USER">
     <tr>
    <td><xsl:apply-templates select="USERID"/></td>
    <td><xsl:apply-templates select="LASTNAME"/>, <xsl:apply-templates select="FIRSTNAME"/> <xsl:apply-templates select="MIDDLENAME"/></td>
    <td><xsl:apply-templates select="ACCOUNT"/></td>
    <td><xsl:apply-templates select="BUILDING"/></td>
    <td><xsl:apply-templates select="ROOM"/></td>
    <td><xsl:apply-templates select="PHONE"/></td>
     </tr>
     </xsl:for-each>
     <xsl:for-each select="USERS">
     <tr>
      <td align="right" colspan="6"><font size="1">Number of registered users: <xsl:apply-templates select="COUNT"/></font></td>
     </tr>
     </xsl:for-each>
    </table>
</xsl:template>

<xsl:template match="textnode()">
  <xsl:value-of/>
</xsl:template>

<xsl:template match="ID">
  <xsl:value-of />
</xsl:template>

<xsl:template match="USERID">
  <font size="1">
  <a>
  <xsl:attribute name="href">
    admin/events/deluser.asp?id=<xsl:value-of />
  </xsl:attribute>
  del</a> | upd
  </font>
</xsl:template>

<xsl:template match="AGKLEUR">
  <xsl:attribute name="bgcolor">
    <xsl:value-of />
  </xsl:attribute>
</xsl:template>

<xsl:template match="LASTNAME">
  <font size="1">
    <xsl:value-of />
  </font>
</xsl:template>

<xsl:template match="FIRSTNAME">
  <font size="1">
    <xsl:value-of />
  </font>
</xsl:template>

<xsl:template match="MIDDLENAME">
  <font size="1">
    <xsl:value-of />
  </font>
</xsl:template>

<xsl:template match="ACCOUNT">
  <font size="1">
    <xsl:value-of />
  </font>
</xsl:template>

<xsl:template match="BUILDING">
  <font size="1">
    <xsl:value-of />
  </font>
</xsl:template>

<xsl:template match="ROOM">
  <font size="1">
    <xsl:value-of />
  </font>
</xsl:template>

<xsl:template match="PHONE">
  <font size="1">
    <xsl:value-of />
  </font>
</xsl:template>

<xsl:template match="COUNT">
  <font size="1">
    <xsl:value-of />
  </font>
</xsl:template>

</xsl:stylesheet>

Nu wil ik dus binnen de <xsl:for-each select="USERS/USER"> de rij met 6 cellen iedere keer van kleur laten veranderen. Is dat mogelijk met de huidige opzet of kan ik ipv de kleur mee te geven gewoon in het XSL scriptje een stukje ASP code ofzo neerzetten ???

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Waar staat AGKLEUR in je XML document (op welke plek in de hierarchie) ?

ps ik moet nu weg..

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" ?> 
<USERS>
  <USER>
    <ID>1</ID> 
    <AGKLEUR>#EEEEEE</AGKLEUR> 
    <USERID>1</USERID> 
    <FIRSTNAME>Kees</FIRSTNAME> 
    <MIDDLENAME /> 
    <LASTNAME /> 
    <BUILDING /> 
    <ROOM /> 
    <PHONE>123456</PHONE> 
  </USER>
  <USER>
    ...
  </USER
  <COUNT>113</COUNT> 
</USERS>

Iedere user krijgt dus zijn eigen kleur mee. Is niet de mooiste oplossing maar ik weet niet hoe ik in dat XSL scriptje de bgcolor kan laten 'verscpringen'

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je maakt attributen aan in een template, dat kan niet. :) xsl:attribute is altijd een kind van xsl:element (edit: stom genoeg begin ik daar nu over te twijfelen, is dat wel echt vereist?).

Verder kan je het nog korter opschrijven:
code:
1
2
3
4
5
6
<a>
  <xsl:attribute name="href">
    admin/events/deluser.asp?id=<xsl:value-of />
  </xsl:attribute>
  del
</a>

kan je schrijven als:
code:
1
2
3
<a href="admin/events/deluser.asp?id={.}"/>
  del
</a>

of
code:
1
2
3
<a href="admin/events/deluser.asp?id={text()}"/>
  del
</a>

Met { ... } geef je aan dat dat deel van het attribuut een XPath expressie is, die geevalueerd moet worden.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Het werkt iig wel die hyperlink :?

Maar kun je me ook verder helpen met dat andere probleem ?

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Hum ik heb het ff opgezocht en het mag volgens mij wel, maar dit mag niet het geval zijn:
Adding an attribute to an element after children have been added to it; implementations may either signal the error or ignore the attribute.
Het is trouwens sowieso wel een vage constructie...

Over je probleem: de oplossing is niet moeilijk:
code:
1
2
3
4
5
6
<xsl:for-each select="USERS/USER">
   <tr bgcolor="{AGKLEUR}">
     <td>...</td>
     ....
   </tr>
</xsl:for-each>

(of uiteraard via de attribute constructie)

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Werkt niet :(

in de output krijg ik ook gewoon <tr bgcolor="{AGKLEUR}"> te zien..... Dus op de een of andere manier wordt de AGKLEUR niet mee gegeven....

Ik heb verder gebruikt:
code:
1
2
3
<xsl:template match="AGKLEUR">
  <xsl:value-of />
</xsl:template>

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 15-09 23:45
Ik begrijp niet helemaal waar je heen wou, maar als ik de eerste post een beetje snel doorblader, kom ik op het volgende ui: je wilt achtergrond kleuren om-en-om laten zien.

Daarvoor ben ik ooit eens een schitterende oplossing tegengekomen.

Stel je hebt de volgende xml:
code:
1
2
3
<item>eerste item</item>
<item>tweede item</item>
<item>derde item</item>

Dan kan je gebruik maken van de volgende xsl:
code:
1
2
3
4
5
<xsl:template match="item">
    <tr class="darker{position() mod 2 = 0}">
      <td><xsl:apply-templates /></td>
    </tr>
</xsl:template>

De truuk zit hem hier dus in het veranderen van de class naam.

je zult nl. de volgende html krijgen:
code:
1
2
3
4
5
6
7
8
9
<tr class="darkerfalse">
    <td>eerste item</td>
</tr>
<tr class="darkertrue">
    <td>tweede item</td>
</tr>
<tr class="darkerfalse">
    <td>derde item</td>
</tr>

Als je dus in je .css het volgende zet:
code:
1
2
.darkertrue  { background-color: #E5E5E5; }
.darkerfalse { background-color: #F5F5F5; }

heb je keurige om-en-om rijen op een op zich best makkelijke manier.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
MiKe_V: In de output krijg ik ook gewoon <tr bgcolor="{AGKLEUR}"> te zien..... Dus op de een of andere manier wordt de AGKLEUR niet mee gegeven....
Lekker vaag :( . Dit zou gewoon moeten werken.

Probeer anders eens dit:
code:
1
2
3
4
5
6
<tr>
    <xsl:attribute name="bgcolor">
         <xsl:value-of select="AGKLEUR"/>
    </xsl:attribute>
    ....
</tr>

Die template kan voor AGKLEUR kan je gewoon weghalen.

Overigens is de oplossing van freak007 (als je dat bedoelde) natuurlijk nog veel leuker :) . Je zou in je XML-file helemaal geen kleur-info moeten hebben...

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 15-09 23:45
Op vrijdag 21 december 2001 16:00 schreef mbravenboer het volgende:
Overigens is de oplossing van freak007 (als je dat bedoelde) natuurlijk nog veel leuker :) . Je zou in je XML-file helemaal geen kleur-info moeten hebben...
Tsja, 't is een beetje een beun-oplossing, maar 't werkt perfect. Alle parsers zouden ook true of false terug moeten geven, dus het zou met alle parsers moeten werken.

Verwijderd

Topicstarter
Als ik nu eens geen AGKLEUR meegeef in de XML. Kan ik dan op een of andere manier gewoon een if .. then in de XSL plaatsen, bv:
code:
1
2
3
4
5
if agkleur = "#FFFFFF" then
  agkleur = "#EEEEEE"
else
  agkleur = "#FFFFFF"
end if

Ik ben ook ergens <xsl:if test.....> tegengekomen. Zou ik daar iets mee kunnen ??

  • Rense Klinkenberg
  • Registratie: November 2000
  • Laatst online: 15-09 23:45
Op vrijdag 21 december 2001 16:19 schreef MiKe_V het volgende:
Als ik nu eens geen AGKLEUR meegeef in de XML. Kan ik dan op een of andere manier gewoon een if .. then in de XSL plaatsen, bv:
code:
1
2
3
4
5
if agkleur = "#FFFFFF" then
  agkleur = "#EEEEEE"
else
  agkleur = "#FFFFFF"
end if

Ik ben ook ergens <xsl:if test.....> tegengekomen. Zou ik daar iets mee kunnen ??
Kijk even naar mijn eerste reply in dit topic :Y)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
freak007: Alle parsers zouden ook true of false terug moeten geven, dus het zou met alle parsers moeten werken.
Inderdaad, maar het kan nog mooier gewoon met een choose-when-otherwise (ipv if).
code:
1
2
3
4
5
6
7
8
<xsl:choose>
   <xsl:when test="position() mod 2 = 0">
    <xsl:attribute name="class">kleur1</xsl:attribute>
   </xsl:when>
   <xsl:otherwise>
    <xsl:attribute name="class">kleur2</xsl:attribute>
   </xsl:otherwise>
</xsl:choose>

of dan niet op de CSS methode (minder fraai uiteraard)
code:
1
2
3
4
5
6
7
8
<xsl:choose>
   <xsl:when test="position() mod 2 = 0">
    <xsl:attribute name="bgcolor">#bla1</xsl:attribute>
   </xsl:when>
   <xsl:otherwise>
    <xsl:attribute name="bgcolor">#bla2</xsl:attribute>
   </xsl:otherwise>
</xsl:choose>

Overigens zou je die choose ook nog in het attribuut moeten kunnen zetten:
code:
1
2
3
4
5
6
<xsl:attribute name="class">
    <xsl:choose>
      <xsl:when test="position() mod 2 = 0">class1</xsl:when>
      <xsl:otherwise>class2</xsl:otherwise>
   </xsl:choose>
</xsl:attribute>

Nog mooier :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Topicstarter
Ja ik krijg dat niet aan de gang.
Ik ben bezig met Microsoft Digital Dashboard. En die heeft rare trekjes. Vandaar dat ik denk dat ook jullie eerdere oplossingen niet werkte :?

Ik ga nog wel ff verder ploeteren.....

Bedankt iig
Pagina: 1