Avatar billede saucer Nybegynder
03. august 2005 - 09:49 Der 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.

Med venlig hilsen
Saucer
Avatar billede softspot Forsker
03. august 2005 - 10:21 #1
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...
Avatar billede saucer Nybegynder
03. august 2005 - 10:36 #2
Cool nok..

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 ?
Avatar billede softspot Forsker
03. august 2005 - 10:41 #3
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 :)
Avatar billede saucer Nybegynder
03. august 2005 - 11:00 #4
Det er da utroligt at jeg ikke fatter noget lige nu...

La mig lige vise min kode uden alt indhold..

<table>
<xsl:for-each select="$currentPage/node">
<tr>
<td> indhild </td>
</tr>
</xsl:for-each>
</table>

I bunden har jeg så lavet en template med din code så jeg bare kan kalde på den. :

<xsl:template name="colorChang">

  <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>

</xsl:template>


Det jeg ikke helt er med på er hvad din template udskrive...  udskriver den class="even" og  class="odd" eller bare  even og odd ?

Hvis jeg er alt for dum nu så skla du bare give mig smæk.
Avatar billede saucer Nybegynder
03. august 2005 - 11:14 #5
Uhhh tror nok at jeg lige er med på det igen :D
Avatar billede softspot Forsker
03. august 2005 - 11:16 #6
*LOL* - det begynder at lyde lidt kinky ;D

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:

<table>
<xsl:for-each select="$currentPage/node">
  <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> indhild </td>
  </tr>
</xsl:for-each>
</table>


eller hvis du vil lave attributten via ent funktionskald, så kan det se således ud:

<table>
<xsl:for-each select="$currentPage/node">
  <tr>
    <xsl:call-template name="colorChang" />
    <td> indhild </td>
  </tr>
</xsl:for-each>
</table>


"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 :)
Avatar billede saucer Nybegynder
03. august 2005 - 11:23 #7
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 

Ha' en rigtig god dag..

Ps. Laver du ikke lige et svar ?

Med venlig hilsen
Saucer
Avatar billede softspot Forsker
03. august 2005 - 11:25 #8
Tak i lige måde.

Det er sq rart når folk kan bruge det man ved ;)
Avatar billede saucer Nybegynder
03. august 2005 - 11:30 #9
Ja, og det er også rart når folk vil dele ud af et det ved :D
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester