使用xml中的日期时间在xslt中排序?
我想根据日期按降序排序。我不知道如何做到这一点: 以下是我的xml:使用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 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上测试了样式表。只要输入文档中没有错误,它就可以工作。