XSLT:如何排序日期

时间:2014-04-04 04:49:05

标签: xml sorting xslt

我对排序日期时间有疑问。

我找到了解决方案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    

只有第一种是有效的。其余各种都不起作用。 这段代码出了什么问题?任何帮助将不胜感激。

2 个答案:

答案 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>