Pregunta

Tengo una para cada uno, que los bucles de nodos de artículos de noticias redondas. Entre otras propiedades estas noticias tienen dos atributos de la fecha de creación. Sistema fecha y una fecha introducida creado por el usuario (para anular la fecha del sistema) añadió. Me gustaría que la lista ordenada por fecha de creación con la preferencia en la fecha introducida por el usuario.

A continuación se muestra mi intento no válido 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"/>

Muchas gracias

¿Fue útil?

Solución

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

Esta sentencia crea un conjunto de nodos con los dos nodos que contienen la fecha, y obtener la última según el orden documento para realizar la ordenación. Si datos existe nodo y no está vacío, se va a utilizar para la clasificación porque los elementos secundarios de un elemento se producen después de sus nodos de atributo.

concat () sólo puede trabajar, y en unos pocos casos, si se utiliza texto de clasificación; se producirá un error con la clasificación numérica.

Otros consejos

Bien, parece un truco, pero he sido capaz de lograr esto mediante el uso de un concat con el tipo.

Ejemplo a continuación

<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 probar si un nodo está vacía (o se omite) en XSLT:

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

Muchas gracias a Erlock para su solución. Yo lucho por un tiempo para conseguir este trabajo en mi versión de Umbraco (4.7.1) debido a los cambios realizados en la sintaxis Umbraco XSLT.

Para cualquier persona interesada, mi muestra de trabajo iba a cambiar el código de Erlock para convertirse;

<xsl:sort select="(current()/createdDate[normalize-space() != '']|@createDate)[last()]" order="descending" />
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top