На днях столкнулся с задачей вывода списка годов между 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>
Параметры задаются в зависимости от надобности. В данном случае это года.
Буду рад альтернативным решениям.
Войти
RSS-подписка
Читать в ЖЖ
Яndex-Лента
В Google Reader

(проголосовали: 3, рейтинг: 3.67 из 5)
Посоветуй почитать что-нибудь по XSLT.
Комментарий by FX Poster — Март 9, 2008 @ 4:38 pm | Цитировать
FX Poster
xmlhack.ru/books/xslt/
zvon.org/
Ну и на w3schools можно
Комментарий by neutrino — Март 9, 2008 @ 4:45 pm | Цитировать
Наверное код можно слегка оптимизировать:
Комментарий by Dmitry — Март 11, 2008 @ 7:33 am | Цитировать
Согласен, Дмитрий, спасибо. Поправил.
Комментарий by neutrino — Март 11, 2008 @ 8:42 am | Цитировать
я бы сделал через
<xsl:apply-templates mode="year"/>и еще добавил бы<xsl:param name="i" select="1900"/>
<xsl:param name="count" select="2008"/>
Комментарий by KBA-KBA — Март 11, 2008 @ 4:48 pm | Цитировать