2009-09-17 47 views

回答

0

你的后端是什么语言?

如果是PHP很容易用date()函数来格式化日期时间字符串:http://uk.php.net/manual/en/function.date.php

您可以通过它关到XML格式格式化之前的日期。

+0

是的,这是真的和简单/最好的解决方案。但如果我必须通过xslt – Wondering 2009-09-17 10:39:24

0

使用具有大<xsl:choose>的命名模板听起来像是一个合适的解决方案。棘手的部分是月份名称,其余部分相当微不足道,对吧?当然,您不需要已将其分解为指定的模板,即

1

EXSLT具有将日期字符串一些扩展功能,请参阅: http://exslt.org/date/index.html

有了您的XSLT处理器原生支持这些一点点运气,否则大部分的日期函数有一个简单的XSLT 1.0实现可以包括

5

这里的一个纯XSLT 1.0溶液,其假定有效的输入:

<xsl:template match="/"> 
    <newdate> 
     <xsl:call-template name="convertdate"> 
      <xsl:with-param name="date" select="date"/> 
     </xsl:call-template> 
    </newdate> 
</xsl:template> 

<xsl:template name="convertdate"> 
    <xsl:param name="date"/> 

    <xsl:variable name="day"> 
     <xsl:value-of select="number(substring-after(substring-after($date,'-'), '-'))"/> 
    </xsl:variable> 

    <xsl:variable name="suffix"> 
     <xsl:choose> 
      <xsl:when test="$day = '1'">st</xsl:when> 
      <xsl:when test="substring($day, string-length($day), 1) = '1' and not(starts-with($day, '1'))">st</xsl:when> 
      <xsl:when test="substring($day, string-length($day), 1) = '2' and not(starts-with($day, '1'))">nd</xsl:when> 
      <xsl:when test="substring($day, string-length($day), 1) = '3' and not(starts-with($day, '1'))">rd</xsl:when> 
      <xsl:otherwise>th</xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:variable name="mo"> 
     <xsl:value-of select="number(substring-before(substring-after($date,'-'), '-'))"/> 
    </xsl:variable>  

    <xsl:variable name="month"> 
     <xsl:choose> 
      <xsl:when test="$mo = 1">Jan</xsl:when> 
      <xsl:when test="$mo = 2">Feb</xsl:when> 
      <xsl:when test="$mo = 3">Mar</xsl:when> 
      <xsl:when test="$mo = 4">Apr</xsl:when> 
      <xsl:when test="$mo = 5">May</xsl:when> 
      <xsl:when test="$mo = 6">Jun</xsl:when> 
      <xsl:when test="$mo = 7">Jul</xsl:when> 
      <xsl:when test="$mo = 8">Aug</xsl:when> 
      <xsl:when test="$mo = 9">Sept</xsl:when> 
      <xsl:when test="$mo = 10">Oct</xsl:when> 
      <xsl:when test="$mo = 11">Nov</xsl:when> 
      <xsl:when test="$mo = 12">Dec</xsl:when> 
     </xsl:choose> 
    </xsl:variable> 

    <xsl:value-of select="$day"/><xsl:value-of select="$suffix"/>&#160;<xsl:value-of select="$month"/> 

</xsl:template> 
+0

好,+1。 :)而使用非破坏空间实际上也是一个好主意。 – Tomalak 2009-09-17 11:32:36

+0

谢谢,会试试这个, – Wondering 2009-09-17 12:09:16

0

沿着线:

<xsl:template name="friendly-date"> 
    <xsl:param name="datestring" select="'yyyy-mm-dd'" /> 

    <xsl:variable name="y" select="number(substring-before($datestring, '-'))" /> 
    <xsl:variable name="r" select="number(substring-after($datestring, '-'))" /> 
    <xsl:variable name="m" select="number(substring-before($r, '-'))" /> 
    <xsl:variable name="d" select="number(substring-after($r, '-'))" /> 

    <xsl:choose> 
    <xsl:when test=" 
     $y &gt;= 1970 and $y &lt;= 9999 
     and 
     $m &gt;= 1 and $m &lt;= 12 
     and 
     $d &gt;= 1 and $m &lt;= 31 
    "> 
     <xsl:value-of select="$d" /> 
     <xsl:text> </xsl:text> 
     <xsl:choose> 
     <xsl:when test="$m = 1"> 
      <xsl:value-of select="'Jan'" /> 
     </xsl:when> 
     <!-- ... insert missing ... --> 
     <xsl:when test="$m = 12"> 
      <xsl:value-of select="'Dec'" /> 
     </xsl:when> 
     </xsl:choose> 
     <xsl:text> </xsl:text> 
     <xsl:value-of select="$y" /> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$datestring" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

请注意,这不会检查不可能的日期。这取决于你的意见,如果这可能成为一个问题或不。

除此之外,它不会执行国际日期格式。对于较不特别的解决方案,我建议像EXSLT一样查看EXSLT。

相关问题