我有一个XML文档。我在这个' 2011-08-01'格式。
我必须使用Java Script或XSL在2011年8月8日和#39;中显示相同的日期。格式。
XML标记是这样的:
<DatelineDate>2011-08-01</DatelineDate>
请帮我这样做。
答案 0 :(得分:1)
XSLT 1.0不是日期格式化的绝佳技术。您必须使用字符串处理手动执行此操作,或者通过某些特定于XSLT解析器的扩展(例如microsoft ms:format-date函数)执行此操作。但是,XSLT 2.0确实将format-date作为标准。
我建议使用JavaScript代替。请参阅此相关问题:
Where can I find documentation on formatting a date in JavaScript?
答案 1 :(得分:1)
<强>予。 XSLT 2.0解决方案:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="text"/>
<xsl:template match="DatelineDate">
<xsl:sequence select="format-date(xs:date(.), '[MNn] [D1o], [Y]')"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的XML文档:
<DatelineDate>2011-08-01</DatelineDate>
产生了想要的正确结果:
August 1st, 2011
注意:Saxon CE在五大浏览器中提供XSLT 2.0。
<强> II。 XSLT 1.0解决方案:
这是一个简单易懂的解决方案,不依赖于技巧和难以理解的硬编码偏移。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<my:months>
<m num="1">January</m>
<m num="2">February</m>
<m num="3">March</m>
<m num="4">April</m>
<m num="5">May</m>
<m num="6">June</m>
<m num="7">July</m>
<m num="8">August</m>
<m num="9">September</m>
<m num="10">October</m>
<m num="11">November</m>
<m num="12">December</m>
</my:months>
<xsl:variable name="vMonthNames" select=
"document('')/*/my:months/*"/>
<xsl:template match="DatelineDate">
<xsl:variable name="vYear"
select="substring-before(., '-')"/>
<xsl:variable name="vdMonth" select=
"substring-before(substring-after(., '-'), '-')"/>
<xsl:variable name="vdDay" select=
"substring-after(substring-after(., '-'), '-')"/>
<xsl:variable name="vMonthName" select=
"$vMonthNames[@num = number($vdMonth)]"/>
<xsl:variable name="vordDaySuffix">
<xsl:choose>
<xsl:when test=
"$vdDay mod 10 = 1
and
not($vdDay = 11)">st</xsl:when>
<xsl:when test="$vdDay mod 10 = 2">nd</xsl:when>
<xsl:when test="$vdDay mod 10 = 3">rd</xsl:when>
<xsl:otherwise>th</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:value-of select=
"concat($vMonthName,
' ',
$vdDay, $vordDaySuffix,
', ',
$vYear
)
"/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于同一个XML文档(上图)时,会再次生成所需的正确结果:
August 01st, 2011
答案 2 :(得分:0)
答案 3 :(得分:0)
这是我在XSLT 1.0中使用的一个简单模板
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="months" select="'January February March April May June July August SeptemberOctober December '" />
<xsl:variable name="dayord" select="'-stndrdthththththththththththththththththstndrdthththththththst'" />
<xsl:template match="DatelineDate">
<xsl:value-of select="normalize-space(concat(
substring($months,substring(.,6,2) * 9 - 8, 8),
' ',
substring(.,9,2) + 0,
substring($dayord,substring(.,9,2)*2,2),
', ',
substring(.,1,4)
))" />
</xsl:template>
</xsl:stylesheet>
子字符串有点复杂,但它们基本上从两个变量中选出适当的月份名称和日期后缀。注意:这些变量的间距很重要,月份名称必须相隔9个字符。该concat第3行的+0
只是一个简单的技巧,可以将其视为数字而不是文本01
;如果您确实更喜欢01
格式,请将其保留。