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

4

2 回答 2

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
于 2013-05-01T19:12:43.747 回答
-1

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

于 2013-05-02T06:30:35.027 回答