This post presents an example on how to transform a navigation XML with a parameterized XSLT in order to produce a simple site navigation.
Navigation XML format:
<tcm:ListItems ID="tcm:1-1-4" Title="Root">
<tcm:Item ID="tcm:1-2-4" Title="010 About Us" DisplayTitle="About Us" Url="/about-us">
<tcm:Item ID="tcm:1-3-64" Title="010 Who are we?" DisplayTitle="Who are we?" Url="/about-us/who-are-we.html"/>
</tcm:Item>
<tcm:Item ID="tcm:1-4-64" Title="020 Contact Us" DisplayTitle="Contact Us" Url="/contact-us.html"/>
</tcm:ListItems>
The template continues to apply three transformations:
Navigation XML
The navigation XML is produced using one of the TBBs described in my earlier posts:- Generate Structure Group Navigation - Recursive TBB;
- Generate Structure Group Navigation - GetItems TBB;
- Generate Structure Group Navigation - Reorder TBB;
Navigation XML format:
<tcm:ListItems ID="tcm:1-1-4" Title="Root">
<tcm:Item ID="tcm:1-2-4" Title="010 About Us" DisplayTitle="About Us" Url="/about-us">
<tcm:Item ID="tcm:1-3-64" Title="010 Who are we?" DisplayTitle="Who are we?" Url="/about-us/who-are-we.html"/>
</tcm:Item>
<tcm:Item ID="tcm:1-4-64" Title="020 Contact Us" DisplayTitle="Contact Us" Url="/contact-us.html"/>
</tcm:ListItems>
Navigation XSLT
The full XSLT is available for download. This XSLT takes as parameter the current Page TCMURI as string (parameter name PageUri). It transforms the navigation XML, by identifying the tcm:Item corresponding to the Structure Group parent node of the current Page:
<xsl:stylesheet
version="1.0"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:tcm="http://www.tridion.com/ContentManager/5.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="fn tcm xsl">
<xsl:output
omit-xml-declaration="yes" method="html" />
<xsl:param
name="PageUri" />
<xsl:template
match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template
match="tcm:Item[tcm:Item/@ID=$PageUri]">
<xsl:call-template name="output-parent-sg">
<xsl:with-param name="parent-node" select="."/>
</xsl:call-template>
<xsl:call-template
name="output-sg">
<xsl:with-param name="parent-node" select="."/>
</xsl:call-template>
<xsl:call-template name="output-page">
<xsl:with-param name="parent-node" select="."/>
</xsl:call-template>
<xsl:apply-templates/>
</xsl:template>
The template continues to apply three transformations:
- output-parent-sg: outputs a link to the parent Structure Group relative to the current Structure Group, if the parent is not the Root Structure Group. The link URL assumes the default page in the parent Structure Group is index.html. The link text is the value of the parent's attribute DisplayTitle;
<xsl:template
name="output-parent-sg">
<xsl:param name="parent-node"/>
<xsl:if
test="$parent-node/../@Url">
<ul>
<li>
<-- <a href="{$parent-node/../@Url}/index.html"><xsl:value-of
select="$parent-node/../@DisplayTitle"/></a>
</li>
</ul>
</xsl:if>
</xsl:template>
- output-sg: outputs a list of links to all sub-Structure Groups relative to the current Structure Group;
<xsl:template
name="output-sg">
<xsl:param name="parent-node"/>
<ul>
<xsl:for-each
select="$parent-node/tcm:Item[fn:ends-with(string(@ID),'-4')]">
<xsl:sort select="@Title"/>
<li>
<a href="{@Url}/index.html"><xsl:value-of
select="@DisplayTitle"/></a> -->
</li>
</xsl:for-each>
</ul>
</xsl:template>
- output-page: outputs a list of links to all Pages within the current Structure Group. The current Page ($PageUri) is highlighted in bold and it is not rendered as link;
<xsl:param name="parent-node"/>
<ul>
<xsl:for-each
select="$parent-node/tcm:Item[fn:ends-with(string(@ID),'-64')]">
<xsl:sort select="@Title"/>
<li>
<xsl:choose>
<xsl:when test="@ID=$PageUri">
<b><xsl:value-of
select="@DisplayTitle"/></b>
</xsl:when>
<xsl:otherwise>
<a href="{@Url}"><xsl:value-of
select="@DisplayTitle"/></a>
</xsl:otherwise>
</xsl:choose>
</li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>
The Transformation
In this example, I'm using the <x:transform> tag from REL Standard Tag Library (RSTL) to perform the XML / XSLT transformation.
The following code is part of the Dreamweaver TBB on a Page Template that outputs the navigation:
<c:import
url="/wfaf/system/navigation.xml" var="nav-xml"/>
<c:import
url="/wfaf/system/navigation.xslt" var="nav-xslt"/>
<x:transform
doc="nav-xml" xslt="nav-xslt">
<x:param
var="PageUri" select="@@Page.ID@@" />
</x:transform>
Each Page published on the given Page Template will parameterize the transformation by substituting the DWT variable @@Page.ID@@ with its real value (e.g. tcm:1-2-64).
The Output
Executing the Page produces the following output:
Comments