使用XSLT在XML中转换日期字符串

时间:2013-05-01 17:09:48

标签: xml date xslt xslt-2.0

我知道有相似的帖子,但我很难找到解决方案。我有这样的XML数据:

<item>
    <title> A Title </title>
    <link>www.alink.com</link>
    <comments>www.alink.com/cp,,emts</comments>
    <pubDate>Fri, 19 Apr 2013 20:28:39 +0000</pubDate>
    <dc:creator>aUser</dc:creator>
    <category><![CDATA[News]]></category>
    <description><![CDATA["A description"]]></description>
    <content:encoded><![CDATA[content of post]]></content:encoded>
    <wfw:commentRss>www.alink</wfw:commentRss>
    <slash:comments>0</slash:comments>
</item>

我的目标是输出一个div,其标题带有链接值,然后输出pubDate,没有时间。这很简单,只需使用它:

<xsl:template match="item">
    <div>
        <h5><a href="{link}"><xsl:value-of select="title" /></a> </h5>
        <p><xsl:value-of select="substring(pubDate,1,16)"/></p>
     </div>   
</xsl:template>

问题是我很想改变日期的格式,我不能从XML的源代码中做到这一点。我希望格式只是月,日和年,因此Fri, 19 Apr 2013将变为:April 19, 2013。任何建议都会非常有用。

我正在使用XSLT 2.0

2 个答案:

答案 0 :(得分:0)

以下是xslt版本1.0和exsl扩展名的解决方案。 如果没有exsl扩展且仍然使用版本1.0,则可以使用xsl:when来完成从短月到长月名称的转换。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:exsl="http://exslt.org/common"
        extension-element-prefixes="exsl">

    <xsl:output method="xml" indent="yes"/>

    <xsl:variable name="month_data_tmp">
        <month short="Apr" long="April" />
        <!--- and so on for each month -->
    </xsl:variable>
    <xsl:variable name="month_data" select="exsl:node-set($month_data_tmp)" />

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

    <xsl:template name="formate_date">
        <xsl:param name="date" />
        <xsl:variable name ="day_str" select="substring-before($date, ',')" />
        <xsl:variable name ="after_day_str" select="substring-after($date, ' ')" />
        <xsl:variable name ="day_nr" select="substring-before($after_day_str, ' ')" />
        <xsl:variable name ="after_day_nr" select="substring-after($after_day_str, ' ')" />
        <xsl:variable name ="month" select="substring-before($after_day_nr, ' ')" />
        <xsl:variable name ="after_month" select="substring-after($after_day_nr, ' ')" />
        <xsl:variable name ="year" select="substring-before($after_month, ' ')" />

        <xsl:value-of select="$month_data/month[@short=$month]/@long"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="$day_nr"/>
        <xsl:text>, </xsl:text>
        <xsl:value-of select="$year"/>
    </xsl:template>
</xsl:stylesheet>

生成输出:

   April 19, 2013

答案 1 :(得分:-1)

使用'2.0',我们可以使用format-date函数。要了解更多信息,请点击此链接http://my.safaribooksonline.com/book/xml/9780596527211/creating-output/xslt-id-4.5