<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
					xmlns:content="http://purl.org/rss/1.0/modules/content/"
					xmlns:wfw="http://wellformedweb.org/CommentAPI/"
				  >
<channel>
<title><![CDATA[Saturn's Weblog - 标签：xml]]></title>
<link>http://www.cnsaturn.com/tag/xml</link>
<description><![CDATA[Saturn's weblog, STBlog官方站点]]></description>
<language>zh-CN</language>
<pubDate>Mon, 06 Sep 2010 11:26:43 -0400</pubDate>
<item>
<title><![CDATA[使用XSLT进行日期格式转换]]></title>
<link>http://www.cnsaturn.com/posts/converting-datetime-format-in-xslt</link>
<pubDate>Mon, 10 Aug 2009 10:53:00 -0400</pubDate>
<description><![CDATA[<p>
 现在有个问题需要用XSLT来实现，那就是在XSLT中如何将一个日期结点的格式由YYYY-MM-DD转换到DD/MM/YYYY？</p>
<p>
 我首先想到的就是<strong>利用XSLT中的带参数的模板，将此原始日期作为参数参数一个模板中，然后进行重新组合</strong>。说起来晕乎乎，还是直接进入实战吧。</p>
<p>
 假设现在有一个XML文档，内容如下：</p>
<pre class="brush:xml;">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;format_date.xsl&quot;?&gt;
&lt;notebooks&gt;
 &lt;notebook&gt;
  &lt;title&gt;红花还需绿叶衬，我是标题一&lt;/title&gt;
  &lt;date&gt;2009-08-11&lt;/date&gt;
 &lt;/notebook&gt;
 &lt;notebook&gt;
  &lt;title&gt;红花还需绿叶衬，我是标题二&lt;/title&gt;
  &lt;date&gt;2009-08-10&lt;/date&gt;
 &lt;/notebook&gt;
&lt;/notebooks&gt;</pre>
<p>
 在这个文档中，结点的日期为2009-08-11，即格式为YYYY-MM-DD，现在我们需要利用XSLT将其转换成DD/MM/YYYY，也就是11/08/2009。</p>
<p>
 关于实现思路，我在上面已经讲到，不再赘述。这里讲讲具体实现，一个带参数的XSLT模板：</p>
<pre class="brush:xml;">
&lt;xsl:template name=&quot;FormatDate&quot;&gt;
 &lt;!--Convert Old Date Format:yyyy-mm-dd to New Date Format: dd/mm/yyyy--&gt;
 &lt;xsl:param name=&quot;DateTime&quot; /&gt;
 &lt;xsl:variable name=&quot;y&quot;&gt;
      &lt;xsl:value-of select=&quot;substring($DateTime,1,4)&quot; /&gt;
    &lt;/xsl:variable&gt;
    &lt;xsl:variable name=&quot;m_temp&quot;&gt;
  &lt;xsl:value-of select=&quot;substring-after($DateTime,&#39;-&#39;)&quot; /&gt;
 &lt;/xsl:variable&gt;
    &lt;xsl:variable name=&quot;m&quot;&gt;
      &lt;xsl:value-of select=&quot;substring($m_temp,1,2)&quot; /&gt;
    &lt;/xsl:variable&gt;
    &lt;xsl:variable name=&quot;d_temp&quot;&gt;
      &lt;xsl:value-of select=&quot;substring-after($m_temp,&#39;-&#39;)&quot; /&gt;
    &lt;/xsl:variable&gt;
    &lt;xsl:variable name=&quot;d&quot;&gt;
      &lt;xsl:value-of select=&quot;substring($d_temp,1,2)&quot; /&gt;
    &lt;/xsl:variable&gt;
    &lt;xsl:value-of select=&quot;$d&quot;/&gt;
    &lt;xsl:value-of select=&quot;&#39;/&#39;&quot;/&gt;
    &lt;xsl:value-of select=&quot;$m&quot;/&gt;
    &lt;xsl:value-of select=&quot;&#39;/&#39;&quot;/&gt;
    &lt;xsl:value-of select=&quot;$y&quot;/&gt;
&lt;/xsl:template&gt;</pre>
<p>
 如果对XSLT有所了解，相信上面的代码非常直观；如果不太了解，那么首先你应该去了解，或者在下面留言&hellip;&hellip;</p>
<p>
 在XSLT中，我一直将模板当作其他程序语言中的函数。理解了这一点，上面这段程序就很好理解了，那个参数Datetime就像是程序语言中的入口参数，用来接受外部送给这个&ldquo;函数&rdquo;的参数。</p>
<p>
 需要注意的地方是，上面的19-23行，这是最后对日期各个部分（年、月、日）进行组合。换言之，你可以组合出任意你可以想出的日期格式，不限于此。</p>
<p>
 但这里只写了&ldquo;函数&rdquo;了部分，没有提到调用，调用方法如下：</p>
<pre class="brush:xml;">
&lt;xsl:call-template name=&quot;FormatDate&quot;&gt;
 &lt;xsl:with-param name=&quot;DateTime&quot; select=&quot;date&quot;/&gt;
&lt;/xsl:call-template&gt;</pre>
<p>
 在此例中，我将date这个结点的值传给了&ldquo;函数&rdquo;的参数。</p>
<p>
 完整的XSLT文件和最后的结果请分别<strike>看<a href="/demo/dateformat-in-xslt/format_date.xsl">这里</a>和<a href="/demo/dateformat-in-xslt/test.xml">这里</a></strike>。</p>]]></description>
