Question

J'ai un pour chaque noeuds qui boucle d'élément de nouvelles rondes. Parmi les autres propriétés de ces éléments d'information ont deux attributs pour la date de création. Système ajouté date et une date de création est entré utilisateur (pour remplacer la date du système). Je voudrais que la liste triée par date de création avec la préférence à la date d'entrée utilisateur.

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

Merci

Était-ce utile?

La solution

<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 selon l'ordre du document pour faire le tri. Si données nœud existe et est pas vide, il sera utilisé pour le tri parce que les éléments de l'enfant d'un élément se produisent après ses noeuds d'attributs.

concat () ne peut fonctionner, et dans quelques cas, si vous utilisez du texte de tri; il échouera avec tri numérique.

Autres conseils

droite, semble comme un hack mais j'ai été en mesure de réaliser cela 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"/>

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>
Beaucoup

grâce à Erlock pour sa solution. Je ne lutte pendant un certain temps pour obtenir ce travail dans ma version de Umbraco (4.7.1) en raison des modifications apportées à la syntaxe XSLT Umbraco.

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

<xsl:sort select="(current()/createdDate[normalize-space() != '']|@createDate)[last()]" order="descending" />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top