Годы летят… в XSLT

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

select xslt

Так как сайт разрабатывается с помощью 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>

Параметры задаются в зависимости от надобности. В данном случае это года.

Буду рад альтернативным решениям.

7 thoughts on “Годы летят… в XSLT

  1. Наверное код можно слегка оптимизировать:

     <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>
    
  2. я бы сделал через
    <xsl:apply-templates mode="year"/> и еще добавил бы <xsl:param name="i" select="1900"/>
    <xsl:param name="count" select="2008"/>

  3. Большое спасибо. Очень помогло это решение. Вы спасли мой вечер пятницы от утомительного занятия побороть эту проблему! Дай Бог Вам здоровья!!! И хор вызодных

Leave a Reply

Your email address will not be published. Required fields are marked *