adapter: Schleife von 1 bis 31

Liebes Forum,

ich arbeite gerade an einem Datenbankverwaltungstool in PHP5 mit XML/XSLT. Soll heissen: will man einen Tabelleneintrag bearbeiten, so holt PHP den Eintrag aus der Datenbank, macht ein XML-Dokument daraus und jagt dieses durch einen XSLT-Prozessor, um das XHTML zu erzeugen, welches letztlich das Eingabeformular für den User darstellt.

Probleme machen mir nun vorselektierte Auswahllisten: Beispielsweise  sowas hier soll mittels XSLT automatisch erzeugt werden:

<select name="_xy_month">
  <option>1</option>
  <option>2</option>
  ...
  <option selected="selected">12</option>
  ...
  <option>30</option>
  <option>31</option>
</select>

Dafür benötige ich eine Schleife, wie man sie aus der imperativen Programmierung kennt:
  for (i=1; i<32; i++) { ... }

Geht sowas auch in XSLT? Also entweder eine Variable hochzählen oder aber eine XPATH-Funktion, die ein Interval oder eine Menge ausgibt, so dass eine Code wie dieser resultieren würde:
  <xsl:for-each select="Interval(1,31)/*" >
    <option><xsl:for-each select="."></option>
  </xsl:for-each>

