Copied to clipboard

Flag this post as spam?

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


  • Bjarne Fyrstenborg 1182 posts 3441 karma points MVP 4x c-trib
    May 12, 2011 @ 15:57
    Bjarne Fyrstenborg
    0

    How to display random quote?

    Hi

    I have the following structure of my content:

    - Content

    • Master
      • da
        • Frontpage
        • Subpage
        • Subpage
        • News
          • Quotes
            • - Quote
            • - Quote
    The Quotes and Quote have each a document type "Quotes" and "Quote", where Quote has the properties quoteText and quoteName.
    How can I create my xslt so for each Quote node, which use the Quote document type, it writes the quote text and quote name.. and then display a random node, so I can place the macro on eg. frontpage and a subpage?
    - Bjarne
  • Bjarne Fyrstenborg 1182 posts 3441 karma points MVP 4x c-trib
    May 12, 2011 @ 15:59
    Bjarne Fyrstenborg
    0

    The News and Quotes node are at same level.

  • Profiterole 232 posts 264 karma points
    May 12, 2011 @ 16:03
    Profiterole
    0

    Hi, for the random node, it's simple :

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
    <xsl:stylesheet
      version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxml="urn:schemas-microsoft-com:xslt"
      xmlns:umbraco.library="urn:umbraco.library" xmlns:Exslt.ExsltCommon="urn:Exslt.ExsltCommon" xmlns:Exslt.ExsltDatesAndTimes="urn:Exslt.ExsltDatesAndTimes" xmlns:Exslt.ExsltMath="urn:Exslt.ExsltMath" xmlns:Exslt.ExsltRegularExpressions="urn:Exslt.ExsltRegularExpressions" xmlns:Exslt.ExsltStrings="urn:Exslt.ExsltStrings" xmlns:Exslt.ExsltSets="urn:Exslt.ExsltSets" xmlns:umbraco.contour="urn:umbraco.contour"
      exclude-result-prefixes="msxml umbraco.library Exslt.ExsltCommon Exslt.ExsltDatesAndTimes Exslt.ExsltMath Exslt.ExsltRegularExpressions Exslt.ExsltStrings Exslt.ExsltSets umbraco.contour ">


    <xsl:output method="xml" omit-xml-declaration="yes"/>

    <xsl:param name="currentPage"/>
        

    <xsl:template match="/">

    <!-- start writing XSLT -->
    <xsl:variable name="randomNode" select="/macro/randomNode/node"/>
    <xsl:value-of select="$randomNode/data[@alias = 'quoteName']" disable-output-escaping="yes" />
    <p><xsl:value-of select="$randomNode/data[@alias = 'quoteText']" disable-output-escaping="yes" />
    </p>


    </xsl:template>

    </xsl:stylesheet>

    For the macro, you name the parameter alias randomNode and choose contentRandom as type.

  • Sebastian Dammark 547 posts 1287 karma points
    May 12, 2011 @ 17:37
    Sebastian Dammark
    2

    Hi Bjarne

    I haven't tested it, but it should work

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
    <xsl:stylesheet 
        version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:msxml="urn:schemas-microsoft-com:xslt"
        xmlns:umb="urn:umbraco.library"
        xmlns:emath="urn:Exslt.ExsltMath"
        exclude-result-prefixes="msxml umb emath ">
    
        <xsl:output method="xml" omit-xml-declaration="yes"/>
    
        <xsl:param name="currentPage"/>
        <xsl:variable name="random" select="floor(emath:random() * count($currentPage/ancestor-or-self::Master/descendant-or-self::Quote)) + 1"/>
    
        <xsl:template match="/">
         <xsl:apply-templates select="$currentPage/ancestor-or-self::Master/descendant-or-self::Quote[$random]" />
        </xsl:template>
    
        <xsl:template match="Quote">
            <div id="randquote">
                <xsl:apply-templates select="quoteName[normalize-space()]" />
                <xsl:apply-templates select="quoteText[normalize-space()]" />
            </div>
        </xsl:template>
    
        <xsl:template match="quoteName">
            <h1>
                <xsl:value-of select="." />
            </h1>
        </xsl:template>
    
        <xsl:template match="quoteText">
            <p>
                <xsl:value-of select="." />
            </p>
        </xsl:template>
    
    </xsl:stylesheet>
  • Bjarne Fyrstenborg 1182 posts 3441 karma points MVP 4x c-trib
    May 12, 2011 @ 21:57
    Bjarne Fyrstenborg
    0

    I have wrote the following in my XSLT:

    <xsl:template match="/">

    <!-- start writing XSLT -->
      <xsl:variable name="randomNode" select="/macro/randomNode/*"/>
      <xsl:value-of select="$randomNode/quoteName" disable-output-escaping="yes" />
    <p><xsl:value-of select="$randomNode/quote" disable-output-escaping="yes" />
    </p>


    </xsl:template>

    and added a parameter with alias randomNode to the macro, but it doesn't seem to give a output. I'm using Umbraco 4.7 with the new xml schema .. I have tried with /macro/randomNode/* [@isDoc] too, but doesn't work .

    Is something missing?

  • Bjarne Fyrstenborg 1182 posts 3441 karma points MVP 4x c-trib
    May 12, 2011 @ 22:20
    Bjarne Fyrstenborg
    0

    Hi Sebastian

    Thank you so much for your input :)
    Just what I needed... it now works perfectly as intended.

    Your code works, just my Master doc types actually is called MainMaster.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp "&#x00A0;"> ]>
    <xsl:stylesheet 
            version="1.0" 
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
            xmlns:msxml="urn:schemas-microsoft-com:xslt"
            xmlns:umb="urn:umbraco.library"
            xmlns:emath="urn:Exslt.ExsltMath"
            exclude-result-prefixes="msxml umb emath ">

            <xsl:output method="xml" omit-xml-declaration="yes"/>

            <xsl:param name="currentPage"/>
            <xsl:variable name="random" select="floor(emath:random() * count($currentPage/ancestor-or-self::MainMaster/descendant-or-self::Quote)) + 1"/>

            <xsl:template match="/">
             <xsl:apply-templates select="$currentPage/ancestor-or-self::MainMaster/descendant-or-self::Quote[$random]" />
            </xsl:template>

            <xsl:template match="Quote">
                    <div id="randquote">
                            <xsl:apply-templates select="quoteText[normalize-space()]" />
                            <xsl:apply-templates select="quoteName[normalize-space()]" />
                    </div>
            </xsl:template>
            
            <xsl:template match="quoteText">
                    <p>
                            <xsl:value-of select="." />
                    </p>
            </xsl:template>
              
            <xsl:template match="quoteName">
                    <b>
                            <xsl:value-of select="." />
                    </b>
            </xsl:template>
            
      

    </xsl:stylesheet>

    So if you take a look at the temporary url here: http://d22299829.u330.surftown.dk/da/ydelser.aspx , then the quote in the left sidebar on subpages change when you refresh the page or go to another page..

    Once again I appreciate your help..

    - Bjarne

  • Jan Skovgaard 11258 posts 23500 karma points MVP 7x admin c-trib
    May 12, 2011 @ 23:16
    Jan Skovgaard
    0

    Hi Sebastian

    Would you mind sharing this in the wiki if it does not already exist in there? Nice solution indeed :-)

    /Jan

  • Sebastian Dammark 547 posts 1287 karma points
    May 13, 2011 @ 10:35
    Sebastian Dammark
    1

    @Jan and @Bjarne

    Here you go: http://our.umbraco.org/wiki/how-tos/xslt-useful-tips-and-snippets/xslt-getting-a-random-document-when-the-page-reloads

    I've optimized it a bit using root instead of the MainMaster doctype.

     

  • 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