У меня есть документ XML. Я получаю дату от XML в этом формате «2011-08-01». Я должен показывать ту же дату, используя либо Java Script, либо XSL в формате «Август 08th, 2011». XML-тег выглядит так: <DatelineDate>2011-08-01</DatelineDate>
Пожалуйста, помогите мне сделать это.Форматирование XML-данных с использованием xsl
ответ
XSLT 1.0 - отличная технология для форматирования даты. Вы либо должны сделать это вручную с помощью строковой обработки, либо с помощью некоторых расширений синтаксического анализатора XSLT, например, функции microsoft ms:format-date. Однако XSLT 2.0 имеет стандартную дату формата.
Я бы рекомендовал вместо этого использовать JavaScript. Смотрите этот родственный вопрос:
Where can I find documentation on formatting a date in JavaScript?
Посмотрите на эти ссылки:
I. XSLT 2.0 решение:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text"/>
<xsl:template match="DatelineDate">
<xsl:sequence select="format-date(xs:date(.), '[MNn] [D1o], [Y]')"/>
</xsl:template>
</xsl:stylesheet>
, когда это преобразование применяется на поставленном XML документа:
<DatelineDate>2011-08-01</DatelineDate>
разыскиваемый, правильный результат получается:
August 1st, 2011
Примечание: Saxon CE делает XSLT 2.0 доступный в пяти основных браузерах.
II. Решение XSLT 1.0:
Это простое и понятное решение, которое не полагается на трюки и нечитаемые жестко закодированные смещения.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<my:months>
<m num="1">January</m>
<m num="2">February</m>
<m num="3">March</m>
<m num="4">April</m>
<m num="5">May</m>
<m num="6">June</m>
<m num="7">July</m>
<m num="8">August</m>
<m num="9">September</m>
<m num="10">October</m>
<m num="11">November</m>
<m num="12">December</m>
</my:months>
<xsl:variable name="vMonthNames" select=
"document('')/*/my:months/*"/>
<xsl:template match="DatelineDate">
<xsl:variable name="vYear"
select="substring-before(., '-')"/>
<xsl:variable name="vdMonth" select=
"substring-before(substring-after(., '-'), '-')"/>
<xsl:variable name="vdDay" select=
"substring-after(substring-after(., '-'), '-')"/>
<xsl:variable name="vMonthName" select=
"$vMonthNames[@num = number($vdMonth)]"/>
<xsl:variable name="vordDaySuffix">
<xsl:choose>
<xsl:when test=
"$vdDay mod 10 = 1
and
not($vdDay = 11)">st</xsl:when>
<xsl:when test="$vdDay mod 10 = 2">nd</xsl:when>
<xsl:when test="$vdDay mod 10 = 3">rd</xsl:when>
<xsl:otherwise>th</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select=
"concat($vMonthName,
' ',
$vdDay, $vordDaySuffix,
', ',
$vYear
)
"/>
</xsl:template>
</xsl:stylesheet>
Когда это преобразование применяется на том же самом документе XML (выше), снова разыскиваемый, правильный результат получается:
August 01st, 2011
Вот простой шаблон я использую в XSLT 1.0 иногда
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="months" select="'January February March April May June July August SeptemberOctober December '" />
<xsl:variable name="dayord" select="'-stndrdthththththththththththththththththstndrdthththththththst'" />
<xsl:template match="DatelineDate">
<xsl:value-of select="normalize-space(concat(
substring($months,substring(.,6,2) * 9 - 8, 8),
' ',
substring(.,9,2) + 0,
substring($dayord,substring(.,9,2)*2,2),
', ',
substring(.,1,4)
))" />
</xsl:template>
</xsl:stylesheet>
Подстроки немного запутаны, но в основном они выбирают подходящее название месяца и дату суффикса из двух переменных ле. NB: Интервал между этими переменными важен, имена месяцев ДОЛЖНЫ быть разделены на 9 символов. +0
на третьей строке этого concat - просто простой трюк, чтобы рассматривать его как число, а не текст 01
; Оставьте это, если вы предпочитаете форматирование 01
.
ColinE: Абсолютные утверждения почти всегда ошибочны.Ваше утверждение, начинающееся с «XSLT - это не отличная технология ...», неверно в случае любой версии XSLT больше одной. Пожалуйста, отредактируйте и исправьте. –
@Dimitre Novatchev - обновлено для уточнения. Однако, исходя из поставленного вопроса, я бы выбрал JavaScript для простоты и переносимости. – ColinE
ColinE: Отлично. Что касается личных предпочтений, OP явно заинтересована в решении XSLT. –