На днях столкнулся с задачей вывода списка годов между 1900 и 2008 в теге select. Дело было при создании формы регистрации, а заказчик почему-то не хотел использовать Date Picker.

Так как сайт разрабатывается с помощью XML/XSL и без БД, то и решение должно быть на XSL. Если с месяцами все понятно и их в любом случае надо тянуть из XML, то дни и года надо выписать через темплейт.
После продолжительных поисков я нашел оптимальное для себя решение. Вот как это выглядит:
<xsl:template name="loop">
<xsl:param name="i"/>
<xsl:param name="count"/>
<xsl:if test="$count >= $i">
<option>
<xsl:value-of select="$i"/>
</option>
<xsl:call-template name="loop">
<xsl:with-param name="i" select="$i + 1"/>
<xsl:with-param name="count" select="$count"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
Простой цикл. Задаются параметры начала и конца, и производится вывод чего захотите. В моем случае это элементы option, с таким же успехом это могут быть строки в таблице, элементы списка и тд. Этот темплейт сохраняется в файле темплейтов, а сам вызов – на конкретной странице, что дает большую гибкость и избавляет от описывания того же самого в каждом конкретном случае. Вот так выглядит вызов темплейта:
<select tabindex="10" id="year" name="year">
<xsl:call-template name="loop">
<xsl:with-param name="i">1900</xsl:with-param>
<xsl:with-param name="count">2008</xsl:with-param>
</xsl:call-template>
</select>
Параметры задаются в зависимости от надобности. В данном случае это года.
Буду рад альтернативным решениям.
Посоветуй почитать что-нибудь по XSLT.
FX Poster
xmlhack.ru/books/xslt/
zvon.org/
Ну и на w3schools можно :)
Наверное код можно слегка оптимизировать:
Согласен, Дмитрий, спасибо. Поправил.
я бы сделал через
<xsl:apply-templates mode="year"/>и еще добавил бы<xsl:param name="i" select="1900"/>
<xsl:param name="count" select="2008"/>
Большое спасибо. Очень помогло это решение. Вы спасли мой вечер пятницы от утомительного занятия побороть эту проблему! Дай Бог Вам здоровья!!! И хор вызодных
Спасибо, очень пригодилось