XSLT Aplique espécie de segundo valor se o primeiro está vazio
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
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" />