Subject: [xsl] Re: Angle brackets and string manipulation From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx> Date: Mon, 10 Mar 2003 06:45:08 +0100 |
> > Basic problem is that I had to resort to the always infamous > disable-output-escaping to substitute a <br /> for a marker character(s) > in a text() node string. Did I happen upon an actual valid use of > d-o-e, or am I missing better way to do this? There is a better way. > <xsl:template match="text()"> > > <!-- use a variable to allow additional substring substitions > not shown to simplify --> > <xsl:variable name="t1"> > <xsl:call-template name="insert_breaks"> > <xsl:with-param name="source_string" select="."/> > <xsl:with-param name="marker" select="'!br;'"/> > </xsl:call-template> > </xsl:variable> The "insert_breaks" template could create <br /> ***nodes*** -- not simply insert text. > <xsl:value-of disable-output-escaping="yes" select="$t1"/> Because the result is immediately copied, the above instruction is not necessary at all -- simply remove it. Also do not define the xsl:variable "t1", but simply call the template to produce its result. <xsl:call-template name="insert_breaks"> <xsl:with-param name="source_string" select="."/> <xsl:with-param name="marker" select="'!br;'"/> </xsl:call-template> > <xsl:template name="insert_breaks"> > > <xsl:param name="source_string" select="."/> > <xsl:param name="marker"/> > > <!-- If $marker is in the $source_string --> > <xsl:if test="contains($source_string,$marker)"> > <!-- then replace it with "<br />" and look for another --> > <xsl:call-template name="insert_breaks"> > <xsl:with-param name="source_string"> > <!-- make the substitution by taking everything before the > marker, insert the br element, and finish with everything > after the break marker --> > <xsl:value-of select="substring-before( $source_string, > $marker )"/> > <xsl:text><br /></xsl:text> > <xsl:value-of select="substring-after( $source_string, > $marker )"/> > </xsl:with-param> > <xsl:with-param name="marker" select="$marker"/> > </xsl:call-template> > </xsl:if> This is creating just text -- should create a sequence of text nodes and "br" elements: <xsl:if test="contains($source_string,$marker)"> <xsl:value-of select="substring-before( $source_string, $marker )"/> <br /> <xsl:call-template name="insert_breaks"> <xsl:with-param name="source_string" select="substring-after( $source_string, $marker )"/"> <xsl:with-param name="marker" select="$marker"/> </xsl:call-template> > > <!-- terminating case where the $marker is not found in the > source string --> > <xsl:if test="not(contains($source_string,$marker))"> > <xsl:value-of select="$source_string"/> > </xsl:if> > > </xsl:template> Hope this helped. ===== Cheers, Dimitre Novatchev. http://fxsl.sourceforge.net/ -- the home of FXSL XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Angle brackets and string man, Steve Rosenberry | Thread | Re: [xsl] Re: Angle brackets and st, Steve Rosenberry |
[xsl] HTML input tag problem and Un, Gia Dinh | Date | [xsl] A proposal:xsl:result-documen, Kurt Cagle |
Month |