Pergunta

Eu tenho um para cada que loops nós notícia redondas. Entre outras propriedades estas notícias têm dois atributos data criado para. Sistema de data e um usuário criado data inserida (para substituir a data do sistema), acrescentou. Gostaria que a lista ordenada por data de criação com a preferência na data entrou usuário.

Abaixo está a minha tentativa inválida humilde!

<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"/>

Muitos agradecimentos

Foi útil?

Solução

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

Esta instrução cria um conjunto de nós com os dois nós contendo data, e obter o último acordo com a ordem de documentos para fazer a triagem. Se dados existe nó e não está vazio, ele será usado para a triagem porque os elementos filho de um elemento ocorrer após seus nós de atributo.

concat () só pode trabalho, e em alguns casos, se você usar o texto de classificação; ele falhará com a classificação numérica.

Outras dicas

Certo, parece ser um hack, mas eu fui capaz de conseguir isso usando um concat com o tipo.

Exemplo abaixo

<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"/>

Para testar se um nó está vazio (ou omitidas) em XSLT:

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

Muito obrigado a Erlock para a sua solução. Eu fiz luta por um tempo para começar este trabalho na minha versão do Umbraco (4.7.1) devido às alterações feitas à sintaxe Umbraco XSLT.

Para quem estiver interessado, minha amostra trabalhando mudaria o código do Erlock para tornar-se;

<xsl:sort select="(current()/createdDate[normalize-space() != '']|@createDate)[last()]" order="descending" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top