Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用xml中的日期时间在xslt中排序?_Xml_Xslt - Fatal编程技术网

使用xml中的日期时间在xslt中排序?

使用xml中的日期时间在xslt中排序?,xml,xslt,Xml,Xslt,我想根据日期按降序排序。我不知道如何做到这一点: 以下是我的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="IS

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

以下是我的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>

BBBBBB
2012年6月12日
测试
2012年7月12日
TESFDS SDFASDFASDt
2012年6月30日
我的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日

您正在对发布日期元素的字符串值进行排序,因此返回正确的顺序


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

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


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

最好在XML:2012-06-30中使用ISO日期。这些方法的一个优点是可以自然排序,另一个优点是可以方便地本地化不同自然语言等的输出(特别是在XSLT2.0中,格式为-number())


即使您坚持使用XSLT 1.0,将日期转换为ISO格式也很容易——代码很枯燥,但编写起来并不困难。

最好使用XML格式的ISO日期:2012-06-30。这些方法的一个优点是可以自然排序,另一个优点是可以方便地本地化不同自然语言等的输出(特别是在XSLT2.0中,格式为-number())


即使您坚持使用XSLT 1.0,将日期转换为ISO格式也很容易——代码很枯燥,但编写起来并不困难。

我同意其他回答海报中的观点,即您应该将日期转换为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格式。如果您可以使用XSLT2.0,请告诉我。XSLT2.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>


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

我同意其他回答海报的说法,即您应该将日期转换为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格式。如果您可以使用XSLT2.0,请告诉我。XSLT2.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>


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

嗨..想完善排序。我尝试在xslt中实现c#。但是当我检查抛出
脚本通常是安全的。你想让脚本运行吗?
我的意思是我不知道在xlst for xml中使用c#代码的正确方法。答案不是说你需要使用c#,那么你为什么要这样做呢?如果您对C#和XML有问题,那是另一个问题。同时,既然你问了这个问题,请有礼貌地试一下给出的答案,或者如果你不明白,然后问如何应用它。嗨..想完善排序。我曾尝试在xslt中实现c#。但当我检查抛出
脚本通常是安全的。你想让脚本运行吗?
我的意思是我不知道在xlst for xml中使用c#代码的正确方法。答案不是说你需要使用c#,那么你为什么要这样做?如果您对C#和XML有问题,那是另一个问题。同时,既然你问了这个问题,请耐心地试一下给出的答案,或者如果你不理解,那么问一下如何应用它。由于输入文档中的错误,它对你不起作用。你把July拼写成小写的jul而不是jul。如果你做了这个修正,它会起作用的。我在www.xmlper.com上测试了样式表。只要输入文档中没有错误,它就可以工作。由于输入文档中有错误,它对您不起作用。你把July拼写成小写的jul而不是jul。如果你做了这个修正,它会起作用的。我在www.xmlper.com上测试了样式表。只要输入文档中没有错误,它就可以工作。