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(_at_)yahoo(_dot_)com]
Sent: 01 November 2006 16:51
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--