Главная » XSLT » Получение названий дней и месяцев

0

Задача

Требуется преобразовать числовые значения дней недели и месяцев в символьные.

Решение XSLT 1.0

Если для вашего приложения интернационализация не нужна, подойдет та­кой простой код:

<xsl:template name="ckbk:get-day-of-the-week-name"> <xsl:param name="day-of-the-week"/>

<xsl:choose>

<xsl:when test="$day-of-the-week = 0">BocKpeceHbe</xsl:when> <xsl:when test="$day-of-the-week = 1">noHejenbHHK</xsl:when> <xsl:when test="$day-of-the-week = 2">BTopHMK</xsl:when> <xsl:when test="$day-of-the-week = 3">Cpena</xsl:when> <xsl:when test="$day-of-the-week = 4">4eTBepr</xsl:when> <xsl:when test="$day-of-the-week = 5">nHTHHua</xsl:when> <xsl:when test="$day-of-the-week = 6">Cy66oTy</xsl:when> <xsl:otherwise>

ошибка: <xsl:value-of select="$day-of-the-week"/> </xsl:otherwise> </xsl:choose>

</xsl:template>

<xsl:template name="ckbk:get-day-of-the-week-abbreviation"> <xsl:param name="day-of-the-week"/>

<xsl:choose>

<xsl:when test="$day-of-the-week = 0">Bс</xsl:when> <xsl:when test="$day-of-the-week = 1">nH</xsl:when> <xsl:when test="$day-of-the-week = 2">Bт</xsl:when> <xsl:when test="$day-of-the-week = 3">Ср</xsl:when> <xsl:when test="$day-of-the-week = 4">Чт</xsl:when> <xsl:when test="$day-of-the-week = 5">Пт</xsl:when> <xsl:when test="$day-of-the-week = 6">Сб</xsl:when> <xsl:otherwise>

ошибка: <xsl:value-of select="$day-of-the-week"/> </xsl:otherwise> </xsl:choose>

</xsl:template>

<xsl:template name="ckbk:get-month-name"> <xsl:param name="month"/>

<xsl:choose>

<xsl:when test="$month        = 1">Январь</xsl:when>

<xsl:when test="$month        = 2">Февраль</xsl:when>

<xsl:when test="$month        = 3">Mарт</xsl:when>

<xsl:when test="$month        = 4">Aпрель</xsl:when>

<xsl:when test="$month        = 5">Mай</xsl:when>

<xsl:when test="$month        = 6">Июнь</xsl:when>

<xsl:when test="$month        = 7">Июль</xsl:when>

<xsl:when test="$month        = 8">Aвгуст</xsl:when>

<xsl:when test="$month        = 9">Сентябрь</xsl:when>

<xsl:when test="$month        = 10">0ктябрь</xsl:when>

<xsl:when test="$month        = 11">Hоябрь</xsl:when>

<xsl:when test="$month        = 12">Декабрь</xsl:when>

<xsl:otherwise>ошибка: <xsl:value-of select="$month"/></xsl:otherwise> </xsl:choose>

</xsl:template>

<xsl:template name="ckbk:get-month-abbreviation"> <xsl:param name="month"/>

<xsl:choose>

<xsl:when test="$month = 1">Янв</xsl:when>

<xsl:when test="$month = 2">Фев</xsl:when>

<xsl:when test="$month = 3">Mар</xsl:when>

<xsl:when test="$month = 4">Aпр</xsl:when>

<xsl:when test="$month = 5">Mай</xsl:when>

<xsl:when test="$month = 6">Июн</xsl:when>

<xsl:when test="$month = 7">Июл</xsl:when>

<xsl:when test="$month = 8">Aвг</xsl:when>

<xsl:when test="$month = 9">Cен</xsl:when>

<xsl:when test="$month = 10">0кт</xsl:when>

<xsl:when test="$month = 11">Hоя</xsl:when>

<xsl:when test="$month = 12">Дек</xsl:when>

<xsl:otherwise>ошибка: <xsl:value-of select="$month"/></xsl:otherwise> </xsl:choose>

</xsl:template>

XSLT 2.0

В XSLT 2.0 есть функция format-date(), которая решает как рассматрива­емую в этом рецепте, так и многие другие задачи. В некоторых реализациях она поддерживает и интернационализацию.

<xsl:function name="ckbk:get-day-of-the-week-name" as="xs:string"> <xsl:param name="day-of-the-week" as="xs:integer"/>

<!– Подойдет любое прошедшее воскресенье. Я произвольно выбрал воскресенье 14 августа 2005, так как именно в этот день я пишу данный текст –>

<xsl:variable name="date"

select="xs:date(‘2005-08-‘). string(14 + $day-of-the-week))" as="xs:date"/>

<xsl:sequence select="format-date($date, "[F]"/>

</xsl:function>

<xsl:function name="ckbk:get-day-of-the-week-name-abbr" as="xs:string"> <xsl:param name="day-of-week" as="xs:integer"/>

