Outputting the Value of Something

Creating a simple text string is easy: we just use the <xsl:text> element. However, in any stylesheet you write, you’ll probably need to output the value of something from the XML source. That’s what the <xsl:value-of> element is for. In the example stylesheet we’re building, we want to transform this element in the XML source:

<heading1>Generating text</heading1>

into this HTML element in the output:

<h2>Generating text</h2>

In other words, we want to take every <heading1> element and transform it into an HTML <h2> element that contains the value of the <heading1> element. Here’s a template that does just that:

<xsl:template match="heading1">
  <h2>
    <xsl:value-of select="."/>
  </h2>
</xsl:template>

To generate our earlier paragraph that contains the number of chapters, we’ll use <xsl:value-of> with the XPath count() function:

<p>
  This document contains 
  <xsl:value-of select="count(/article/body/heading1)"/>
  chapters.
</p>

This bit of XSLT creates the following HTML paragraph:

<p>
   This document contains 
   5
   chapters.
   
</p>

An HTML browser normalizes the whitespace before rendering it, as shown in Figure 4-1.

HTML normalizes whitespace before displaying a document
Figure 4-1. HTML normalizes whitespace before displaying a document

If we needed more control over the output, we could use <xsl:value-of> and <xsl:text> together:

<p> <xsl:text>This document contains </xsl:text> <xsl:value-of select="count(/article/body/heading1)"/> ...

Get XSLT, 2nd Edition now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.