I. Решение 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