Learn More





DNN Community Blog

The Community Blog is a personal opinion of community members and by no means the official standpoint of DNN Corp or DNN Platform. This is a place to express personal thoughts about DNNPlatform, the community and its ecosystem. Do you have useful information that you would like to share with the DNN Community in a featured article or blog? If so, please contact .

The use of the Community Blog is covered by our Community Blog Guidelines - please read before commenting or posting.

[Token] based module templates and XSL compared

DotNetNuke uses different kind of token based templates engines, for example it allows designers to create skins with plain html skins. Administrators and localization maintainer are able to create and update dynamic texts inside system messages. Token support is also included several inside modules, e.g. Text/Html or Newsletters.

Token based templates are not limited to flat set of fields; some modules are using them also to render collections of items.  
Lorraine showed some ways to pimp up the Announcement module. The Announcement module allows the definition of templates for header, item and footer.
I am going to reuse her example: Consider this table as an extract of the data used inside Lorraine’s blog:

Example data

Puppy Kinda
For pubs between 8 weeks and 6 months of age
Primary Paws
For Puppy Kinda graduates and young dogs from 4 months age
Master Paws
An agility based program for dogs over one year old.

Announcement offers tokens that map directly to its raw data: [ITEMID], [TITLE], [DESRCIPTION], [URL]. In addition it introduces some tokens calculated out of the raw data that offers further functionality like [EDIT] and [READMORE]. The [EDIT] token renders an edit pencil with a link to edit the current announcement item, [READMORE] displays a complete Read more… Link using the URL value.

Example set of templates

This compact example requires only a basic template setup.

Header Template
This is returned one time at the beginning
Item Template
         <b>[TITLE] </b> -
        [DESCRIPTION] &nsbp; 
        <i><a href="[URL]">Read more</a></i>

The module repeats the Item tempate for all announcement items and replaces the [tokens] with the corresponding values.

Usually the pattern <a href="[URL]">Read more</a> will be replaced with the [READMORE] token.

Footer Template
 finally the table gets closed

XML and XSL-Transformations

I propose that everyone who is able to author token templates is also able to write his own basic XSL stylesheets. I am using the same data as before, I am only converting it to XML. XSL stylesheets have the same purpose as token templates: to transform data into a  given layout.  I will show the XSL needed to get the same result as before. Let us assume the Announcement module would offer also a plain XML view of its data. The table above would likely look like this:

      <Title>Puppy Kinda</Title>
      <Description>For pubs between 8 weeks and 6 months of age</Description>
      <Title>Primary Paws</Title>
      <Description>For Puppy Kinda graduates and young dogs from 4 months age</Description>
      <Title>Master Paws</Title>
      <Description>An agility based program for dogs over one year old.</Description>

This XML consists out of one single root element (Module) with has further elements inside. Each row here is represented by an element "Announcement". Each "Announcement" element  contains the column cells as its elements.

Now here is the XSL Stylesheet that generated the same output:  

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="">
Each XSL Stylesheet starts with that declaration
  <xsl:output method="xml" indent="yes" omit-xml-declaration ="yes"/>
followed by an output directive. I chose "xml" as method to get an XHtml compliant result. 
  <xsl:template match="Module">
 Template that matches the root element
Header Template 
      <xsl:for-each select ="Announcement">
 The loop: Iteration over all Announcements
 Item Template
            <b><xsl:value-of select ="Title"/> </b> -
            <xsl:value-of select ="Description"/>&#160;
            <i><a href="{URL}">Read more..</a></i>

The content of a cell element is either written as <xsl:value-of select="token"/>

or it is adressed as {token} if the value should be used inside a HTML  attribute.

 End of loop
 Footer Template
 End of template
 End of stylesheet


I hope I was able to show that templates and XSL stylesheets are quite similiar, at least at this  basic level. Writing a custom XSL stylesheet for example for an RSS feed isn't that much different.



Comment Form

Only registered users may post comments.


2sic Daniel Mettler (124)
Aderson Oliveira (15)
Alec Whittington (11)
Alex Shirley (10)
Andrew Nurse (30)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (22)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (203)
Chris Paterra (55)
Clinton Patterson (28)
Cuong Dang (21)
Daniel Bartholomew (2)
Dave Buckner (2)
David Poindexter (3)
David Rodriguez (2)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (74)
Geoff Barlow (6)
Gifford Watkins (3)
Gilles Le Pigocher (3)
Ian Robinson (7)
Israel Martinez (17)
Jan Blomquist (2)
Jan Jonas (3)
Jaspreet Bhatia (1)
Jenni Merrifield (6)
Joe Brinkman (270)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matthias Schlomann (15)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Mike Horton (19)
Mitchel Sellers (28)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Peter Donker (52)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott S (11)
Scott Wilkinson (3)
Scott Willhite (97)
Sebastian Leupold (80)
Shaun Walker (237)
Shawn Mehaffie (17)
Stefan Cullmann (12)
Stefan Kamphuis (12)
Steve Fabian (31)
Timo Breumelhof (24)
Tony Henrich (3)
Torsten Weggen (2)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (37)
Will Strohl (163)
William Severance (5)
Try Evoq
For Free
Start Free Trial
a Demo
See Evoq Live
Need More Information?