Copied to clipboard

Flag this post as spam?

This post will be reported to the moderators as potential spam to be looked at


  • Jamie 35 posts 87 karma points
    Aug 13, 2012 @ 12:33
    Jamie
    0

    XSLT order by dates where date field is possibly null

    I want to show the next six movies by the release date as set by a property on the movie node. Problem is some movies in the future might not have a know release date, so even though that movie certainly won't be in the next '6' the null value throws off the xslt I have. It is apparently too much to ask them to add a future estimate and come back and change it later. This is a fairly long list of movies both past and present (and future) so efficency in the select would be a concern.

    I have tried the following in my select
    umbraco.library:GetXmlNodeById($movies)/Movie [umbraco.library:DateGreaterThanOrEqualToday(date) and date = !""] but the DateGreaterThanOrEqualToday seems to be called anyway and errors the xslt.

     

    <xsl:variable name="movies" select="macro/movies"/>
     
      <xsl:template match="/">
          
        <xsl:for-each select="umbraco.library:GetXmlNodeById($movies)/Movie [umbraco.library:DateGreaterThanOrEqualToday(date)]">
          <xsl:sort select="date" data-type="text" order="ascending" />
            
          <xsl:if test="position() &lt; 7">
            <a>
              <xsl:attribute name="href">
                <xsl:value-of select="umbraco.library:NiceUrl(@id)"/>
              </xsl:attribute>
              <img width="88px" >
                <xsl:attribute name="src">
                  <xsl:text>
                    /umbraco/ImageGen.ashx?width=88&amp;image=
                  </xsl:text>
                  <xsl:value-of select="poster"/>
                </xsl:attribute>
              </img>
            </a>
          </xsl:if>

        </xsl:for-each>
        
        
      </xsl:template>

  • Chriztian Steinmeier 2800 posts 8791 karma points MVP 8x admin c-trib
    Aug 13, 2012 @ 12:57
    Chriztian Steinmeier
    0

    Hi Jamie,

    You're right that the extension is called for all the Movie elements - so you need to only call that extension on the ones that have a date value. Here's how I'd do it:

    <xsl:template match="/">
            <!-- Max. movies to show -->
            <xsl:variable name="max" select="6" />
            <!-- Get all movies -->
            <xsl:variable name="movies" select="umbraco.library:GetXmlNodeById($movies)/Movie" />
            <!-- Get those with a date value -->
            <xsl:variable name="moviesWithValidDate" select="$movies[normalize-space(date)]" />
            <!-- - and those without one -->
            <xsl:variable name="moviesWithNoDate" select="$movies[not(normalize-space(date))]" />
    
            <!-- Combine them, but only call the extension on the valid dates -->
            <xsl:for-each select="$moviesWithValidDate[umbraco.library:DateGreaterThanOrEqualToday(date)] | $moviesWithNoDate">
                <!-- Sort first by having a date -->
                <xsl:sort select="number(not(normalize-space(date)))" data-type="number" order="ascending" />
                <!-- - then by the date value -->
                <xsl:sort select="date" data-type="text" order="ascending" />
    
                <xsl:if test="position() &lt;= $max">
                    <div>
                    <a href="{umbraco.library:NiceUrl(@id)}">
                        <img src="/umbraco/ImageGen.ashx?width=88&amp;image={poster}" width="88" />
                    </a>
                    </div>
                </xsl:if>
    
            </xsl:for-each>
        </xsl:template>

    /Chriztian

  • Eric Schrepel 161 posts 226 karma points
    Feb 11, 2013 @ 20:24
    Eric Schrepel
    0

    Is there a Razor equivalent to allow nulls in the OrderBy statement? Trying to do a sort of complex sort on documents where we sort on Official Date (if there is one), otherwise Umbraco's built-in CreationDate.

    Currently any nulls cause the following statement to throw an error:

    var items = Model.AncestorOrSelf().Descendants("Article").OrderBy("OfficialDate desc, CreateDate Desc")

  • This forum is in read-only mode while we transition to the new forum.

    You can continue this topic on the new forum by tapping the "Continue discussion" link below.

Please Sign in or register to post replies