This post presents an example on how to transform a navigation XML with a parameterized XSLT in order to produce a simple breadcrumb.
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 breadcrumb-item calls itself recursively progressively going to the parent node of the parameterized current-node until it reaches the Root Structure Group. On exiting the recursion, it produces a series of links to the current-node Structure Group using the Url and DisplayTitle attributes and assuming the default page in the Structure Group is called index.html. The links are separated by greater-than sign ( > ).
<xsl:template name="breadcrumb-item">
Navigation XML
The navigation XML is produced using one of the TBBs described in 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>
Breadcrumb 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 current Page and starting a recursive template call to breadcrumb-item. On exiting the recursion, the current page DisplayTitle attribute is output in bold:
<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="tcm:Item[@ID=$PageUri]">
<xsl:call-template name="breadcrumb-item">
<xsl:with-param name="current-node" select=".."/>
</xsl:call-template>
<b><xsl:value-of select="@DisplayTitle"/></b>
<xsl:apply-templates/>
</xsl:template>
The template breadcrumb-item calls itself recursively progressively going to the parent node of the parameterized current-node until it reaches the Root Structure Group. On exiting the recursion, it produces a series of links to the current-node Structure Group using the Url and DisplayTitle attributes and assuming the default page in the Structure Group is called index.html. The links are separated by greater-than sign ( > ).
<xsl:template name="breadcrumb-item">
<xsl:param name="current-node"/>
<xsl:if
test="$current-node/../@Url">
<xsl:call-template name="breadcrumb-item">
<xsl:with-param name="current-node"
select="$current-node/.."/>
</xsl:call-template>
</xsl:if>
<a
href="{$current-node/@Url}/index.html"><xsl:value-of
select="$current-node/@DisplayTitle"/></a> >
</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/breadcrumb.xslt" var="breadcrumb-xslt"/>
<x:transform
doc="nav-xml" xslt="breadcrumb-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).
Comments