Announcement

Collapse
No announcement yet.

HTML Tabelle erstellen

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

  • HTML Tabelle erstellen

    Hallo!

    Ich bin absoluter Neueinsteiger bei XSLT und würde gerne wissen wie ich aus einer XML Datei per XSLT Transformation eine Tabelle bekomme, die immer nach 3 Einträgen eine neue Zeile hat.

    XML Datei:
    Code:
    <?xml version="1.0" encoding="utf-8" ?>
    <space:resource xmlns:space="http://schemas.foo.com/" version="1.0">
        <member>
            <name>Scott Smith</name>
            <office>President</office>
        </member>
        <member>
            <name>Scott Smith</name>
            <office>President</office>
        </member>
        <member>
            <name>Scott Smith</name>
            <office>President</office>
        </member>
    </space:resource>
    Die XML hat zwischen 10 und 18 member Einträge

    XSLT Datei:
    Code:
    <xsl:stylesheet version="1.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns:space="http://schemas.foo.com/">
        <xsl:output method="html" encoding="utf-8"/>
    
        <!-- Max Members: 18 -->
    
        <xsl:template match="/">
    
            <h2>Mitglider</h2>
    
            <p>
                Ein kleiner einführender Text.
            </p>
    
            <table summary="Mitgliederliste"><tbody>
    
                <xsl:for-each select="space:resource/member">
    
                    
                        <td>
                            <xsl:value-of select="name"/>
                        </td>
    
                </xsl:for-each>
    
            </tbody></table>
    
        </xsl:template>
    
    </xsl:stylesheet>
    Es sollen nun immer 3 Mitglieder in einer Tabellenzeile dargestellt werden. Also voher <tr> nach 3 Mitgliedern </tr>. Wie kann ich das in die Transformation einbauen?
    Versucht habe ich folgendes:
    Code:
    // Im For-Each Konstrukt des XSLT
    <xsl:if test="position() mod 3 = 0"><tr></xsl:if>
    
    <td><xsl:value-of select="name"/></td>
    
    <xsl:if test="position() > 0 and position() mod 3 = 0"></tr></xsl:if>
    Jedoch kann es dann auf Grund des geöffneten/geschlossenen Tags nicht mehr ausgeführt werden.

    Hat jemand wohl eine Lösung für mich?

    Gruß John

  • #2
    Platzhalter. Hab was gepostet aber net die richtige Lösung

    Comment


    • #3
      Originally posted by Navarone View Post
      Platzhalter. Hab was gepostet aber net die richtige Lösung
      Sorry, was heißt das? Wofür steht Platzhalter?

      Comment


      • #4
        Ich hab etwas falsches gepostet das dein Problem nicht lösen tut und hab mir das als Platzhalter reserviert um dann gegebennenfalls eine Lösung einzufügen. Bin aber noch nicht auf eine gekommen.

        Comment


        • #5
          Ok, ich drücke dir die Daumen. :-)

          Comment


          • #6
            Probiere es so:

            Code:
              <xsl:template match="/">
                <h2>Mitglieder</h2>
                <p>Ein kleiner einführender Text.</p>
                <table summary="Mitgliederliste" border="1">
                  <tbody>
                    <xsl:apply-templates/>
                  </tbody>
                </table>
              </xsl:template>
            
              <xsl:template match="member">
                <xsl:if test="(position() - 1) mod 3 = 0">
                  <tr>
                    <xsl:apply-templates select="name"/>
                  </tr>
                </xsl:if>
              </xsl:template>
            
              <xsl:template match="name">
                <td>
                  <xsl:value-of select="."/>
                </td>
                <td>
                  <xsl:value-of select="following::name[1]"/>
                </td>
                <td>
                  <xsl:value-of select="following::name[2]"/>
                </td>
              </xsl:template>

            Comment


            • #7
              Super Danke.

              Eine Frage habe ich allerdings noch. Was macht diese Anweisung bzw. was bedeutet der Punkt.
              Code:
              <xsl:value-of select="."/>
              Und was bedeutet/macht diese Anweisung:
              Code:
              <xsl:value-of select="following::name[1]"/>
              Gruß John

              Comment


              • #8
                Wie bekomme ich denn jetzt die Werte von <office></office> mit hinein. Ich habe in der XSLT Datei weggelassen um es übersichtlicher zu halten.
                Ausgabe sollte später wie folgt aussehen:
                Code:
                <table>
                  <tr>
                    <td>
                       Scott Smith
                       <br />
                       President
                    </td>
                    <td>
                       Scott Smith
                       <br />
                       President
                    </td>
                    <td>
                       Scott Smith
                       <br />
                       President
                    </td>
                  </tr>
                  <tr>
                    <td>
                       Scott Smith
                       <br />
                       President
                    </td>
                    <td>
                       Scott Smith
                       <br />
                       President
                    </td>
                    <td>
                       Scott Smith
                       <br />
                       President
                    </td>
                  </tr>
                </table>

                Comment


                • #9
                  Der Punkt wählt den Kontextknoten, hier also jeweils den Inhalt (Textknoten) des ersten name-Elements der xsl:if-Auswahl.

                  following::name[1] bewegt sich auf der following-XPath-Achse zum nächst folgenden name-Element und das Prädikat [2] führt dann zum übernächsten. Somit werden pro tr-Reihe drei aufeinander folgende name-Elemente verarbeitet.

                  Vielleicht mal etwas tiefer in die XPath-Welt eintauchen

                  Comment


                  • #10
                    Die office-Elemente sind jeweils über das parent-Element erreichbar (.. steht für die parent-Achse):

                    Code:
                      <xsl:template match="name">
                        <td>
                          <xsl:value-of select="."/><br />
                          <xsl:value-of select="../office"/>     
                        </td>
                        <td>
                          <xsl:value-of select="following::name[1]"/><br />
                          <xsl:value-of select="following::name[1]/../office"/>
                        </td>
                        <td>
                          <xsl:value-of select="following::name[2]"/><br />
                          <xsl:value-of select="following::name[2]/../office"/>
                        </td>
                      </xsl:template>
                    Alternativ kann office über die following-sibling-Achse nach name verarbeitet werden:

                    Code:
                      <xsl:template match="name">
                        <td>
                          <xsl:value-of select="."/><br />
                          <xsl:value-of select="following-sibling::office"/>
                        </td>
                        <td>
                          <xsl:value-of select="following::name[1]"/><br />
                          <xsl:value-of select="following::name[1]/following-sibling::office"/>
                        </td>
                        <td>
                          <xsl:value-of select="following::name[2]"/><br />
                          <xsl:value-of select="following::name[2]/following-sibling::office"/>
                        </td>
                      </xsl:template>

                    Comment


                    • #11
                      Meinen herzlichsten Dank für deine Mühen.

                      Originally posted by Thomas Meinike View Post
                      Vielleicht mal etwas tiefer in die XPath-Welt eintauchen
                      Ja, das ist was dran. Ich bin allerdings schwer dabei.

                      Comment

                      Working...
                      X