Schöne Grüße
adapter

  1. Postscriptum:

    Auf etwas umständliche Weise habe ich es jetzt geschafft: indem ich dem durch XSLT zu verarbeitendem XML-Dokument mit den Daten die möglichen option-Werte mit übergebe:

    <test>
      <row>
        <id>17</id>
        <title>titel test</title>
        <datetime>
          <year>2005</year>
          <month>03</month>
          <day>11</day>
          <hours>17</hours>
          <minutes>32</minutes>
          <seconds>10</seconds>
        </datetime>
      </row>
      <data>
        <datetime>
          <year>
            <option>2010</option>
            <option>2009</option>
            <option>2008</option>
            <option>2007</option>
            <option>2006</option>
            <option>2005</option>
          </year>
          <month>
    ...
    ...
        </datetime>
      </data>
    </test>

    Ich muss wohl nicht erwähnen, dass diese Lösung aus Performancegründen suboptiomal ist.

    Schöne Grüße
    adapter

    1. Hallo adapter,

      bin schon vor ähnlichen Problemen gestanden:

      • es geht wohl nur mit with-param
      • eine Lösung die mit Option Feldern arbeitet siehst du unten
      • n kann ein Name oder eine Zahl sein
      • p kann nur eine Zahl sein

      <!-- eingabefelder für spieler, tore und torwart -->
      <xsl:template name="select_player">
      <xsl:param name="n" />
      <xsl:param name="p" />

      <tr>
      <td><xsl:value-of select="$p"/></td>
      <td>
      <select name="player{$p}" size="1">
      <option></option>

      <xsl:for-each select="//all_games/game/all_players/player[count(. | key('group-players', @name)[1]) = 1]">
      <xsl:sort select="@name" order="ascending" data-type="text" />
      xsl:choose
       <xsl:when test="@name = $n">
        <option selected=""><xsl:value-of select="@name"/></option>
       </xsl:when>
       xsl:otherwise
        <option><xsl:value-of select="@name"/></option>
       </xsl:otherwise>
      </xsl:choose>

      </xsl:for-each>
      </select>
      </td>
      <td>
      xsl:choose
       <xsl:when test="@name = $n">
        <input name="goals{$p}" type="number" size="2" maxlength="3" value="{goals}"/>
       </xsl:when>
       xsl:otherwise
        <input name="goals{$p}" type="number" size="2" maxlength="3"/>
       </xsl:otherwise>
      </xsl:choose>
      </td>
      <td>
      xsl:choose
       <xsl:when test="goalkee = 'Tor' and @name = $n">
        <input type="checkbox" name="goalkee{$p}" value="1" checked=""/>
       </xsl:when>
       xsl:otherwise
        <input type="checkbox" name="goalkee{$p}" value="1"/>
       </xsl:otherwise>
      </xsl:choose>
      </td>
      </tr>

      <xsl:if test="$n &gt; 1">
         <xsl:call-template name="select_player">
          <xsl:with-param name="n" select="$n - 1" />
          <xsl:with-param name="p" select="$p + 1" />
         </xsl:call-template>
      </xsl:if>

      </xsl:template>

      bydey

      --
      -- noch immer ein erfolgloser <DIV> Jünger --
      1. hallo dey,
        vielen dank. deinen tip kann ich nachvollziehen. an so etwas (rekursiver template-aufruf) hatte ich auch schon gedacht, habe dann aber die möglichkeit der parameterübergabe nicht gesehen, da ich noch XSLT-neuling bin. jetzt weiß ich ja, wie es geht.
        schöne grüße
        axel

  2. Hallo,

    ich arbeite gerade an einem Datenbankverwaltungstool in PHP5 mit XML/XSLT. Soll heissen: will man einen Tabelleneintrag bearbeiten, so holt PHP den Eintrag aus der Datenbank, macht ein XML-Dokument daraus und jagt dieses durch einen XSLT-Prozessor, um das XHTML zu erzeugen, welches letztlich das Eingabeformular für den User darstellt.

    Probleme machen mir nun vorselektierte Auswahllisten: Beispielsweise  sowas hier soll mittels XSLT automatisch erzeugt werden:

    <select name="_xy_month">
      <option>1</option>
      <option>2</option>
      ...
      <option selected="selected">12</option>
      ...
      <option>30</option>
      <option>31</option>
    </select>

    Dafür benötige ich eine Schleife, wie man sie aus der imperativen Programmierung kennt:
      for (i=1; i<32; i++) { ... }

    Geht sowas auch in XSLT? Also entweder eine Variable hochzählen oder aber eine XPATH-Funktion, die ein Interval oder eine Menge ausgibt, so dass eine Code wie dieser resultieren würde:
      <xsl:for-each select="Interval(1,31)/*" >

    Hä??? Wie biette?
    Was ist jetzt "Interval"? Und was sollen nun "1" bzw. "31" denn darstellen? Ich kann deine Fragestellung damit nicht nachvollziehen.

    <option><xsl:for-each select="."></option>

    Das wäre so oder so falsch.
    Und dafür was du laut deiner Fragestellung möchtest, zumindest so verstehe ich das, brauchst du keine besondere "Schleifen":

    <xsl:template match="select">
     <select>
      <xsl:for-each select="option">
      <option>
       <xsl:if test="@selected">
        <xsl:attribute name="selected">selected</xsl:attribute>
       </xsl:if>
       <xsl:value-of select="." />
      <option>
     </xsl:for-each>
     </select>
    </xsl:template>

    Grüße
    Thomas

    --
    Surftip: kennen Sie schon Pipolino's Clowntheater?
    http://www.clowntheater-pipolino.net/
    1. echo $begrüßung;

      for (i=1; i<32; i++) { ... }
      »
      Geht sowas auch in XSLT? Also entweder eine Variable hochzählen oder aber eine XPATH-Funktion, die ein Interval oder eine Menge ausgibt, so dass eine Code wie dieser resultieren würde:
        <xsl:for-each select="Interval(1,31)/*" >

      Hä??? Wie biette?

      ...nicht grad sehr freundlich...

      Was ist jetzt "Interval"?

      Interval soll eine XPath-Funktion darstellen, die ein Knoten-Set mit fortlaufenden Werten von einem Startwert beginnend bis zu einem Endwert liefert. Gesucht ist also ein XSL/XPath-Äquivalent zu oben genannter for-Schleife.

      Und was sollen nun "1" bzw. "31" denn darstellen?

      der Start- und Endwert als Parameter für die gewünschte Funktion Interval

      echo "$verabschiedung $name";

      1. Hallo,

        echo $begrüßung;

        "...nicht grad sehr freundlich..."

        for (i=1; i<32; i++) { ... }
        »
        Geht sowas auch in XSLT? Also entweder eine Variable hochzählen oder aber eine XPATH-Funktion, die ein Interval oder eine Menge ausgibt, so dass eine Code wie dieser resultieren würde:
          <xsl:for-each select="Interval(1,31)/*" >

        Hä??? Wie biette?

        ...nicht grad sehr freundlich...

        So war es eigentlich nicht gemeint, sondern nur als starke Verwunderung.

        Was ist jetzt "Interval"?

        Interval soll eine XPath-Funktion darstellen, die ein Knoten-Set mit fortlaufenden Werten von einem Startwert beginnend bis zu einem Endwert liefert. Gesucht ist also ein XSL/XPath-Äquivalent zu oben genannter for-Schleife.

        Danke, das geht aus der Frage nicht hervor (ja, ich habe die JavaScript-Funktion gesehen, aber das es kein Input-Quellcode gab, kann ich damit auch nichts anfagen).

        Und was sollen nun "1" bzw. "31" denn darstellen?

        der Start- und Endwert als Parameter für die gewünschte Funktion Interval

        Dann wäre http://forum.de.selfhtml.org/archiv/2003/1/t33710/#m183373 noch immer das einfachste.

        echo "$verabschiedung $name";

        Grüße
        Thomas  - ich kann das noch immer selbst hinschreiben ;-þ -

        --
        Surftip: kennen Sie schon Pipolino's Clowntheater?
        http://www.clowntheater-pipolino.net/
        1. Hallo Thomas,

          Dann wäre http://forum.de.selfhtml.org/archiv/2003/1/t33710/#m183373 noch immer das einfachste.

          Dasselbe Konzept hat dey ja auch vorgeschlagen und funktioniert bestens.

          Schöne Grüße
          adapter

          1. Hallo,

            Dann wäre http://forum.de.selfhtml.org/archiv/2003/1/t33710/#m183373 noch immer das einfachste.

            Dasselbe Konzept hat dey ja auch vorgeschlagen und funktioniert bestens.

            <del>daselbe</del><ins>ähnliches></ins> :)
            Wenn dies ist was du gebraucht hast, ist es bestens ;-)

            Grüße
            Thomas

            --
            Surftip: kennen Sie schon Pipolino's Clowntheater?
            http://www.clowntheater-pipolino.net/
            1. Hallo Thomas,

              <del>daselbe</del><ins>ähnliches></ins> :)

              doch, es liegt dasselbe Konzept zugrunde, wenngleich es nur ähnliche Implementierungen sind. Es handelt sich in beiden Fällen um die Programmierung einer Schleife mit Hilfe einer rekursiven Funktion. Der Laufindex wird dabei als Parameter an diese Funktion übergeben.

              Schöne Grüße
              adapter