按日期排序xml的问题<xsl:sort select =“”> </xsl:sort>

时间:2010-01-19 15:22:55

标签: xml xslt

我正在尝试按日期排序我的xml,但它不能像我这样工作xml和xsl r

<xsl:template match="/">
    <xsl:for-each select="news/item">
                        <xsl:sort select="date1" order="descending" />                                     

                          <xsl:value-of select="date1"/>                                

                  </xsl:for-each> 
</xsl:template>

MYXML

<news>
 <item>
<date1>January 1, 2010</date1>
 </item>
 <item>
  <date1>November 29, 2009</date1>
</news>


         Its displaying the result but not in sorted way..

6 个答案:

答案 0 :(得分:4)

xsl-sort不“知道”如何对日期进行排序。它将使用默认值进行文本排序,但您可以使用data-type属性指定数字排序。

有几种方法可以解决这个问题 - add an attribute或更改将日期输出到源XML的方式,因此您必须使用可以按数字排序的表示法。

答案 1 :(得分:4)

您可以尝试使用以下内容:

<xsl:template match="/"> 
  <xsl:for-each select="news/item"> 
    <xsl:sort select="xs:date(date1)" order="descending" />
    <xsl:value-of select="date1"/>                                 
  </xsl:for-each>  
</xsl:template> 

虽然,如果您可以控制XML生成,我还会提出类似的内容:

<date1 isoValue="20100101">January 1, 2010</date1>

然后使用

<xsl:sort select="xs:date(date1/@isoValue)" order="descending" />

答案 2 :(得分:3)

检查this issue问题的解决方案。它使用XSLT排序按XML中的日期对XML进行排序。

答案 3 :(得分:1)

xml中的日期是一个字符串。除非日期总是这样:yyyy-mm-dd你真的可以按正确的顺序排序。

所以这是正确的方法:

<xsl:sort select="newsDate"  order="ascending" />

它会像魅力一样。

答案 4 :(得分:0)

如果您可以控制xml生成:

输入:

<date1> 2010-10-17+02:00 </date1>

转换:

<date1 number="{translate(substring-before(date1,'+'),'-','')}"
   <xsl:value-of select="date1"/>
</date1>`

输出:

<date1 number="20101017">2010-10-17+02:00</date1>

比你平常使用

<xsl:sort order="descending" select="@number" data-type="number"/>

格尔茨

答案 5 :(得分:0)

您可以使用美国日期格式对date1字段进行排序,以创建年/月/日期字符串,然后按降序排序。在xsl:for-each标记中,您可以添加:

<xsl:sort select="ddwrt:FormatDateTime(string(@date1),1033,'yy/MM/dd')" order="descending" />