Announcement

Collapse
No announcement yet.

Baum in Tabelle wandeln

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

  • Baum in Tabelle wandeln

    Hallo Community,

    ich sitze wieder an einem Problem.
    Ich möchte folgenden Code in eine Tabelle umformen.

    Code:
    <Entity name = "Auto">
        <Typ name = "Golf">
            <Farbe> Silber</Farbe>
            <Beschreibung> Solides Auto </Beschreibung>
            <Eigenschaften>
                <Ausstattung> Premium </Ausstattung>
                <Reifen> 17" </Reifen>
            </Eigenschaften>
        </Typ>
        <Typ name = "A3">
            <Farbe> Weiß </Farbe>
            <Beschreibung> Sportliches Auto </Beschreibung>
            <Eigenschaften>
                <Ausstattung> Sportlich </Ausstattung>
                <Reifen> 18" </Reifen>
            </Eigenschaften>
        <Typ>
    </Entity>
    .
    .
    .
    So soll die Tabelle aussehen:

    Beispiel Forum.png

    Ich benutze V.1.0 und würde die Ausgabe als HTML gerne haben, jedoch ist der HTML-Code nicht so interessant wie der XSLT.

    Vielen Dank schonmal im Voraus!

  • #2
    Eigentlich eine sehr schöne Einsteigerübung:

    [highlight=xml]<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xslutput method="html" encoding="UTF-8" indent="yes"/>

    <xsl:template match="Entity">
    <html>
    <head>
    <title>Autos</title>
    <style type="text/css">
    table,td,th { border: 2px solid #FFFFFF; border-collapse: collapse; }
    td,th { font-family: sans-serif; padding: 5px; }
    th { color: #FFFFFF; background-color: #4F81BD; }
    tr:nth-child(odd) { color: #000000; background-color: #A7BFDE; }
    tr:nth-child(even) { color: #000000; background-color: #D3DFEE; }
    </style>
    </head>
    <body>
    <table>
    <thead>
    <tr>
    <th>Typ</th>
    <th>Farbe</th>
    <th>Beschreibung</th>
    </tr>
    </thead>
    <tbody>
    <xsl:apply-templates select="Typ"/>
    </tbody>
    </table>
    </body>
    </html>
    </xsl:template>

    <xsl:template match="Typ">
    <tr>
    <th><xsl:value-of select="@name"/></th>
    <td><xsl:value-of select="Farbe"/></td>
    <td>
    <xsl:value-of select="Beschreibung"/>
    <xsl:for-each select="Eigenschaften/*">
    <br /><xsl:value-of select="."/>
    </xsl:for-each>
    </td>
    </tr>
    </xsl:template>

    </xsl:stylesheet>
    [/highlight]

    Comment


    • #3
      Hier mal ein Beispiel:
      Code:
      <xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">
        
      <xsl:output method="html" indent="yes" version="5.0"/>
      
      <xsl:template match="/">
        <html lang="de">
          <head>
            <title>Beispiel</title>
            <style type="text/css">
            .entity table {
              color: white;
              background-color: blue;
            }
            
            .entity ul {
              list-style-type: none;
            }
            </style>
          </head>
          <body>
            <h1>Beispiel</h1>
            <xsl:apply-templates/>
          </body>
        </html>
      </xsl:template>
      
      <xsl:template match="Entity[@name]">
        <div class="entity">
          <h2><xsl:value-of select="@name"/></h2>
          <table rules="all">
            <thead>
              <tr>
                <xsl:apply-templates select="*[1] | *[1]/*[not(self::Eigenschaften)]" mode="head"/>
              </tr>
            </thead>
            <tbody>
              <xsl:apply-templates/>
            </tbody>
          </table>
        </div>
      </xsl:template>
      
      <xsl:template match="Entity//*" mode="head">
        <th>
          <xsl:value-of select="local-name()"/>
        </th>
      </xsl:template>
      
      <xsl:template match="Entity/*">
        <tr>
          <xsl:apply-templates select=". | *[not(self::Eigenschaften)]" mode="cell"/>
        </tr>
      </xsl:template>
      
      <xsl:template match="Entity//*" mode="cell">
        <td>
          <xsl:value-of select="."/>
        </td>
      </xsl:template>
      
      <xsl:template match="Entity/*[@name]" mode="cell">
        <td>
          <xsl:value-of select="@name"/>
        </td>
      </xsl:template>
      
      <xsl:template match="Entity//Beschreibung" mode="cell">
        <td>
          <ul>
            <xsl:apply-templates select=". | ../Eigenschaften/*" mode="list"/>
          </ul>
        </td>
      </xsl:template>
      
      <xsl:template match="*" mode="list">
        <li>
          <xsl:value-of select="."/>
        </li>
      </xsl:template>
      
      </xsl:stylesheet>
      Das erzeugt zumindest eine Tabelle mit den gewünschten Daten, das Aussehen der Tabelle musst du dann selber mit CSS durchführen.

      Comment


      • #4
        Danke für die schnelle Antwort, jedoch hat es mir noch nicht so richtig weiter geholfen.

        Mit dem ... wollte ich andeuten, dass es noch mehr Entity-Elemente geben kann (ich hab den Tag drüber vergessen). Deswegen hier nochmal das Beispiel erweitert.

        Code:
        <Entities>
        <Entity name = "Auto">
            <Typ name = "Golf">
                <Farbe> Silber</Farbe>
                <Beschreibung> Solides Auto </Beschreibung>
                <Eigenschaften>
                    <Ausstattung> Premium </Ausstattung>
                    <Reifen> 17" </Reifen>
                </Eigenschaften>
            </Typ>
            <Typ name = "A3">
                <Farbe> Weiß </Farbe>
                <Beschreibung> Sportliches Auto </Beschreibung>
                <Eigenschaften>
                    <Ausstattung> Sportlich </Ausstattung>
                    <Reifen> 18" </Reifen>
                </Eigenschaften>
            <Typ>
        </Entity>
        <Entity name = "Flugzeug>
            <Typ name = "abc">
                <Farbe> Silber</Farbe>
                <Beschreibung> abc </Beschreibung>
                <Eigenschaften>
                    <Ausstattung> Premium </Ausstattung>
                    <Reifen> abc </Reifen>
                </Eigenschaften>
            </Typ>
            <Typ name = "abc">
                <Farbe> Weiß </Farbe>
                <Beschreibung> abc </Beschreibung>
                <Eigenschaften>
                    <Ausstattung> abc </Ausstattung>
                    <Reifen> abc </Reifen>
                </Eigenschaften>
            <Typ>
        </Entity>
        </Entities>

        Bei Anwort 1: Müsste er nicht beim:

        Code:
                <xsl:for-each select="Eigenschaften/*">
                  <br /><xsl:value-of select="."/>
                </xsl:for-each>
        alle Eigenschaften ausgeben und nicht nur die zwei gewünschten?

        Zu Antwort zwei: 0.o
        Ich bin noch nicht so vertraut mit XSLT und versteh da nicht ganz so viel...

        Comment


        • #5
          Dann probiere es so (hier mit selektiver Ansprache der einzelnen Eigenschaften):

          [highlight=xml]<?xml version="1.0" encoding="UTF-8"?>
          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xslutput method="html" version="5.0" encoding="UTF-8"/>

          <xsl:template match="Entities">
          <html>
          <head>
          <title>Autos</title>
          <style type="text/css">
          table,td,th { border: 2px solid #FFFFFF; border-collapse: collapse; }
          td,th { font-family: sans-serif; padding: 5px; }
          th { color: #FFFFFF; background-color: #4F81BD; }
          tr:nth-child(odd) { color: #000000; background-color: #A7BFDE; }
          tr:nth-child(even) { color: #000000; background-color: #D3DFEE; }
          </style>
          </head>
          <body>
          <h1>Ausgaben</h1>
          <xsl:apply-templates select="Entity"/>
          </body>
          </html>
          </xsl:template>

          <xsl:template match="Entity">
          <h2><xsl:value-of select="@name"/></h2>
          <table>
          <thead>
          <tr>
          <th>Typ</th>
          <th>Farbe</th>
          <th>Beschreibung</th>
          </tr>
          </thead>
          <tbody>
          <xsl:apply-templates select="Typ"/>
          </tbody>
          </table>
          </xsl:template>

          <xsl:template match="Typ">
          <tr>
          <th><xsl:value-of select="@name"/></th>
          <td><xsl:value-of select="Farbe"/></td>
          <td>
          <xsl:value-of select="Beschreibung"/><br />
          <xsl:value-of select="Eigenschaften/Ausstattung"/><br />
          <xsl:value-of select="Eigenschaften/Reifen"/>
          </td>
          </tr>
          </xsl:template>

          </xsl:stylesheet>
          [/highlight]

          Comment

          Working...
          X