How to Easily display Delicious bookmarks using XSLT transformation

How to Easily display Delicious bookmarks using XSLT transformation

0 281
How to Easily display Delicious bookmarks using XSLT transformation

How to Easily display Delicious bookmarks using XSLT transformation

Today we will create application which will show our Delicious bookmarks. We will use XSLT transformation to parse XML provided by Delicious. I will using my profile for our sample. And here are path for my XML feeds: http://feeds.delicious.com/v2/rss/AramisGC. So, we have all for begining. Today I`ll show you how to display this information in your projects.

Here are samples and downloadable package:

Live Demo
download in package

Ok, download the source files and lets start coding !


Step 1. PHP

Ok, here are all used PHP files:

index.php

This file will generate list of Delicious bookmarks. Quite all code commented, so I hope it will easy to understand it.

<?php

$sMethod = 'http://feeds.delicious.com/v2/rss/AramisGC';
$sXmlSrc = getDeliciousXml($sMethod);

// Load the XML source
$xml = new DOMDocument;
$xml->loadXML($sXmlSrc);

// Load XSLT
$xsl = new DOMDocument;
$xsl->load('xslt/delicious.xslt');

$proc = new XSLTProcessor; // configure the transformer
$proc->importStyleSheet($xsl); // attach the xsl rules

echo $proc->transformToXML($xml);

// this function get delicious information using caches (not more than 1 times per hour)
function getDeliciousXml($sUrl) {
    // our folder with cache files
    $sCacheFolder = 'cache/';

    // cache filename
    $sFilename = date('YmdH').'.xml';

    if (! file_exists($sCacheFolder.$sFilename)) {
        $ch = curl_init($sUrl);
        $fp = fopen($sCacheFolder.$sFilename, 'w');
        curl_setopt($ch, CURLOPT_FILE, $fp);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_HTTPHEADER, Array('User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15') ); // makes our request look like it was made by Firefox
        curl_exec($ch);
        curl_close($ch);
        fclose($fp);
    }
    return file_get_contents($sCacheFolder.$sFilename);
}

?>

Step 2. CSS

Here are used CSS file. Just few styles for our demo:

css/styles.css

h1{text-align:center}
.dl-unit{background-color:#F3F3F3;border:1px solid #CCC;position:relative;margin:10px;padding:10px}
.dl-unit h3, .dl-unit div{border-bottom:1px dashed #888;padding:5px;overflow:hidden}
.dl-unit div p{float:left;margin-right:20px}
.dl-unit div p:first-child{font-weight:bold}
body{background:#eee;font-family:Verdana, Helvetica, Arial, sans-serif;margin:0;padding:0}
.main{background:#FFF;width:900px;font-size:80%;border:1px #000 solid;margin:3.5em auto 2em;padding:1em 2em 2em}

Step 3. XSLT

And, most interesting part of my story – used XSLT rules:

xslt/delicious.xslt

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="channel">
        <xsl:variable name="channelDescription" select="description"/>
        <xsl:variable name="authorLink" select="link"/>
        <html>
            <head>
                <link media="all" href="css/styles.css" type="text/css" rel="stylesheet"/>
            </head>
            <body>
                <div class="main">
                <h1>
                    <a>
                        <xsl:attribute name="href">
                            <xsl:value-of select="$authorLink"/>
                        </xsl:attribute>
                        <xsl:value-of select="$channelDescription"/>
                    </a>
                </h1>
                <xsl:for-each select="item">
                    <div class="dl-unit">
                        <h3>
                            <a target="_blank">
                                <xsl:attribute name="title"><xsl:value-of select="title"/></xsl:attribute>
                                <xsl:attribute name="href"><xsl:value-of select="link"/></xsl:attribute>
                                <xsl:value-of select="title"/>
                            </a>
                        </h3>
                        <div><p>Description:</p><p><xsl:value-of select="description" disable-output-escaping="yes" /></p></div>
                        <div>
                            <a target="_blank">
                                <xsl:attribute name="href">
                                    <xsl:value-of select="comments"/>
                                </xsl:attribute>
                                link to comments
                            </a>
                        </div>
                        <div><p>When:</p><p><xsl:value-of select="substring(pubDate, 0, 26)"/></p></div> <!-- we will take first 26 symbols -->
                        <div><p>Tags:</p><p>
                            <xsl:for-each select="category">
                                <a target="_blank">
                                    <xsl:attribute name="href">
                                        <xsl:value-of select="@domain"/>
                                        <xsl:value-of select="."/>
                                    </xsl:attribute>
                                    <xsl:value-of select="."/>
                                </a> |
                            </xsl:for-each>
                        </p></div>
                    </div>
                </xsl:for-each>
                </div>
                <xsl:comment>Copyright: AndrewP</xsl:comment>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Step 4. Few important notes

During checking my PHP file you will notice that I perform caching of Delicious requests. I don`t load provided RSS often that once per hour. No need overload Delicious server with often requests :)

I made ‘cache’ folder with permission to write (you should create ‘cache’ folder too).

Also I created .htaccess file in it with next content:

Options -Indexes

Thats all.


Live Demo
download in package

Conclusion

I hope that today’s article will very useful for your projects. Good luck!

SIMILAR ARTICLES


NO COMMENTS

Leave a Reply