我对排序日期时间有疑问。
我找到了解决方案here,但这个解决方案对我不起作用。
假设我有一个xml。日期顺序是月,日和年。
<persons>
<person>
<name>1</name>
<birthday>021514</birthday>
</person>
<person>
<name>2</name>
<birthday>051513</birthday>
</person>
</persons>
我有一个xsl
<xsl:for-each select="//person">
<!-- day -->
<xsl:sort select="substring(birthday, 3, 2)" order="descending" data-type="number"/>
<!-- month -->
<xsl:sort select="substring(birthday, 1, 2)" order="descending" data-type="number"/>
<!-- year -->
<xsl:sort select="substring(birthday, 5, 2)" order="descending" data-type="number"/>
<xsl:value-of select="birthday"/>
</xsl:for-each>
我想按日期排序降序。
我得到了结果
051513
021514
但我想要的实际结果是
021514
051513
只有第一种是有效的。其余各种都不起作用。 这段代码出了什么问题?任何帮助将不胜感激。
答案 0 :(得分:1)
只需更改排序条件的顺序 你应该从年,月和日开始。
<xsl:for-each select="//person">
<!-- year -->
<xsl:sort select="substring(birthday, 5, 2)" order="descending" data-type="number"/>
<!-- month -->
<xsl:sort select="substring(birthday, 1, 2)" order="descending" data-type="number"/>
<!-- day -->
<xsl:sort select="substring(birthday, 3, 2)" order="descending" data-type="number"/>
<xsl:value-of select="birthday"/>
</xsl:for-each>
答案 1 :(得分:1)
如果您使用MMDDYY作为日期格式的XML,那么它是设计糟糕的XML,并且使用设计糟糕的XML最好的做法是在执行任何其他操作之前在预处理阶段清理它。编写样式表,其唯一目的是将XML清理成更好的东西,然后将转换任务视为一个单独的处理阶段。
在这种情况下,您希望以ISO格式YYYY-MM-DD创建日期。我不确定你的规则是什么推断世纪,但我会写下面的东西(需要XSLT 2.0):
<xsl:template match="birthday">
<xsl:copy>
<xsl:variable name="year" select="substring(., 5, 2)"/>
<xsl:variable name="month" select="substring(., 1, 2)"/>
<xsl:variable name="day" select="substring(., 3, 2)"/>
<xsl:value-of select="if (number($year) gt 20 then '19' else '20'"/>
<xsl:value-of select="$year, $month, $day" separator="-"/>
</xsl:copy>
</xsl:template>