XML форматирование даты с использованием xsl - PullRequest
1 голос
/ 04 января 2012

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

Ответы [ 4 ]

1 голос
/ 04 января 2012

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
1 голос
/ 04 января 2012

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

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

Где найти документацию по форматированию даты в JavaScript?

0 голосов
/ 04 января 2012

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

Подстроки немного запутаны, но они в основном выбирают подходящее суффикс названия месяца и даты из двух переменных.Примечание: интервал между этими переменными важен, названия месяцев ДОЛЖНЫ быть разделены на 9 символов.+0 в 3-й строке этого конкатата - это простой трюк, чтобы рассматривать его как число, а не как текст 01;Оставьте это, если вы действительно предпочитаете форматирование 01.

0 голосов
/ 04 января 2012

Просмотрите следующие ссылки:

  1. http://www.w3.org/TR/xslt20/#date-time-examples, и
  2. ms: функция format_date
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...