我正在尝试使用XSLT / X-Path格式化XML日期。
我有:PostDate="2014-03-27"
我想渲染为:March 27, 2014
。
我已经读过XSLT可能不是可行的方法。 JavaScript是更好的方式吗?有人可以提供一些帮助吗?
谢谢!
罗宾
答案 0 :(得分:4)
以下是一些XSLT和XPath解决方案。如果要在客户端(浏览器)处理此问题,则必须坚持使用XSLT 1.0解决方案(或使用JavaScript)。如果您在其他地方(独立或服务器端)生成结果,则可以使用XSLT2 / XPath3兼容处理器。
XPath 3.0解决方案
format-date(//*/@PostDate, '[MNn] [D01], [Y0001]')
XSLT解决方案
源XML :
<Message PostDate="2014-03-27">Some text</Message>
XSLT 2.0样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="html"/>
<xsl:template match="Message">
<date>
<xsl:value-of select="format-date(@PostDate, '[MNn] [D01], [Y0001]')"></xsl:value-of>
</date>
</xsl:template>
</xsl:stylesheet>
XSLT 1.0样式表
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template name="month-name">
<xsl:param name="month"/>
<xsl:if test="$month = 1">January</xsl:if>
<xsl:if test="$month = 2">February</xsl:if>
<xsl:if test="$month = 3">March</xsl:if>
<xsl:if test="$month = 4">April</xsl:if>
<xsl:if test="$month = 5">May</xsl:if>
<xsl:if test="$month = 6">June</xsl:if>
<xsl:if test="$month = 7">July</xsl:if>
<xsl:if test="$month = 8">August</xsl:if>
<xsl:if test="$month = 9">September</xsl:if>
<xsl:if test="$month = 10">October</xsl:if>
<xsl:if test="$month = 11">November</xsl:if>
<xsl:if test="$month = 12">December</xsl:if>
</xsl:template>
<xsl:template name="format-iso-date">
<xsl:param name="iso-date"/>
<xsl:variable name="year" select="substring($iso-date, 1, 4)"/>
<xsl:variable name="month" select="substring($iso-date, 6, 2)"/>
<xsl:variable name="day" select="substring($iso-date, 9, 2)"/>
<xsl:variable name="month-name">
<xsl:call-template name="month-name">
<xsl:with-param name="month" select="$month"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="concat($month-name, ' ',$day, ', ', $year)"/>
</xsl:template>
<xsl:template match="Message">
<date>
<xsl:call-template name="format-iso-date">
<xsl:with-param name="iso-date" select="@PostDate"/>
</xsl:call-template>
</date>
</xsl:template>
</xsl:stylesheet>
XSLT输出:
<date>March 27, 2014</date>
您还可以使用EXSLT扩展程序中的date
函数:http://www.exslt.org/
答案 1 :(得分:2)
如果您使用Microsoft的MSXML XSL 1.0处理器,这是另一种格式化日期的方法。您需要使用Javascript / JScript(或其他语言,如C#)。
以这种方式添加代码时,不要忘记使用CDATA部分来确保XSL处理器跳过代码部分中的某些符号。
template <class... Args>
std::ostream& foo(Args... args) {
return (std::cout << ... << args);
}