Jan: Tabelle in xsl

Ich habe folgendes Problem:
Ich möchte in XSL eine Tabelle erstellen, die eine variable Anzahl Zeilen und Spalten besitzt. Die Anzahl für Zeilen und Spalten werden aus dem darzustellende xml-file ausgelesen. Da ich nun schon längere Zeit über diesem Problem grübel und leider zu keiner lauffähigen Lösung gekommen bin, wäre es schön, wenn mir Jemand helfen könnte.

Gruss

Jan

  1. Servus
    kleines Rahmenkonstruct

    <table border="1"><tr>
    <xsl:apply-templates select="xmlkurs/kursmitglied"/></tr>
    </table></body>
    </html>
    </xsl:template>

    <xsl:template match="kursmitglied/person">
    <td><xsl:value-of select="vorname"/></td>
    </xsl:template>

    <xsl:template match="kursmitglied/kurs">
    <td><xsl:value-of select="bezeichnung"/></td>
    </xsl:template>

    bydey

  2. Hallo,

    Ich habe folgendes Problem:

    Wie sieht dein XML aus und was ist umgefähr die Ausgabe die du erwartest?

    Grüße
    Thomas

    1. Hallo,

      Ich habe folgendes Problem:

      Wie sieht dein XML aus und was ist umgefähr die Ausgabe die du erwartest?

      Grüße Thomas

      Mein xml sieht folgendermaßen aus, wobei die Tabelle natürlich noch größer sein kann. Die Tabelle bzw. das xml-file wird entsprechend der vorgegebenen Zeilen-Spaltenanzahl generiert (hier jedoch nicht das Problem). Meine xsl-Versuche diesbezüglich habe ich Dir auch noch dazu kopiert (bisher leider fehlerhaft). Die Ausgabe soll lediglich die Elemente entsprechend ihren Bezeichnungen im xml-file (müsste eigentlich selbsterklärend sein) in einer Tabelle darstellen. Bei fester Anzahl Zeilen und Spalten würde ich dies auch ohne weiteres hinbekommen. Aber so gestaltet es sich etwas schwierig:

      <?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="TableStyle.xsl" ?> <page>  <show_table>true</show_table>  <table_columns>5</table_columns>  <table_rows>5</table_rows>  <table_headline>Headline</table_headline>  <table>   <tr>    <td>     <column_format>left</column_format>    </td>    <td>     <column_format>right</column_format>    </td>    <td>     <column_format>left</column_format>    </td>    <td>     <column_format>right</column_format>    </td>    <td>     <column_format>left</column_format>    </td>   </tr>   <tr>    <td>     <table_header>Headline 1</table_header>    </td>    <td>     <table_header>Headline 2</table_header>    </td>    <td>     <table_header>Headline 3</table_header>    </td>    <td>     <table_header>Headline 4</table_header>    </td>    <td>     <table_header>Headline 5</table_header>    </td>   </tr>   <!-- Zeile 1 -->   <tr>    <td>     <table_element>Element 11</table_element>    </td>    <td>     <table_element>Element 12</table_element>    </td>    <td>     <table_element>Element 13</table_element>    </td>    <td>     <table_element>Element 14</table_element>    </td>    <td>     <table_element>Element 15</table_element>    </td>   </tr>   <!-- Zeile 2 -->   <tr>    <td>     <table_element>Element 21</table_element>    </td>    <td>     <table_element>Element 22</table_element>    </td>    <td>     <table_element>Element 23</table_element>    </td>    <td>     <table_element>Element 24</table_element>    </td>    <td>     <table_element>Element 25</table_element>    </td>    <!-- Zeile 3 -->   </tr>   <tr>    <td>     <table_element>Element 31</table_element>    </td>    <td>     <table_element>Element 32</table_element>    </td>    <td>     <table_element>Element 33</table_element>    </td>    <td>     <table_element>Element 34</table_element>    </td>    <td>     <table_element>Element 35</table_element>    </td>   </tr>   <!-- Zeile 4 -->   <tr>    <td>     <table_element>Element 41</table_element>    </td>    <td>     <table_element>Element 42</table_element>    </td>    <td>     <table_element>Element 43</table_element>    </td>    <td>     <table_element>Element 44</table_element>    </td>    <td>     <table_element>Element 45</table_element>    </td>   </tr>   <!-- Zeile 5 -->   <tr>    <td>     <table_element>Element 51</table_element>    </td>    <td>     <table_element>Element 52</table_element>    </td>    <td>     <table_element>Element 53</table_element>    </td>    <td>     <table_element>Element 54</table_element>    </td>    <td>     <table_element>Element 55</table_element>    </td>   </tr>  </table> </page>

      xsl: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      <xsl:template match="/">       <html>          <head>             <title/>          </head>          <!-- Einbinden der pi_intranet.css -->          <link rel="stylesheet" href="css/style.css" type="text/css" />          <body>             <!-- Darstellung der Seitenstruktur -->             <xsl:if test="page/show_table = 'true'">             <xsl:apply-templates select="page/table_headline"/>             <br />             <xsl:apply-templates select="page/table" />             </xsl:if>          </body>       </html>    </xsl:template>

      <!-- Definition der einzelnen Schablonen -->

      <!-- Definition der table_headline -->    <xsl:template match="table_headline">     <p>      <xsl:value-of select="." />     </p>    </xsl:template>

      <!-- Versuch einer Schleifen-Konstruktion -->

      <xsl:template match="table">

      <table width="100%" border="1">      <tr>      <xsl:call-template name="column_headlines">       <xsl:with-param name="counter1" select="1" />      </xsl:call-template>      </tr>      <xsl:call-template name="table_construct">       <xsl:with-param name="counter2" select="3" />      </xsl:call-template>      </table>

      </xsl:template>

      <!-- Template, um die Spaltenüberschriften zu definieren -->    <xsl:template name="column_headlines">    <xsl:param name="counter1" />    xsl:choose     <xsl:when test="$counter1 <= number(../table_columns)">        <td>        <xsl:attribute name="align">         <xsl:value-of select="tr[1]/td[$counter1]/column_format" />        </xsl:attribute>        <xsl:value-of select="tr[2]/td[$counter1]/table_header"/>        </td>       <xsl:call-template name="column_headlines">        <xsl:with-param name="counter1" select="$counter1 + 1" />       </xsl:call-template>      </xsl:when>      xsl:otherwise       <xsl:call-template name="Abbruch1" />      </xsl:otherwise>    </xsl:choose>    </xsl:template>

      <!-- Template, um den Tabellenaufbau in Abhängigkeit von der vorgegebenen Zeilenanzahl zu definieren -->    <xsl:template name="table_construct">     <xsl:param name="counter2" />     xsl:choose       <xsl:when test="$counter2 < (number(../table_rows) + 3)">        <tr>         <xsl:call-template name="construct_cols">          <xsl:with-param name="counter2" select="$counter2" />          <xsl:with-param name="counter3" select="1" />         </xsl:call-template>        </tr>        <xsl:call-template name="table_construct">         <xsl:with-param name="counter2" select="$counter2 + 1" />        </xsl:call-template>       </xsl:when>       xsl:otherwise        <xsl:call-template name="Abbruch2" />       </xsl:otherwise>      </xsl:choose>     </xsl:template>

      <xsl:template name="construct_cols">      <xsl:param name="counter3" />      <xsl:param name="counter2" />       xsl:choose       <xsl:when test="$counter3 < number(../table_cols)">         <td>          <xsl:attribute name="align">           <xsl:value-of select="tr[1]/td[$counter3]/column_format" />          </xsl:attribute>          <xsl:value-of select="tr[$counter2]/td[$counter3]/table_element"/>         </td>         <xsl:call-template name="construct_cols">          <xsl:with-param name="counter3" select="$counter3 + 1" />          <xsl:with-param name="counter2" select="$counter2" />         </xsl:call-template>         </xsl:when>         xsl:otherwise          <xsl:call-template name="table_construct">          <xsl:with-param name="counter2" select="$counter2 + 1" />          </xsl:call-template>         </xsl:otherwise>       </xsl:choose>     </xsl:template>

      <xsl:template name="Abbruch1">      xsl:commentSchleife 1 beendet!</xsl:comment>     </xsl:template>

      <xsl:template name="Abbruch2">      xsl:commentSchleife 2 beendet!</xsl:comment>     </xsl:template>

      </xsl:stylesheet>

      1. Hallo,

        » Meine xsl-Versuche diesbezüglich habe ich Dir auch noch dazu kopiert (bisher leider fehlerhaft). Die Ausgabe soll lediglich die Elemente entsprechend ihren Bezeichnungen im xml-file (müsste eigentlich selbsterklärend sein) in einer Tabelle darstellen. Bei fester Anzahl Zeilen und Spalten würde ich dies auch ohne weiteres hinbekommen. Aber so gestaltet es sich etwas schwierig:

        So schwierig ist es nicht, man braucht nicht unbedingt an was kompliziertes denken:

        Grüße
        Thomas
        -------------------------------------------------------------
        <?xml version="1.0" encoding="iso-8859-1"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:variable name="ausrichtung" select="//column_format" />

        <xsl:template match="/page">
              <html>
                 <head>
                    <title/>
                 </head>
                 <body>
                    <xsl:if test="show_table = 'true'">
                    <xsl:apply-templates select="table"/>
                    </xsl:if>
                 </body>
              </html>
           </xsl:template>

        <xsl:template match="table">
           <table width="100%" border="1">
              <caption><xsl:value-of select="../table_headline" /></caption>
                 <xsl:apply-templates select="tr[position() != 1]"/>
           </table>
           </xsl:template>

        <xsl:template match="tr">
           <tr>
              <xsl:apply-templates select="td"/>
           </tr>
           </xsl:template>

        <xsl:template match="td">
              <xsl:variable name="pos1" select="position()" />
              xsl:choose
                 <xsl:when test="./table_header">
                    <th>
                       <xsl:attribute name="align">
                          <xsl:value-of select="$ausrichtung[position() = $pos1]" />
                       </xsl:attribute>
                       <xsl:value-of select="child::node()/text()" />
                   </th>
                 </xsl:when>
                 xsl:otherwise
                    <td>
                       <xsl:attribute name="align">
                          <xsl:value-of select="$ausrichtung[position() = $pos1]" />
                       </xsl:attribute>
                       <xsl:value-of select="child::node()/text()" />
                    </td>
                 </xsl:otherwise>
              </xsl:choose>
           </xsl:template>

        </xsl:stylesheet>