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

Re: [xsl] Parsing text nodes


Subject: Re: [xsl] Parsing text nodes
From: Mike Moran <Mike.Moran@xxxxxxxxxxx>
Date: Tue, 23 Jan 2001 13:41:14 +0000

Martynas Lelevicius wrote:
> 
> Hi,
> 
> I have such XML document:
> 
> <rootNode>
>     <line>
>         <coords>73, 49; 203, 117;</coords>
>     </line>
>     <line>
>         <coords>0, 0; 25, 60; 25, 120; 203, 120;</coords>
>     </line>
>     <line>
>         <coords>73, 30; 235, 30; 235, 107;</coords>
>     </line>
> </rootNode>
> 
> How can I process each (and all) pairs of coordinates? Coordinates are
> separated with semicolo and number of pairs in line can vary.
> ...
> <xsl:for-each select="/rootNode/line">
> <!-- What should go here to process line coordinates -->
> </xsl:for-each>

I would use co-recursive templates on the text nodes and
substring-before. Something like this:

<xsl:template name="left">
  <xsl:param name="sofar"/>
  <xsl:text>(</xsl:text>
  <xsl:value-of select="substring-before($sofar, ',')"/>
  <xsl:call-template name="right">
     <xsl:with-param name="sofar"
                     select="substring-after($sofar, ',')"/>
  </xsl:call-template>
</xsl:template>

<xsl:template name="right">
  <xsl:param name="sofar"/>
  <xsl:value-of select="substring-before($sofar, ';')"/>
  <xsl:text>)</xsl:text>
  <xsl:call-template name="left">
     <xsl:with-param name="sofar"
                     select="substring-after($sofar, ';')"/>
  </xsl:call-template>
</xsl:template>

The syntax is probably a bit wrong, and you'd need to put in a 
terminating condition, but I hope you get the idea. You would call the
left template first with the text() as the "sofar" paramater.

-- 
Mike.Moran@xxxxxxxxxxx 
                   Web: http://houseofmoran.com/
               AvantGo: http://houseofmoran.com/Lite/

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



Current Thread
Keywords
xml