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