0

我想根据日期按降序排序。我不知道如何做到这一点:

这是我的 xml:

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<inm:Results productTitle="Inmagic DB/Text WebPublisher PRO" productVersion="13.00" xmlns:inm="http://www.inmagic.com/webpublisher/query" oex="ISO-8859-1">
<inm:Recordset AC="QBE_QUERY" sn="AUTO26264" se="1392" queryCount="139" page="1" pageCount="1" setCount="139">
<inm:Record setEntry="0">
  <inm:Title>BBBBBB</inm:Title>
  <inm:Pub_Date>12-Jun-2012</inm:Pub_Date>
  <inm:Words />
</inm:Record>
<inm:Record setEntry="1">
   <inm:Title>TESTING ESTING</inm:Title>
   <inm:Pub_Date>12-jul-2012</inm:Pub_Date>
  <inm:Words />
</inm:Record>
<inm:Record setEntry="2">    
  <inm:Title>TESFDS SDFASDFASDt</inm:Title>
  <inm:Pub_Date>30-Jun-2012</inm:Pub_Date>
  <inm:Words />
</inm:Record>   
</inm:Recordset>
</inm:Results>

我的xml是:

  <?xml version="1.0" encoding="utf-8"?>
 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:inm="http://www.inmagic.com/webpublisher/query">
 <xsl:output method="html"/>
 <xsl:template match="/">
 <ul class="baseList newsList">
  <xsl:for-each  select="inm:Results/inm:Recordset/inm:Record" >
    <xsl:sort select="inm:Pub_Date" order="descending"/>
      <li>
        <span class="title">
          <a href="#">
            <xsl:value-of select="inm:Title" />
          </a>
        </span>
        <p class="meta">
          <span class="dateTime">
            <xsl:value-of select="inm:Pub_Date"/>
          </span>
        </p>
      </li>
  </xsl:for-each>
</ul>
  </xsl:template>

我尝试在 xslt 脚本中进行排序,但它不能完美地工作。

输出为: - 2012 年 6 月 30 日 - 2012 年 7 月 12 日 - 2012 年 6 月 12 日

但输出应为:-12-jul-2012 -30-jun-2012 -12-Jun-2012

4

3 回答 3

3

我同意其他答案海报,您应该将日期转换为 ISO 日期格式。

话虽如此,如果您坚持使用示例文档中提供的格式,您可以使用以下 xsl:sort 指令...

<xsl:sort select="substring(inm:Pub_Date,8)" data-type="number" order="descending"/>
<xsl:sort select="string-length( substring-before(
  'JanFebMarAprMayJunJulAugSepOctNovDec',
  substring(inm:Pub_Date,4,3)))" data-type="number" order="descending"/>
<xsl:sort select="substring-before(inm:Pub_Date,'-')" data-type="number" order="descending"/>

第一个按年排序,第二个按月排序,最后按天排序。

样式表作为一个整体是......

 <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:inm="http://www.inmagic.com/webpublisher/query">
 <xsl:output method="html"/>
 <xsl:template match="/">
 <ul class="baseList newsList">
  <xsl:for-each  select="inm:Results/inm:Recordset/inm:Record" >
    <xsl:sort select="substring(inm:Pub_Date,8)" data-type="number" order="descending"/>
    <xsl:sort select="string-length( substring-before(
      'JanFebMarAprMayJunJulAugSepOctNovDec',
      substring(inm:Pub_Date,4,3)))" data-type="number" order="descending"/>
    <xsl:sort select="substring-before(inm:Pub_Date,'-')" data-type="number" order="descending"/>
      <li>
        <span class="title">
          <a href="#">
            <xsl:value-of select="inm:Title" />
          </a>
        </span>
        <p class="meta">
          <span class="dateTime">
            <xsl:value-of select="inm:Pub_Date"/>
          </span>
        </p>
      </li>
  </xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>

更新

作为一个有用的提示,这里有一个简洁的模板,可用于将日期从 2012 年 6 月 30 日格式转换为 ISO/XML 格式。让我知道您是否可以使用 XSLT 2.0 。XSLT 2.0 中的转换变得更简单。

<xsl:template name="format-date">
 <xsl:param name="InDateValue" select="'01-Jan-2000'" />
 <xsl:value-of select="concat( substring($InDateValue, 8, 4), '-')"/>
 <xsl:variable name="month" select="substring($InDateValue, 4, 3)" />
 <xsl:value-of select="format-number(
          translate( $month, 'nFrylgSONDJaebMApupctov', '00240107666') +
          translate( $month, 'aFpugONDJnebMrAyluSctovc', '12268456'), '00')" />
 <xsl:value-of select="concat( '-', substring($InDateValue, 1, 2))"/>
</xsl:template>

好吧,它安静的钝!但我喜欢它。

于 2012-07-06T09:33:01.967 回答
2

最好在 XML 中使用 ISO 日期:2012-06-30。这些方法的一个优点是它们可以自然排序,另一个优点是可以很容易地本地化不同自然语言的输出等(尤其是在 XSLT 2.0 中使用 format-number())。

即使您被 XSLT 1.0 困住,将日期转换为 ISO 格式也很容易——代码很乏味,但编写起来并不难。

于 2012-07-06T08:20:15.987 回答
1

您正在对 Pub_Date 元素的字符串值进行排序,因此将返回正确的顺序。

如果您想按实际日期类型进行排序,则需要 XSLT 2.0 或使用 ISO 日期格式(因此 2012 年 6 月 30 日为 20120630)。然后,这会将日期字符串放入可以排序的类型中。

于 2012-07-06T05:20:11.747 回答