首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在xsl中,可以将日期转换为星期几的月份dd吗?

在xsl中,可以将日期转换为星期几的月份dd吗?
EN

Stack Overflow用户
提问于 2013-05-25 00:01:45
回答 3查看 3.7K关注 0票数 2

我正在使用xsl样式表从网站上的xml文件中提取和显示选定的数据。

其中一个数据元素是yyyy-mm-dd格式的日期。例如,我想将其显示为Wed。5月10日。这可能吗?

我的整个项目是获取一个xml文件,提取3个数据元素,并以排序的顺序将它们放在日期显示已修改的位置。我有一个用于此转换的js,但没有排序。看起来xsl是排序问题的答案,但现在我不知道如何(或者是否可以)‘截取’日期,并对其应用js转换,并将其放在语句中:xsl:value-of select="StartTime/Date"

EN

回答 3

Stack Overflow用户

发布于 2013-05-25 13:45:40

XSLT具有很强的基本算术能力,可以使用Zeller's formula导出星期几。

您需要使用以下命令从自己的代码中调用模板

代码语言:javascript
复制
<xsl:call-template name="date-format">
  <xsl:with-param name="yyyy-mm-dd" select="StartTime/Date"/>
</xsl:call-template>

此样式表

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>

  <xsl:template match="node()">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="date">
    <xsl:copy>
      <xsl:call-template name="date-format">
        <xsl:with-param name="yyyy-mm-dd" select="."/>
      </xsl:call-template>
    </xsl:copy>
  </xsl:template>

  <xsl:template name="date-format">
    <xsl:param name="yyyy-mm-dd"/>

    <xsl:variable name="yyyy" select="substring-before($yyyy-mm-dd, '-')"/>
    <xsl:variable name="mm-dd" select="substring-after($yyyy-mm-dd, '-')"/>
    <xsl:variable name="mm" select="substring-before($mm-dd, '-')"/>
    <xsl:variable name="dd" select="substring-after($mm-dd, '-')"/>

    <xsl:variable name="Y">
      <xsl:choose>
        <xsl:when test="$mm &lt; 3"><xsl:value-of select="$yyyy - 1"/></xsl:when>
        <xsl:otherwise><xsl:value-of select="$yyyy + 0"/></xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    <xsl:variable name="y" select="$Y mod 100"/>
    <xsl:variable name="c" select="floor($Y div 100)"/>
    <xsl:variable name="d" select="$dd+0"/>
    <xsl:variable name="m">
      <xsl:choose>
        <xsl:when test="$mm &lt; 3"><xsl:value-of select="$mm + 12"/></xsl:when>
        <xsl:otherwise><xsl:value-of select="$mm + 0"/></xsl:otherwise>
      </xsl:choose>
    </xsl:variable>

    <xsl:variable name="w" select="($d + floor(($m + 1) * 2.6) + $y + floor($y div 4) + floor($c div 4) - $c * 2 - 1) mod 7"/>

    <xsl:variable name="www">
      <xsl:choose>
        <xsl:when test="$w = 0">Sun</xsl:when>
        <xsl:when test="$w = 1">Mon</xsl:when>
        <xsl:when test="$w = 2">Tue</xsl:when>
        <xsl:when test="$w = 3">Wed</xsl:when>
        <xsl:when test="$w = 4">Thu</xsl:when>
        <xsl:when test="$w = 5">Fri</xsl:when>
        <xsl:when test="$w = 6">Sat</xsl:when>
      </xsl:choose>
    </xsl:variable>

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

    <xsl:value-of select="concat($www, '. ', $mmm, ' ', $d)"/>

  </xsl:template>

</xsl:stylesheet>

应用于此XML数据

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<document>
  <date>2013-01-01</date>
  <date>2013-05-24</date>
  <date>2013-12-25</date>
  <date>1957-07-13</date>
  <date>1776-07-04</date>
</document>

根据需要生成此输出

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<document>
   <date>Tue. Jan 1</date>
   <date>Fri. May 24</date>
   <date>Wed. Dec 25</date>
   <date>Sat. Jul 13</date>
   <date>Thu. Jul 4</date>
</document>
票数 4
EN

Stack Overflow用户

发布于 2013-05-25 14:51:54

正如LarsH提到的,这在XSLT2.0中要容易得多。如果你没有早于1901-01-07的任何日期,这里是另一个1.0选项。

Borodin输入(感谢!)

代码语言:javascript
复制
<document>
    <date>2013-01-01</date>
    <date>2013-05-24</date>
    <date>2013-12-25</date>
    <date>1957-07-13</date>
    <date>1901-01-07</date>
</document>

XSLT 1.0

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="date">
        <xsl:variable name="weekday" select="((xs:date(.) - xs:date('1901-01-06')) div xs:dayTimeDuration('P1D')) mod 7"/>
        <xsl:variable name="month" select="substring(.,6,2)"/>
        <xsl:copy>
            <xsl:call-template name="getWeekday">
                <xsl:with-param name="weekday" select="$weekday"/>
            </xsl:call-template>
            <xsl:call-template name="getMonth">
                <xsl:with-param name="month" select="$month"/>
            </xsl:call-template>
            <xsl:value-of select="substring(.,9,2)"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template name="getWeekday">
        <xsl:param name="weekday"/>
        <xsl:choose>
            <xsl:when test="$weekday=1">Mon. </xsl:when>
            <xsl:when test="$weekday=2">Tue. </xsl:when>
            <xsl:when test="$weekday=3">Wed. </xsl:when>
            <xsl:when test="$weekday=4">Thu. </xsl:when>
            <xsl:when test="$weekday=5">Fri. </xsl:when>
            <xsl:when test="$weekday=6">Sat. </xsl:when>
            <xsl:when test="$weekday=7">Sun. </xsl:when>
        </xsl:choose>       
    </xsl:template>

    <xsl:template name="getMonth">
        <xsl:param name="month"/>
        <xsl:choose>
            <xsl:when test="$month='01'">Jan </xsl:when>
            <xsl:when test="$month='02'">Feb </xsl:when>
            <xsl:when test="$month='03'">Mar </xsl:when>
            <xsl:when test="$month='04'">Apr </xsl:when>
            <xsl:when test="$month='05'">May </xsl:when>
            <xsl:when test="$month='06'">Jun </xsl:when>
            <xsl:when test="$month='07'">Jul </xsl:when>
            <xsl:when test="$month='08'">Aug </xsl:when>
            <xsl:when test="$month='09'">Sep </xsl:when>
            <xsl:when test="$month='10'">Oct </xsl:when>
            <xsl:when test="$month='11'">Nov </xsl:when>
            <xsl:when test="$month='12'">Dec </xsl:when>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

输出

代码语言:javascript
复制
<document>
   <date>Tue. Jan 01</date>
   <date>Fri. May 24</date>
   <date>Wed. Dec 25</date>
   <date>Sat. Jul 13</date>
   <date>Mon. Jan 07</date>
</document>
票数 0
EN

Stack Overflow用户

发布于 2014-05-09 03:17:45

您可以使用ddwrt:FormatDate()

代码语言:javascript
复制
<xsl:value-of select="ddwrt:FormatDate(string(@EventDate), 1033, 3)" />

结果将如下所示:

代码语言:javascript
复制
Thursday, May 8, 2014

More Info On ddwrt

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16739141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档