2012-01-04 3 views
1

У меня есть документ XML. Я получаю дату от XML в этом формате «2011-08-01». Я должен показывать ту же дату, используя либо Java Script, либо XSL в формате «Август 08th, 2011». XML-тег выглядит так: <DatelineDate>2011-08-01</DatelineDate> Пожалуйста, помогите мне сделать это.Форматирование XML-данных с использованием xsl

ответ

1

XSLT 1.0 - отличная технология для форматирования даты. Вы либо должны сделать это вручную с помощью строковой обработки, либо с помощью некоторых расширений синтаксического анализатора XSLT, например, функции microsoft ms:format-date. Однако XSLT 2.0 имеет стандартную дату формата.

Я бы рекомендовал вместо этого использовать JavaScript. Смотрите этот родственный вопрос:

Where can I find documentation on formatting a date in JavaScript?

+0

ColinE: Абсолютные утверждения почти всегда ошибочны.Ваше утверждение, начинающееся с «XSLT - это не отличная технология ...», неверно в случае любой версии XSLT больше одной. Пожалуйста, отредактируйте и исправьте. –

+0

@Dimitre Novatchev - обновлено для уточнения. Однако, исходя из поставленного вопроса, я бы выбрал JavaScript для простоты и переносимости. – ColinE

+0

ColinE: Отлично. Что касается личных предпочтений, OP явно заинтересована в решении XSLT. –

1

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 
+0

Решение XSLT 1.0 в этом ответе дает неверные результаты для некоторых дат. – Flynn1179

+0

@ Flynn1179: Как? –

+0

Извините, я просто предположил, что это будет очевидно. Я мог сразу сказать, что «11 августа 2011 года», вероятно, не будет приемлемым. – Flynn1179

0

Вот простой шаблон я использую в 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.