Previous Page Next Page

Recipe 6.3. Modularizing and Modes

Problem

XSLT 1.0 limitations on use o f modes often resulted in duplication of code or extra effort.

Solution

Use XSLT 2.0's new mode attribute's capabilities to eliminate code duplication. Consider a simple example of a stylesheet that uses two different modes to process a document in two passes. In each pass, you would like to ignore text nodes, by default. In XSLT 1.0, you would have to write something like the following:

<xsl:template match="text( )" mode="mode1"/>
<xsl:template match="text( )" mode="mode2"/>

However, in 2.0, you can remove the redundancy:

<xsl:template match="text( )" mode="mode1 mode2"/>

Or if the intention is to match in all modes:

<xsl:template match="text( )" mode="#all"/>

Granted, this is a small improvement, but it has a large payback for stylesheets that are more complex, use a large number of modes, share a lot of code between modes, or are under frequent maintenance.

Discussion

A rule of thumb that I adhere to when using modes in 2.0 is to always use #current rather than an explicitly named mode if my intention is to continue processing in the present mode:

<xsl:template match="author" mode="index">
  <div class="author">
    <xsl:apply-templates mode="#current"/>
  </div>
</xsl:template>

This has two immediately beneficial consequences. First, if you later decide you picked a bad name for the mode and want to change it, you will not need to change any of the calls to xsl:apply-templates. Second, if you add new modes to the template, it will continue to work without further change:

<xsl:template match="author" mode="index body">
  <div class="author">
    <xsl:apply-templates mode="#current"/>
  </div>
</xsl:template>


Previous Page Next Page