Главная » Годы летят... в XSLT

Годы летят… в 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>

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

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



5 Комментариев »

  1. 1  Плюс Минус  0

    Посоветуй почитать что-нибудь по XSLT.

    Комментарий by FX Poster — Март 9, 2008 @ 4:38 pm | Цитировать

  2. 2  Плюс Минус  +1

    FX Poster

    xmlhack.ru/books/xslt/
    zvon.org/

    Ну и на w3schools можно :)

    Комментарий by neutrino — Март 9, 2008 @ 4:45 pm | Цитировать

  3. 3  Плюс Минус  +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>
    

    Комментарий by Dmitry — Март 11, 2008 @ 7:33 am | Цитировать

  4. 4  Плюс Минус  0

    Согласен, Дмитрий, спасибо. Поправил.

    Комментарий by neutrino — Март 11, 2008 @ 8:42 am | Цитировать

  5. 5  Плюс Минус  0

    я бы сделал через
    <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 | Цитировать

Оставить комментарий

XHTML (Разрешенные теги): <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong> .

Если вы хотите вставить в комментарий код, то жмите на кнопку "HTML" в редакторе и используйте теги <pre><code> и </pre></code> для вставки.

Не забывайте о том, что теги, вставленые без использования &lt;/&gt; будут автоматически трансформироваться.

Цитировать отмеченый текст