This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Parsing text nodes
- To: xsl-list at lists dot mulberrytech dot com
- Subject: Re: [xsl] Parsing text nodes
- From: Mike Moran <Mike dot Moran at ee dot ed dot ac dot uk>
- Date: Tue, 23 Jan 2001 13:41:14 +0000
- Organization: The University of Edinburgh, Department of Electronics and Electrical Engineering
- References: <008501c0853d$a30d9710$45be16c3@kovas>
- Reply-To: xsl-list at lists dot mulberrytech dot com
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@ee.ed.ac.uk
Web: http://houseofmoran.com/
AvantGo: http://houseofmoran.com/Lite/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list