Re: [xsl] Replace(//text()) in XSLT 1

Subject: Re: [xsl] Replace(//text()) in XSLT 1
From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
Date: Fri, 16 Nov 2012 12:05:48 -0500
At 2012-11-16 12:01 -0500, Nathan Tallman wrote:
I'd like to replace hyphens with en dashes. In XSLT 2.0, I can do this
with replace(text()), but I'm limited to XSLT 1.0.

How could I achieve the same thing in XSLT 1.0?

<xsl:value-of select="replace(//text(), '-', '&#8211;')"/>

First of all, I would expect the above statement to fail because the first argument to replace has to be a singleton. I would have used:


<xsl:value-of select="replace(.,'-','&#8211;')"/>

As for an XSLT 1.0 version, you need a recursive call to walk through the string making one replacement at a time along the lines of this untested fragment:

  <xsl:template name="dashes">
    <xsl:param name="content" select="."/>
    <xsl:choose>
      <xsl:when test="contains($content,'-')">
        <xsl:value-of select="substring-before($content,'-')"/>
        <xsl:text>&#8211;</xsl:text>
        <xsl:call-template name="dashes">
           <xsl:with-param name="content"
                           select="substring-after($content,'-')"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$content"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

I hope this helps.

. . . . . . . . Ken

--
Contact us for world-wide XML consulting and instructor-led training
Free 5-hour lecture: http://www.CraneSoftwrights.com/links/udemy.htm
Crane Softwrights Ltd.            http://www.CraneSoftwrights.com/s/
G. Ken Holman                   mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
Google+ profile: https://plus.google.com/116832879756988317389/about
Legal business disclaimers:    http://www.CraneSoftwrights.com/legal

Current Thread