我正在尝试按日期排序我的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..
答案 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" />