<xsl:variable name="date"

select="xs:date(‘2005-08-‘). string(14 + $day-of-the-week))" as="xs:date"/>

<xsl:sequence select="format-date($date, ‘[FNn,3-3]’)"/>

</xsl:function>

<xsl:function name="ckbk:get-month-name" as="xs:string"> <xsl:param name="month" as="xs:integer"/>

<xsl:variable name="jan01" select="xs:date(‘2005-01-01′)" as="xs:date"/>

<!– Здесь для получения даты, передаваемой format-date, мы выполняем операцию сложения даты с интервалом, а не манипулируем строками –> <xsl:sequence select="format-date($jan01 +

xdt:yearMonthDuration(concat(‘P’,$month – 1,’M’)), ‘[MNn]’)"/>

</xsl:function>

<xsl:function name="ckbk:get-month-name-abbr" as="xs:string"> <xsl:param name="month" as="xs:integer"/>

<xsl:variable name="jan01" select="xs:date(‘2005-01-01′)" as="xs:date"/>

<xsl:sequence select="format-date($jan01 +

xdt:yearMonthDuration(concat(‘P,,$month – 1,’M’)), ‘[MNn,3-3]’)"/>

</xsl:function>

Второй параметр функции format-date – строка-шаблон, которая окружа­ет символы форматирования, заключенные в квадратные скобки (например, [D01] ). Определено много разных символов форматирования, полный перечень см. в документе http://www.w3.org/TR/xslt20/#function-format-date.

Обсуждение XSLT 1.0

Эти шаблоны годятся, если ваше приложение предназначено только для рус­скоговорящей аудитории. Но их можно и обобщить, организовав таблицу:

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://www.ora.com/XSLTCookbook/NS/dates">

<!— США : us —>

<ckbk:month country="us" m="1"        name="January" abbrev="Jan" />

<ckbk:month country="us" m="2"        name="February" abbrev="Feb"/>

<ckbk:month country="us" m="3"        name="March" abbrev="Mar"/>

<ckbk:month country="us" m="4"        name="April" abbrev="Apr"/>

<ckbk:month country="us" m="5"        name="May" abbrev="May"/>

<ckbk:month country="us" m="6"        name="June" abbrev="Jun"/>

<ckbk:month country="us" m="7" name="July" abbrev="Jul"/> <ckbk:month country="us" m="8" name="August" abbrev="Aug"/> <ckbk:month country="us" m="9" name="September" abbrev="Sep"/> <ckbk:month country="us" m="10" name="October" abbrev="Oct"/> <ckbk:month country="us" m="11" name="November" abbrev="Nov"/> <ckbk:month country="us" m="12" name="December" abbrev="Dec"/>

<!– TepMaH^ : de –>

<ckbk:month country="de" m="1" name="Januar" abbrev="Jan"/> <ckbk:month country="de" m="2" name="Februar" abbrev="Feb"/> <ckbk:month country="de" m="3" name="Mjrz" abbrev="Mnr"/> <ckbk:month country="de" m="4" name="April" abbrev="Apr"/> <ckbk:month country="de" m="5" name="Mai" abbrev="Mai"/> <ckbk:month country="de" m="6" name="Juni" abbrev="Jun"/> <ckbk:month country="de" m="7" name="Juli" abbrev="Jul"/> <ckbk:month country="de" m="8" name="August" abbrev="Aug"/> <ckbk:month country="de" m="9" name="September" abbrev="Sep"/> <ckbk:month country="de" m="10" name="Oktober" abbrev="Okt"/> <ckbk:month country="de" m="11" name="November" abbrev="Nov"/> <ckbk:month country="de" m="12" name="Dezember" abbrev="Dez"/> <!– HfleH понятна … –>

<!– Для yпpoщeния доступа coxpaним sneMeHT в nepeMeHHoft –> <xsl:variable name="ckbk:months" select="document(”)/*/ckbk:month"/>

</xsl:stylesheet>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://www.ora.com/XSLTCookbook/dates">

<xsl:include href="date-conversion.xsl"/>

<xsl:template name="ckbk:get-month-name"> <xsl:param name="month"/>

<xsl:param name="country" select="’us’"/>

<xsl:value-of select="$ckbk:months[@country=$country and @m=$month]/@name"/> </xsl:template>

XSLT 2.0

Функции format-date(), format-time(), format-dateTime() пригодны для решения многих задач. Помимо того, что продемонстрировано в этих рецептах,

они могут различными способами форматировать все компоненты даты и времени. Кроме того, можно задавать коды страны, календаря и языка, так что интернацио­нализацию вы получаете задаром (в пределах имеющейся реализации).

Мангано Сэл  XSLT. Сборник рецептов. – М.: ДМК Пресс, СПБ.: БХВ-Петербург, 2008. – 864 с.: ил.

По теме:

  • Комментарии