繁体   English   中英

从XML中的datetime排序在xslt中?

[英]Sorting in xslt with datetime from xml?

我想基于date.i降序排序我不知道如何做到这一点:

这是我的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日

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

我同意其他答复者的意见,即您应该将日期转换为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>

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

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

即使您坚持使用XSLT 1.0,将日期转换为ISO格式也很容易-代码很繁琐,但并不难编写。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM