JO: for-each und Tabellen

Hallo,

ich habe folgendes Problem: ich gehe eine Liste mit for-each durch, und will den Inhalt in eine Tabelle schreiben. Allerdings will ich zwei Spalten haben. Wie geht das?

So hat es nicht funktioniert, da <TR> innerhalb des xsl:if nicht wieder geschlossen wird:

<xsl:for-each ...>

<xsl:if test="position() mod 2 = 1">
  <TR>
 </xsl:if>

<TD colspan="2">
  <xsl:value-of select="."/>
 </TD>

<xsl:if test="position() mod 2 = 0">
  </TR>
 </xsl:if>

</xsl:for-each>

Hat jemand eine Idee?

  1. Hallo,

    ich habe folgendes Problem: ich gehe eine Liste mit for-each durch, und will den Inhalt in eine Tabelle schreiben. Allerdings will ich zwei Spalten haben. Wie geht das?

    So hat es nicht funktioniert, da <TR> innerhalb des xsl:if nicht wieder geschlossen wird:

    Was soll denn genau passieren und wie sieht die XML-Datenstruktur aus?

    MfG, Thomas

  2. Hallo,

    ich habe folgendes Problem: ich gehe eine Liste mit for-each durch, und will den Inhalt in eine Tabelle schreiben. Allerdings will ich zwei Spalten haben. Wie geht das?

    Hi,
    genau das gleiche Problem hatte ich auch schon. Da XSL auf XML-basiert koennen keine Tags geschachtelt. Ich habe zwar ne Loesung gefunden aber recht umstaendlich.

    Die XML-Daten sehen wie folgt aus. Es gibt eine Liste von Telefonnummern von Mitarbeitern:
    <?xml version="1.0" encoding="ISO-8859-1" ?>
    <?xml-stylesheet type="text/xsl" href="Mitarbeiter_Telef.xsl" ?>
    <telliste>
      <raum nr="1">
        <mitarb><name>Hans Hase</name><telefon>1234</telefon></mitarb>
        <mitarb><name>Tina Tiger</name><telefon>5678</telefon></mitarb>
        <mitarb><name>Mumie Murmel</name><telefon>9123</telefon></mitarb>
        <mitarb><name>Inge Igel</name><telefon>4567</telefon></mitarb>
      </raum>
      <raum nr="2">
        <mitarb><name>Hermann Huhn</name><telefon>8912</telefon></mitarb>
        <mitarb><name>Georg Gans</name><telefon>3456</telefon></mitarb>
        <mitarb><name>Anne Aal</name><telefon>7891</telefon></mitarb>
        <mitarb><name>Roger Rabe</name><telefon>2345</telefon></mitarb>
        <mitarb><name>Walter Wiesel</name><telefon>6789</telefon></mitarb>
        <mitarb><name>Ralf Robbe</name><telefon>1357</telefon></mitarb>
        <mitarb><name>Jürgen Jaguar</name><telefon>6813</telefon></mitarb>
      </raum>
    </telliste>

    Diese Liste sollte in einer Tabelle pro Raum zweispaltig ausgegeben werden:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
    <HTML>
    <BODY>
      <h2>Telefonliste</h2>
      <xsl:apply-templates />
    </BODY>
    </HTML>
    </xsl:template>

    <xsl:template match="/telliste/raum">
    <table>
      <xsl:attribute name="border">1</xsl:attribute>
      <xsl:attribute name="frame">below</xsl:attribute>
      <xsl:attribute name="rules">none</xsl:attribute>
      <caption>
        <xsl:attribute name="align">left</xsl:attribute>
        xsl:textE 43 Raum </xsl:text><xsl:value-of select="@nr" />
      </caption>
      <colgroup>
      <col><xsl:attribute name="width">170</xsl:attribute></col>
      <col><xsl:attribute name="width">100</xsl:attribute></col>
      <col><xsl:attribute name="width">170</xsl:attribute></col>
      <col><xsl:attribute name="width">100</xsl:attribute></col>
      </colgroup>
      <xsl:call-template name="Schleife">
        <xsl:with-param name="Zaehler" select="1" />
        <xsl:with-param name="Ende" select="count(mitarb)" />
      </xsl:call-template>
    </table>
    </xsl:template>

    <xsl:template name="Schleife">
     <xsl:param name="Zaehler" />
     <xsl:param name="Ende" />
     xsl:choose
      <xsl:when test="$Zaehler <= $Ende">
        <tr>
        <td><xsl:value-of select="mitarb[$Zaehler]/name" /></td>
        <td><xsl:value-of select="mitarb[$Zaehler]/telefon" /></td>
        <td><xsl:value-of select="mitarb[$Zaehler+1]/name" /></td>
        <td><xsl:value-of select="mitarb[$Zaehler+1]/telefon" /></td>
        </tr>
        <xsl:call-template name="Schleife">
          <xsl:with-param name="Zaehler" select="$Zaehler + 2" />
          <xsl:with-param name="Ende" select="$Ende" />
        </xsl:call-template>
      </xsl:when>
     </xsl:choose>
    </xsl:template>

    </xsl:stylesheet>

    1. Vielen Dank für den guten Hinweis. Ich denke das sollte bei mir auch funktionieren.

  3. Hi,
    probiers mal so:

    <xsl:for-each ...>
    xsl:choose
        <xsl:when test="position() mod 2 = 1">
            <TR>
               <TD colspan="2">
                  <xsl:value-of select="."/>
               </TD>
            </TR>
        </xsl:when>
        xsl:otherwise
           <TD colspan="2">
            <xsl:value-of select="."/>
           </TD>
        </xsl:otherwise>
    </xsl:choose>
    </xsl:for-each>

    Gruß
    Axel :-)

    1. Danke, ja das stimmt, mit mod könnte man das auch machen. Ich habe mal folgendes probiert, das funktioniert auch:

      <xsl:for-each select="/RESPONSE/LOOKUP/HIT/MOL/REFS/REF/KEYWORDS/KEYWORD">

      <xsl:if test="position() mod 2 = 1">

      <TR>
          <TD colspan="2"xsl:value-of select="."/></TD>
          <xsl:variable name="pos" select="position()"/>
          <TD colspan="2"><xsl:value-of select="(/RESPONSE/LOOKUP/HIT/MOL/REFS/REF/KEYWORDS/KEYWORD)[$pos + 1]"/></TD>
         </TR>

      </xsl:if>

      </xsl:for-each>

      1. Danke, ja das stimmt, mit mod könnte man das auch machen. Ich habe mal folgendes probiert, das funktioniert auch:

        <xsl:for-each select="/RESPONSE/LOOKUP/HIT/MOL/REFS/REF/KEYWORDS/KEYWORD">

        <xsl:if test="position() mod 2 = 1">

        <TR>
            <TD colspan="2"xsl:value-of select="."/></TD>
            <xsl:variable name="pos" select="position()"/>
            <TD colspan="2"><xsl:value-of select="(/RESPONSE/LOOKUP/HIT/MOL/REFS/REF/KEYWORDS/KEYWORD)[$pos + 1]"/></TD>
           </TR>

        </xsl:if>

        </xsl:for-each>

        na, hervorragend - so funktioniert auch meine Telefonliste richtig gut und das xsl-file sieht viel uebersichtlicher aus.

        gruss, Monika

  4. Hallo nochmal,

    auf die unten beschrieben Arten geht es zwar, aber nur solange wie man die Knotenmenge unsortiert ausgibt. Sortiert man hingegen zuerst, dann hilft der Elementzugriff über den Index nicht mehr viel, da sich dieser auf die unsortierte Knotenmenge bezieht. Weiss jemand, was man da machen könnte?