仅在字符串长度!= 0时在XSLT中排序

时间:2012-11-15 14:15:54

标签: xml xslt sorting

我使用以下XSLT块从XML文件中获取“最新”项的描述。它按日期排序(在我的XML中显示为<date>2011-11-15</date>),然后从排序列表中选择最顶层的一个。虽然我刚发现某些项目没有日期,但它们只是显示为<date/>。问题是我的XSLT在排序列表的顶部对这些进行排序,因此首先选择没有日期的项目。

那么,我如何按日期对项目进行排序,其长度大于零?

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/">
    <xsl:apply-templates select="/products/product">
      <xsl:sort select="normalize-space(substring(date,0,4))" order="ascending" />
      <xsl:sort select="normalize-space(substring(date,4,2))" order="ascending" />
      <xsl:sort select="normalize-space(substring(date,7,2))" order="ascending" />
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template match="product">
    <xsl:if test="position()=1">
      <xsl:value-of select="description"/>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

1 个答案:

答案 0 :(得分:1)

请避免在排序中包含没有日期的那些:

<xsl:apply-templates select="/products/product[date]">

顺便说一下(a)您似乎选择了列表中最早的项目,而不是最新项目;(b)实际上没有必要将日期分为三个部分进行格式化:如果所有日期都采用YYYY格式-MM-DD然后直接字母排序应该完成工作,除非系统决定使用奇怪的整理顺序,在这种情况下<xsl:sort select="number(translate(date, '-', ''))" data-type="number"/>可能更安全。