我有一个循环新闻项目节点。在其他属性中,这些新闻项具有创建日期的两个属性。系统添加日期和用户输入创建日期(以覆盖系统日期)。我希望列表按创建日期排序,并根据用户输入的日期进行首选项。
以下是我卑微的无效尝试!
<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"/>
非常感谢
答案 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" />