Domanda

ho una per ogni turno che loop nodi notizia. Tra le altre proprietà tali notizie hanno due attributi per data di creazione. Sistema di data e una data di creazione entrato utente (per sostituire la data di sistema), ha aggiunto. Vorrei che l'elenco ordinato per data di creazione, con la preferenza alla data utente immesso.

Di seguito è il mio umile tentativo valido!

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

Grazie

È stato utile?

Soluzione

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

Questa istruzione crea una serie di nodi con i due nodi che contengono la data, e l'ultima è quella secondo l'ordine del documento per fare l'ordinamento. Se Dati esiste nodo e non è vuota, sarà utilizzata per lo smistamento perché elementi secondari di un elemento si verificano dopo i suoi nodi attributo.

concat () può funzionare solo, e in alcuni casi, se si utilizza il testo di smistamento; fallirà con l'ordinamento numerico.

Altri suggerimenti

A destra, sembra un hack, ma sono stato in grado di raggiungere questo obiettivo utilizzando un concat con il genere.

Esempio seguente

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

Per verificare se un nodo è vuota (o omesso) in XSLT:

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

Molte grazie a Erlock per la sua soluzione. Ho fatto fatica per un po 'per ottenere questo lavoro nella mia versione di Umbraco (4.7.1) a causa delle modifiche apportate alla sintassi Umbraco XSLT.

Per chiunque sia interessato, il mio campione di lavoro avrebbe cambiato il codice di Erlock di diventare;

<xsl:sort select="(current()/createdDate[normalize-space() != '']|@createDate)[last()]" order="descending" />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top