This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
private:koding:hostcms:modules:xsl:declension [27.09.16 в 15:27] maximzasorin_gmail.com создано |
private:koding:hostcms:modules:xsl:declension [27.06.17 в 14:49] (current) maximzasorin_gmail.com ↷ Страница перемещена из private:koding:hostcms:xsl:useful:declension в private:koding:hostcms:modules:xsl:declension |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Склонение числительных ====== | ====== Склонение числительных ====== | ||
+ | |||
+ | ===== Вариант №1 ===== | ||
Для склонения числительных обычно применяется подшаблон следующего вида, для использования в него необходимо вставить варианты требуемого для склонения слова: | Для склонения числительных обычно применяется подшаблон следующего вида, для использования в него необходимо вставить варианты требуемого для склонения слова: | ||
Line 58: | Line 60: | ||
<code> | <code> | ||
2 слова | 2 слова | ||
+ | </code> | ||
+ | |||
+ | ===== Вариант №2 ===== | ||
+ | |||
+ | Следующий вариант подходит в случае, если слонение слова требуется использовать лишь однажды, он более нагляден и универсален, его можно использовать с любым словом: | ||
+ | |||
+ | <code xsl> | ||
+ | <xsl:template name="declension2"> | ||
+ | <xsl:param name="number" /> | ||
+ | <xsl:param name="word" /> | ||
+ | |||
+ | <xsl:variable name="nominative"> | ||
+ | <xsl:value-of select="substring-before($word, '|')" /> | ||
+ | </xsl:variable> | ||
+ | |||
+ | <xsl:variable name="genitive_singular"> | ||
+ | <xsl:value-of select="substring-before(substring-after($word, '|'), '|')" /> | ||
+ | </xsl:variable> | ||
+ | |||
+ | <xsl:variable name="genitive_plural"> | ||
+ | <xsl:value-of select="substring-after(substring-after($word, '|'), '|')" /> | ||
+ | </xsl:variable> | ||
+ | |||
+ | <xsl:variable name="last_digit"> | ||
+ | <xsl:value-of select="$number mod 10"/> | ||
+ | </xsl:variable> | ||
+ | |||
+ | <xsl:variable name="last_two_digits"> | ||
+ | <xsl:value-of select="$number mod 100"/> | ||
+ | </xsl:variable> | ||
+ | |||
+ | <xsl:choose> | ||
+ | <xsl:when test="$last_digit = 1 and $last_two_digits != 11"> | ||
+ | <xsl:value-of select="$nominative"/> | ||
+ | </xsl:when> | ||
+ | <xsl:when test="$last_digit = 2 and $last_two_digits != 12 or $last_digit = 3 and $last_two_digits != 13 or $last_digit = 4 and $last_two_digits != 14"> | ||
+ | <xsl:value-of select="$genitive_singular"/> | ||
+ | </xsl:when> | ||
+ | <xsl:otherwise> | ||
+ | <xsl:value-of select="$genitive_plural"/> | ||
+ | </xsl:otherwise> | ||
+ | </xsl:choose> | ||
+ | </xsl:template> | ||
+ | </code> | ||
+ | |||
+ | Как использовать: | ||
+ | |||
+ | <code xsl> | ||
+ | <xsl:variable name="count" select="2" /> | ||
+ | |||
+ | <xsl:value-of select="$count" /> | ||
+ | <xsl:text> </xsl:text> | ||
+ | <xsl:call-template name="declension2"> | ||
+ | <xsl:with-param name="number" select="$count"/> | ||
+ | <xsl:with-param name="word" select="'слово|слова|слов'"/> | ||
+ | </xsl:call-template> | ||
+ | </code> | ||
+ | |||
+ | Результат: | ||
+ | |||
+ | <code> | ||
+ | 2 слова | ||
+ | </code> | ||
+ | |||
+ | ===== PS ===== | ||
+ | |||
+ | Редко требуется использовать само слово внужной форме без самого числа, задающего эту форму, то есть обычно выводится что-то вроде «2 яблока», «5 яблок», а сами слова «яблока» и «яблок» никакого смысла не несут и по отдельности от числа не используются, поэтому в шаблоны можно добавить код, который это число будет выводить, например: | ||
+ | |||
+ | <code xsl> | ||
+ | <!-- ... --> | ||
+ | <xsl:value-of select="$number" /> | ||
+ | <xsl:text> </xsl:text> | ||
+ | |||
+ | <xsl:choose> | ||
+ | <xsl:when test="$last_digit = 1 and $last_two_digits != 11"> | ||
+ | |||
+ | <!-- ... --> | ||
</code> | </code> | ||
<wrap lo>Страницу создал Максим Засорин 27.09.16 в 15:23</wrap> | <wrap lo>Страницу создал Максим Засорин 27.09.16 в 15:23</wrap> | ||
+ | |||
+ | ~~DISCUSSION~~ |