2009-11-08 4 views
0

J'ai un pour chaque qui boucle les noeuds de l'élément de nouvelles. Parmi les autres propriétés, ces informations ont deux attributs pour la date de création. Date ajoutée par le système et date de création saisie par l'utilisateur (pour remplacer la date du système). Je voudrais que la liste soit triée par date de création avec la préférence sur la date entrée par l'utilisateur.XSLT Appliquer le tri à la deuxième valeur si la première est vide

Voici mon humble tentative invalide!

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

Un grand merci

+0

umbraco ftw. J'ai eu beaucoup de drames faisant des sortes conditionnelles dans xslt. – ChadT

Répondre

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

Cette déclaration crée un nodeset avec les deux noeuds contenant la date et obtenir le dernier en fonction de l'ordre du document pour faire le tri. Si le nœud data existe et n'est pas vide, il sera utilisé pour le tri car les éléments enfants d'un élément se produisent après ses nœuds d'attribut.

concat() ne peut fonctionner que dans certains cas, si vous utilisez le tri du texte; il échouera avec le tri numérique.

+0

Je pensais que cela a fonctionné, mais en regardant de plus près, il ne fonctionne pas tout à fait. Si le noeud de données avec un alias de createdDate est présent, il l'utilise cependant s'il n'est pas présent, @createDate n'est pas utilisé à la place. Des idées à ce sujet? Semble plus robuste que l'utilisation de concat donc je voudrais persévérer. – Max

+0

peu plus d'informations. Je pense que le noeud de données existe mais il est vide. Dans ce cas, j'aimerais utiliser @createDate. – Max

+0

OK, vous n'avez tout simplement pas tout exposé. ;) Si des nœuds de données vides ne doivent pas être sélectionnés pour le tri, le prédicat doit être modifié par conséquent. J'ai édité ma réponse. – Erlock

0

droit, semble comme un hack mais j'ai pu y parvenir en utilisant un concat avec le genre.

Exemple ci-dessous

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

Pour tester si un nœud est vide (ou omis) dans XSLT:

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

Un grand merci à Erlock pour sa solution. J'ai lutté pendant un certain temps pour que cela fonctionne dans ma version d'Umbraco (4.7.1) en raison des changements apportés à la syntaxe XSLT d'Umbraco.

Pour toute personne intéressée, mon exemple de travail changerait le code d'Erlock pour devenir;

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