03. august 2005 - 09:49Der er
8 kommentarer og 1 løsning
Farve skift i <TD> ved hjælp af XSLT. Hvordan ?
Hej Alle sammen
Jeg er i gang med at udvikle en kundearkiv i Umbraco (CMS) hvor man bruge XSLT.
Jeg er kommet til det punkt hvor jeg har en tabel hvor alle kunder er udskrevet. Det jeg nu søger er en måde i XSLT hvor på man kan lave så hver anden <tr> eller celle skifter farve så det er letter at finde rundt i information.
Til daglig arbejder jeg med PHP så jeg kender godt til den PHP funktion der kan lave det, men Umbraco er lavet i .NET så der hjælper det ikke meget at kunne PHP :)...
Hvis det ikke er muligt at lave i XSLT fides der så en JavaScript kode der kan bruges eller en 3 løsning.
Ps. Har brugt XSLT i 2 dage nu, så jeg er meget grøn, så det vil være fint hvis i kunne dokumentere jeres svar + måske give et par links hvor jeg kan læse mere om det. Jeg har selv brugt w3schools.com.
Der findes i XSLT en XPATH-funktion der hedder position() og den fortæller hvilken position det aktuelle element har i listen af elemeneter. Denne kan du bruge til at beslutte om det aktuelle element er i en lige eller ulige række (forudsat at du viser alle elementer i listen). Det kan gøres således:
<tr> <xsl:choose> <xsl:when test="position() mod 2 = 0"> <xsl:attribute name="class">even</xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:attribute name="class">odd</xsl:attribute> </xsl:otherwise> </xsl:choose> <td>indholder i en celle i rækken</td> <td>indholder i en celle i rækken</td> <td>indholder i en celle i rækken</td> </tr>
"xsl:" er dit namespace (jeg antager du bruger det som langt de fleste bruger når man starter på xslt (da det er det som langt de fleste eksempler benytter :)).
xsl:attribute sætter en attribut på det xml-elementer det står umiddelbart i forbindelse med, i dette tilfælde <tr>. Hvis du f.eks. skal have tilføjet bgcolor til tabelrækken kan du skrive: <tr> <xsl:attribute name="bgcolor">red</xsl:attribute> </tr>
"xsl:choose" svarer til en switch i de c-orienterede sprog og "xsl:when" er case-konstruktionen - gæt selv hvad xsl:otherwise gør :). Hvis du skal have flere betingelser skal du altså indføje flere xsl:when før xsl:otherwise... Grunden til at jeg ikke benytter en "xsl:if" er at der IKKE findes en xsl:else, så du er nødsaget til at benytter xsl:choose til at simulere if-betingelser med else-dele.
Jeg har ikke lige en flok links til XSLT liggende, men kigger mig lige omkring...
Nu skriver du : <xsl:attribute name="class">odd</xsl:attribute> , En attribute er det er form form en variabel eller hvad ? Og hvrdan udskrives en attribute ?
den vil bare komme til at se således ud i det resulterende HTML:
<tr class="even"> <td>indholder i en celle i rækken</td> <td>indholder i en celle i rækken</td> <td>indholder i en celle i rækken</td> </tr> <tr class="odd"> <td>indholder i en celle i rækken</td> <td>indholder i en celle i rækken</td> <td>indholder i en celle i rækken</td> </tr>
Det betyder så naturligvis også at du skal definere en style der hedder even og en der hedder odd for at dette skal fungere :)
Nej, det kan være jeg har fejlet lidt ifht. dit behov. Du efterspørger egentlig at hver celle skifter farve og ikke hver linie, eller er det forkert opfattet. Ikke fordi det ændrer metode synderligt meget - blot hvor koden skal indsættes :)
Forklaringen til xsl:attribute er at den tager det ikke-xslt-element der står umiddelbart før xsl:attribute og opretter en attribut (angivet ved name) med værdien (angivet i indholdet mellem xsl:attribute start- og slut-tags) på det element (i dette tilfælde er det så elementet <tr>). Dette resulterer i et output der ser således ud: <tr class="even"> eller <tr class="odd"> - alt efter om position() returnerer et lige eller ulige nummer.
Hvis nu jeg tager dit kode og fletter min løsning ind i det, så kan det være du ser lyset. Jeg kunne forestille mig noget i stil med:
"xsl:call-template" er nogenlunde det samme som at kalde en funktion i et proceduralt programmeringssprog. Du kan også sende parametre med sådan en, men det tror jeg lige vi gemmer til et senere tidspunkt :)
softspot >> Det var lige mig der glemte at lave et par <tr> i mit eks. Jeg vil nemlig lave hver anden linje og ikke celle. Men som du siger det jar jo intet med metoden at gøre.
Jeg skulle lige læse dit indlæg et par gange og så var alt data gemt i mit lille hjerne :)
Nu hvor jeg læser dit sidste indlæg er jeg næsten blivet en rigtig chamo inden for attributter :D heheh
Men her med siger jeg 100000 tak for hjælpen :) Jeg skla nok komme ind i flere problemmer men nu ved jeg hvor du er :D
Ja, og det er også rart når folk vil dele ud af et det ved :D
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.