使用xsl进行XML日期格式化

时间:2012-01-04 10:43:03

标签: javascript xml xslt

我有一个XML文档。我在这个&#39; 2011-08-01&#39;格式。 我必须使用Java Script或XSL在2011年8月8日和#39;中显示相同的日期。格式。 XML标记是这样的: <DatelineDate>2011-08-01</DatelineDate> 请帮我这样做。

4 个答案:

答案 0 :(得分:1)

XSLT 1.0不是日期格式化的绝佳技术。您必须使用字符串处理手动执行此操作,或者通过某些特定于XSLT解析器的扩展(例如microsoft ms:format-date函数)执行此操作。但是,XSLT 2.0确实将format-date作为标准。

我建议使用JavaScript代替。请参阅此相关问题:

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

答案 1 :(得分:1)

<强>予。 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

答案 2 :(得分:0)

答案 3 :(得分: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>

子字符串有点复杂,但它们基本上从两个变量中选出适当的月份名称和日期后缀。注意:这些变量的间距很重要,月份名称必须相隔9个字符。该concat第3行的+0只是一个简单的技巧,可以将其视为数字而不是文本01;如果您确实更喜欢01格式,请将其保留。