RE: [xsl] Re: preserving html tags

Subject: RE: [xsl] Re: preserving html tags
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 1 Nov 2006 17:56:53 -0000
Normally the answer would be to copy the content using copy-of rather than
value-of to retain the tree structure. But trimming the text while retaining
the tree structure is a bit more of a challenge. It needs a recursive walk
of the subtree, passing the length of text processed so far as a parameter
to each template, and terminating when this length reaches your threshold.

Or you could approximate by doing this only one level deep, which is a fair
bit easier.

Concerning your title, you really need to understand that there are no tags
involved here. You are processing a tree of element and text nodes, and you
won't solve the problem unless you understand it in those terms.

Michael Kay
http://www.saxonica.com/

> -----Original Message-----
> From: Karl [mailto:call14@xxxxxxxxx] 
> Sent: 01 November 2006 16:51
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Re: preserving html tags
> 
> My problem is related to rendering html content like 
> "content<b>bold</b>...contents" as it in xml into the output 
> html. I am using <apply-templates> to select content but 
> later use <value-of> to trim it. Suspect <value-of> removing 
> the html tags (not sure), but are there any other way to get 
> proper results?
>  
> Basically my xml looks something like
> 
> 		<Introduction>
> 			<Title>Introduction</Title>
> 			<Paragraph>In this session we 
> <sub>this</sub><b>Bold</b> take a closer look at what is 
> meant by strategy. The classical approach to strategic 
> management  ... big para content
>  			</Paragraph>
>  			<Paragraph/>
> 		</Introduction>
> 		<Section/>
> 
> I am trying to output 1st para of certain elements & limit 
> the para content to certain char limit. so, in my xsl 
> 
> 		<xsl:for-each select="//Introduction | 
> //Session/Section/SubSection | //References | //Acknowledgements">
> 			<xsl:variable name="titleContent">	
> 			
> 				<xsl:value-of select="name()"/>
> 			</xsl:variable>
> 			<xsl:variable name="paraContent">
> 				<xsl:if test=".//Paragraph[1] 
> and (name() = 'SubSection' or
> name() = 'Introduction')">
> 					<xsl:apply-templates 
> select=".//Paragraph[1]"/>
> 				</xsl:if>
> 			</xsl:variable>
> 			<p class="paradefault">
> 				<xsl:call-template name="trimPara">
> 					<xsl:with-param 
> 
> name="stringLenRequired">200</xsl:with-param>
> 					<xsl:with-param 
> name="stringInput" 
> 
> select="$paraContent"/>
> 				</xsl:call-template>
> 			</p>
> 		</xsl:for-each>
> 
> and then ...
> 
> 	<xsl:template name="trimPara">
> 		<!-- pass the string to be cropped with 
> required string length -->
> 		<xsl:param name="stringLenRequired"/>
> 		<xsl:param name="stringInput"/>
> 		<xsl:value-of 
> 
> select="substring($stringInput,1,number($stringLenRequired))"/>
> 		<xsl:value-of 
> 
> select="substring-before(concat(substring($stringInput,number(
> $stringLenRequired)+1,number($
> 
> stringLenRequired) +20),' ' ),' ')"/> <!-- to make it a full word -->
> 		<xsl:if test="string-length($stringInput) > 
> 
> number($stringLenRequired)">...</xsl:if>
> 	</xsl:template>
> 
> 
> This results in an html output having no <b>, <sup> or any 
> other html tags - while the content within them gets thro. I 
> dont know where those html tags gets striped. Pls let me know 
> how can this be fixed.
> 
> Thanks in adv.
> karl
> 
> Send instant messages to your online friends 
> http://uk.messenger.yahoo.com 

Current Thread
  • [xsl] Re: preserving html tags
    • Karl - Wed, 1 Nov 2006 16:50:45 +0000 (GMT)
      • Michael Kay - Wed, 1 Nov 2006 17:56:53 -0000 <=
      • <Possible follow-ups>
      • Karl - Thu, 2 Nov 2006 12:19:34 +0000 (GMT)