[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

RE: [xsl] Combination of normalize-space() and apply-templates


Subject: RE: [xsl] Combination of normalize-space() and apply-templates
From: Jarno.Elovirta@xxxxxxxxx
Date: Thu, 26 Feb 2004 12:42:09 +0200

Hi,

> I am using xsltroc (from libxslt 1.1.0). When I m trying to normalize
> the space in certain elements, I got stuck since I couldn't 
> figure out,
> how to apply normalize-space() and apply templates for 
> elements within a
> node. Example:
> 
> <document>
>  <para>Some text, that is
>  wrapped several times, but
>  should be one line in the
>  output document. And which
>  has -- to make it tricky --
>  some Elements <emp>within</emp>
>  which should also be processed.
>  </para>
> <document>
> 
> If I write a template like this:
> 
> <xsl:template match="document">
>  <xsl:apply-templates select="normalize-space(para)" />
> </xsl:template>
> 
> It doesn't work. But if I do it this way:
> 
> <xsl:template match="document">
>  <xsl:apply-templates select="para" />
> </xsl:template>
> 
> <xsl:template match="para">
>  <xsl:value-of select="normalize-space(para)" />
> </xsl:template>
> 
> It worked, but the inline element won't get processed.

Did you want something in the lines of

  <xsl:template match="para/text()">
    <xsl:if test="preceding-sibling::node()">
      <xsl:text> </xsl:text>
    </xsl:if>
    <xsl:value-of select="normalize-space()"/>
    <xsl:if test="following-sibling::node()">
      <xsl:text> </xsl:text>
    </xsl:if>
  </xsl:template>
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

Cheers,

Jarno - Chris C: The Zurich Mix <http://mp3.hardnrg.com/chrisc/ChrisC-The_Zurich_Mix-June_2003.mp3>

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



Current Thread