XSLT如果first为空,则将排序应用于第二个值

时间:2009-11-08 16:34:24

标签: xslt sorting umbraco

我有一个循环新闻项目节点。在其他属性中,这些新闻项具有创建日期的两个属性。系统添加日期和用户输入创建日期(以覆盖系统日期)。我希望列表按创建日期排序,并根据用户输入的日期进行首选项。

以下是我卑微的无效尝试!

<xsl:for-each select="$currentPage/ancestor-or-self::node /node [@nodeTypeAlias = $documentTypeAlias and string(data [@alias='umbracoNaviHide']) != '1']">

<xsl:choose>
 <xsl:when test="data [@alias = 'createdDate'] != ''">
  <xsl:variable name="sort" select="string(data [@alias = 'createdDate'])"/>
 </xsl:when>
 <xsl:otherwise>
  <xsl:variable name="sort" select="string(@createDate)"/>
 </xsl:otherwise>
</xsl:choose>

<xsl:sort select="$sort" order="descending"/>

非常感谢

4 个答案:

答案 0 :(得分:7)

<xsl:sort select="(data[@alias='createdDate' and normalize-space() != '']|@createDate)[last()]" order="descending" />

此语句创建一个节点集,其中包含两个包含日期的节点,并根据文档顺序获取最后一个节点以进行排序。如果 data 节点存在且不为空,则它将用于排序,因为元素的子元素出现在其属性节点之后。

concat()只能工作,在少数情况下,如果你使用文本排序;它会因数字排序而失败。

答案 1 :(得分:0)

是的,看起来像是一个黑客,但我已经能够通过使用这种类型的concat实现这一点。

以下示例

<xsl:for-each select="$currentPage/ancestor-or-self::node /node [@nodeTypeAlias = $documentTypeAlias and string(data [@alias='umbracoNaviHide']) != '1']">
<xsl:sort select="concat(data [@alias = 'createdDate'],@createDate)" order="descending"/>

答案 2 :(得分:0)

在XSLT中测试节点是否为空(或省略):

<xsl:when test="not(string(name))">...</xsl:when>
<!-- or -->
<xsl:when test="not(name)">...</xsl:when>

答案 3 :(得分:0)

非常感谢Erlock的解决方案。由于对Umbraco XSLT语法的更改,我确实在我的Umbraco版本(4.7.1)中工作了一段时间。

对于任何有兴趣的人,我的工作样本会改变Erlock的代码;

<xsl:sort select="(current()/createdDate[normalize-space() != '']|@createDate)[last()]" order="descending" />