trim.text

trim.text — Trim leading and trailing whitespace from a text node

Description

Given a text node, this function trims leading and trailing whitespace from it and returns the trimmed contents.


  <xsl:template name="trim.text">
    <xsl:param name="contents" select="."></xsl:param>
    <xsl:variable name="contents-left-trimmed">
      <xsl:call-template name="trim-left">
        <xsl:with-param name="contents" select="$contents"></xsl:with-param>
      </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="contents-trimmed">
      <xsl:call-template name="trim-right">
        <xsl:with-param name="contents" select="$contents-left-trimmed"></xsl:with-param>
      </xsl:call-template>
    </xsl:variable>
    <xsl:value-of select="$contents-trimmed"></xsl:value-of>
  </xsl:template>

  <xsl:template name="trim-left">
    <xsl:param name="contents"></xsl:param>
    <xsl:choose>
      <xsl:when test="starts-with($contents,'
') or                       starts-with($contents,'') or                       starts-with($contents,' ') or                       starts-with($contents,'	')">
        <xsl:call-template name="trim-left">
          <xsl:with-param name="contents" select="substring($contents, 2)"></xsl:with-param>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$contents"></xsl:value-of>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="trim-right">
    <xsl:param name="contents"></xsl:param>
    <xsl:variable name="last-char">
      <xsl:value-of select="substring($contents, string-length($contents), 1)"></xsl:value-of>
    </xsl:variable>
    <xsl:choose>
      <xsl:when test="($last-char = '
') or                       ($last-char = '') or                       ($last-char = ' ') or                       ($last-char = '	')">
        <xsl:call-template name="trim-right">
          <xsl:with-param name="contents" select="substring($contents, 1, string-length($contents) - 1)"></xsl:with-param>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$contents"></xsl:value-of>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>