O'Reilly logo

XSLT Cookbook by Sal Mangano

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

Wrapping Text to a Specified Width and Alignment

Problem

You want to format multilined text within an XML document into a fixed-width-aligned format, insuring that lines wrap at word boundaries.

Solution

Here is a solution that handles both wrapping and alignment by reusing the text:justify template constructed in Recipe 5.3. For added flexibility, you can allow the alignment width to be specified separately from wrapping width, but default to it when unspecified:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" id="text.wrap" xmlns:str="http://www.ora.com/XSLTCookbook/namespaces/strings" xmlns:text="http://www.ora.com/XSLTCookbook/namespaces/text" exclude-result-prefixes="text"> <xsl:include href="../strings/str.find-last.xslt"/> <xsl:include href="text.justify.xslt"/> <xsl:template match="node( ) | @*" mode="text:wrap" name="text:wrap"> <xsl:param name="input" select="normalize-space( )"/> <xsl:param name="width" select="70"/> <xsl:param name="align-width" select="$width"/> <xsl:param name="align" select=" 'left' "/> <xsl:if test="$input"> <xsl:variable name="line"> <xsl:choose> <xsl:when test="string-length($input) > $width"> <xsl:call-template name="str:substring-before-last"> <xsl:with-param name="input" select="substring($input,1,$width)"/> <xsl:with-param name="substr" select=" ' ' "/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:value-of select="$input"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:if test="$line"> <xsl:call-template ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required