尝试格式化文本以便在从XML拉到XSLT 1.0时显示为DD-MM-YYYY,因为我知道在使用xs:date时必须在XSD / XML中将其设置为YYYY-MM-DD,这就是我所拥有的用过的。
以下是我正在处理的代码,有关如何显示此代码的任何建议?
XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<events xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="events.xsd">
<venue id="01"
vtitle="ExCeL Exhibition Centre"
location="London"
telephone="0844 448 7600">
<event name="Doctor Who 50th Celebration" date="2013-10-22">
<image>images/doctor50.jpg</image><attribute>Doctor Who Event</attribute>
<description>A 50th Anniversary musical bonanza for Doctor Who.</description>
<ticket_price type="adult" status="available">£25.00</ticket_price>
<ticket_price type="child" status="none">£11.00</ticket_price>
<ticket_price type="junior" status="available">£0.00</ticket_price>
<email>[email protected]</email>
</event>
</venue>
XSD
<xs:attribute name="date" type="xs:date"/>
XSLT
<xsl:element name="date"><xsl:value-of select="@date"/></xsl:element>
HTML
<date>2013-10-22</date>
另一种以dd / mm / yyyy形式生成日期的简单解决方案
<xsl:value-of select="
concat(substring(@date, 9, 2),
'/',
substring(@date, 6, 2),
'/',
substring(@date, 1, 4))"/>
我将使用@Stormtroopr提供的1.0和2.0的不同解决方案。
在2.0使用
format-date(xs:date($date), '[D01]-[M01]-[Y0001]')
在1.0使用
concat(substring(., 9, 2),
'-',
substring(., 6, 2),
'-',
substring(., 1, 4))
为了将来参考,请告诉我们您使用的是哪个版本的XSLT。 1.0和2.0都是常用的,解决方案通常是不同的。
我正在将它用于SharePoint,我这样解决了它
<xsl:value-of select=" ddwrt:FormatDate(/dsQueryResponse/Rows/Row/@Date,3,1)"/>
在XSLT 2.0中,您可以使用tokenize来分割字符串,然后使用xsl:for-each
和xsl:sort
来反转它。 (我现在没有XSLT2.0引擎,但这非常接近你所需要的)。
<xsl:for-each select="tokenize(@date,'-'">
<xsl:sort select="position()" data-type="number" order="descending"/>
<xsl:value-of select="."/>
</xsl:for-each>
在XSLT 1.0中,你使用...递归!
这是它的关键,这需要一个日期,然后在第一个连字符(-
)之前和之后搜索字符串。通常情况下,substring-before
处理subtring-after
以保存订单后,你会在这里切换它们以最终反转输出。
<xsl:template name="reverse-date">
<xsl:param name="text" select="."/>
<xsl:choose>
<xsl:when test="contains($text, '-')">
<xsl:call-template name="reverse-date">
<xsl:with-param name="text" select="substring-after($text, '-')"/>
</xsl:call-template>
<xsl:text>-</xsl:text>
<xsl:value-of select="substring-before($text, '-')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
下面是完整的模板,它将根据您的上述XML文档反转您的日期。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="//event"/>
</xsl:template>
<xsl:template match="event">
<xsl:element name="date">
<!--
** Call this template when you want to reverse the date **
-->
<xsl:call-template name="reverse-date">
<xsl:with-param name="text" select="@date" />
</xsl:call-template>
</xsl:element>
</xsl:template>
<xsl:template name="reverse-date">
<xsl:param name="text" select="."/>
<xsl:choose>
<xsl:when test="contains($text, '-')">
<xsl:value-of select="substring-before($text, '-')" />
<xsl:text>-</xsl:text>
<xsl:call-template name="reverse-date">
<xsl:with-param name="text" select="substring-after($text, '-')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="normalize-space($text)"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
你需要改变这个:
<xsl:element name="date"><xsl:value-of select="@date"/></xsl:element>
对此:
<xsl:element name="date">
<xsl:call-template name="reverse-date">
<xsl:with-param name="text" select="@date" />
</xsl:call-template>
</xsl:element>