2013-05-01 58 views
0

我知道這裏有類似的帖子,但我一直在努力尋找解決方案。我有XML數據,像這樣:使用XSLT在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

+1

XSLT 1或XSLT 2? – 2013-05-01 17:14:24

+0

爲了擴大Jim的問題:XSLT 2.0有解析和序列化日期格式的功能,而1.0不支持。所以你的問題的答案在很大程度上取決於你是否可以使用2.0,或者堅持使用1.0。 – LarsH 2013-05-01 17:31:42

+0

你是否真的需要在每月當天的序號('th')?這是可能的,但使事情變得非常複雜。 – Borodin 2013-05-01 18:01:24

回答

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 
+0

非常感謝,得到它的工作 – Hawkeye101 2013-05-01 19:49:04

+0

很高興我能幫到你。也許在xslt 2.0版中有一個更短的版本。 – 2013-05-01 19:51:45