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 年 6 月 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"/>

最初の並べ替えは年、2番目の並べ替えは月、最後は日です。

全体としてのスタイルシートは...

 <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形式に変換するために使用できる優れたテンプレートを次に示します。XSLT2.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。これらの利点の 1 つは、自然に並べ替えられることです。もう 1 つは、さまざまな自然言語などの出力を簡単にローカライズできることです (特に、XSLT 2.0 では format-number() を使用)。

日付を ISO 形式に変換するのは、XSLT 1.0 に行き詰まっている場合でも簡単です。コードは面倒ですが、書くのは難しくありません。

于 2012-07-06T08:20:15.987 に答える
1

Pub_Date 要素の文字列値で並べ替えているため、正しい順序が返されています。

XSLT 2.0 が必要な実際の日付型で並べ替えるか、ISO 日付形式を使用する必要があります (つまり、2012 年 6 月 30 日は 20120630 です)。これにより、日付文字列がソート可能なタイプに変換されます。

于 2012-07-06T05:20:11.747 に答える