Announcement

Collapse
No announcement yet.

Wechsel der Hintergrundfarbe

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wechsel der Hintergrundfarbe

    Hallo zusammen,

    ich bin XSLT technisch noch nicht viel unterwegs gewesen. Mein Problem ist folgendes: Ich lese Datensätze ein und gebe diese gestückelt in einer HTML Tabelle aus, dabei ist jeder zweite Datensatz grau, der Rest weiß um einen "Zebra"effekt zu erhalten.

    HTML Code:
    <xsl:for-each select="Datensaetze">
    <xsl:choose>
    <xsl:when test="position() mod 2 = 0">
    <xsl:call-template name="Template">
    <xsl:with-param name="bgcolor" select="'bgcolorlightgray'"/>
    </xsl:call-template>
    </xsl:when>
    <xsl:otherwise>
    <xsl:call-template name="Template">
    <xsl:with-param name="bgcolor" select="'bgcolorWhite'"/>
    </xsl:call-template>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:for-each>
    Die Parameter "BgColorLightGray" bzw. "BgColorWhite" sind in der css hinterlegt. Im Template werden die Tabellenspalten entsprechend den Variablen gefüllt.
    Soweit so gut.

    Jetzt erstreckt sich ein Datensatz auf 2 Zeilen. Sprich die erste Zeile wird regelkonform gefüllt und in der zweiten tauchen Informationen auf, die allerdings noch zur ersten Zeile gehören. Das ist so gewollt und passiert alles einwandfrei, das Problem ist die Hintergrundfarbe, da ich nur auf position() mod 2 prüfe und er die Farbe wechselt auch wenn in der nächsten Zeile der gleichen Datensatz steht. Wie kann ich die Abfrage optimieren? Als Anhaltspunkte könnte ich 1,2 Spalten nennen, die bei einer weiteren Zeile zum gleichen Datensatz nie befüllt werden. Wären die also = "" so wechselt er die Farbe nicht. Programmiertechnisch leicht gedacht, doch wie setz ich das in XSLT um?

    Vielen Dank im Voraus.

    Lg, Kazum

  • #2
    Okay, ich denke ein Lösungsansatz wäre, die Spalte, die in der zweiten Zeile nicht mehr befüllt wird auf Inhalte zu prüfen (befüllt / nicht befüllt). Ist sie NICHT befüllt, so wird die gleiche
    HTML Code:
    bgcolor
    wie bei der letzten Zeile verwendet (was auch richtig ist). Kommen wir nun in die 3. Zeile (neuer Datensatz) so greift die Bedingung
    HTML Code:
    position() mod 2
    nicht mehr und die bgcolor ist die selbe wie in den 2 Zeilen zuvor OBWOHL es ein neuer Datensatz ist.
    Ich hoffe ihr versteht mein Problem ein bisschen besser. Wie kann ich im Code mitgeben, wie die Farbe in der Zeile zuvor war? Ist das überhaupt möglich über xsl?

    Vg

    Comment


    • #3
      Ich denke, dass man das Problem mittels Gruppierung lösen kann: wenn man z.B. eine Eingabe in der Form
      Code:
      <records>
        <record>
          <id>1</id>
          <value>value 1, 1</value>
        </record>
        <record>
          <id>2</id>
          <value>value 2, 1</value>
        </record>
        <record>
          <id/>
          <value>value 2, 2</value>
        </record>
        <record>
          <id>3</id>
          <value>value 3, 1</value>
        </record>
        <record>
          <id>4</id>
          <value>value 4, 1</value>
        </record>
        <record>
          <id/>
          <value>value 4, 2</value>
        </record>
        <record>
          <id>5</id>
          <value>value 5, 1</value>
        </record>
      </records>
      hat, dann erzeugt folgendes XSLT 2.0 Stylesheet
      Code:
      <xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="2.0">
        
        <xsl:param name="odd-color" select="'lightgrey'"/>
        <xsl:param name="even-color" select="'white'"/>
        
        <xsl:output method="html" indent="yes"/>
        <xsl:strip-space elements="*"/>
        
        <xsl:template match="records">
          <table>
            <thead>
              <tr>
                <xsl:apply-templates select="record[1]/*" mode="th"/>
              </tr>
            </thead>
            <tbody>
              <xsl:for-each-group select="record" group-starting-with="record[normalize-space(id)]">
                <xsl:variable name="color" select="if (position() mod 2 eq 0) then $even-color else $odd-color"/>
                <xsl:apply-templates select="current-group()">
                  <xsl:with-param name="color" select="$color"/>
                </xsl:apply-templates>
              </xsl:for-each-group>
            </tbody>
          </table>
        </xsl:template>
        
        <xsl:template match="record/*" mode="th">
          <th>
            <xsl:value-of select="local-name()"/>
          </th>
        </xsl:template>
        
        <xsl:template match="record">
          <xsl:param name="color"/>
          <tr style="background-color: {$color}">
            <xsl:apply-templates/>
          </tr>
        </xsl:template>
        
        <xsl:template match="record/*">
          <td>
            <xsl:value-of select="."/>
          </td>
        </xsl:template>
      
      </xsl:stylesheet>
      folgendes Resultat:
      Code:
      <table>
         <thead>
            <tr>
               <th>id</th>
               <th>value</th>
            </tr>
         </thead>
         <tbody>
            <tr style="background-color: lightgrey">
               <td>1</td>
               <td>value 1, 1</td>
            </tr>
            <tr style="background-color: white">
               <td>2</td>
               <td>value 2, 1</td>
            </tr>
            <tr style="background-color: white">
               <td></td>
               <td>value 2, 2</td>
            </tr>
            <tr style="background-color: lightgrey">
               <td>3</td>
               <td>value 3, 1</td>
            </tr>
            <tr style="background-color: white">
               <td>4</td>
               <td>value 4, 1</td>
            </tr>
            <tr style="background-color: white">
               <td></td>
               <td>value 4, 2</td>
            </tr>
            <tr style="background-color: lightgrey">
               <td>5</td>
               <td>value 5, 1</td>
            </tr>
         </tbody>
      </table>

      Comment


      • #4
        Danke, hilft mir leider nicht.
        Was ich mir überlegt habe, einen Zähler einzubauen und diesen ggf. um 1 zurückzusetzen um nicht aus dem Rhythmus zu kommen. Ist sowas möglich in XSLT?

        Comment


        • #5
          Zähler gibt es in imperativen Programmiersprachen, nicht in deklarativen wie XSLT.

          Comment


          • #6
            Auslagerung in JS?

            Comment


            • #7
              Übrigens sprechen wir über rund 250 Datensätze und nicht nur 5.

              Comment


              • #8
                Mein Vorschlag ist sicherlich nicht die Benutzung von JS, ich habe ja bereits einen Vorschlag mit XSLT gemacht.

                Comment

                Working...
                X