Spencer,
The tricky thing here is that to remove the comma without messing with the
other nodes (as you discovered, when you use the value of the <def> its
children aren't processed), you need to get at it all the way down at the
level of the text node. But not just any text node is of interest --
actually it's only those that are the first thing inside a <def>, which
have a comma.
So:
<xsl:template match="def/text()">
<!-- when a text node is inside a def, this template
overrides the built-in template for text nodes,
which simply copies out their values -->
<xsl:when test="not(preceding-sibling::node() and starts-with(.,',')">
<!-- truncates the first character if it's a comma and this text
node has no preceding siblings -->
<xsl:value-of select="substring(., 2)"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:template>
You may have to adjust this match pattern, or even construct a separate
mode, to keep this sufficiently isolated from the way you want most text
nodes to be processed. (I assume you generally don't want to truncate
initial commas in text nodes.) And it will work irrespective of whether the
results are bound to a variable, or simply copied out.
If it's mysterious to you why this works -- like most XSLT mysteries, it
comes back to the processing model (that is, what the processor does when
you say "apply-templates" or let it default to that).
I hope this helps,
Wendell
At 04:52 PM 5/4/2005, you wrote:
Having problems with variables, applying templates and parsing
strings. Been working on it all day and can't seem to wrap my mind
around it.
Here is my simplified xml:
<definition>
<term>recognized</term>
<def>, under the <em>Company Act</em></def>
</definition>
What I need to do is substring the def information when it starts with
a comma, ie:
with comma
<p class="def">"recognized", under the <em>Company Act</em></p>
without comma
<p class="def">"recognized" under the <em>Company Act</em></p>
Ok, there's the background. I'm having problems because I'm using a
variable to parse out the unwanted space in the with comma example
above, then to get the variable I use a value-of statement which
promptly drops the <em> tags. Any suggestions or advive would be
appreciated.
Here's my simplified xsl:
<!-- Defintion -->
<xsl:template match="definition" mode="contentsection">
<p class="def">
<xsl:choose>
<xsl:when test="substring(def, 1, 1)=','">
<strong>"<xsl:apply-templates
select="term"/>"</strong>, <xsl:variable name="uncommadef">
<xsl:apply-templates select="def"/>
</xsl:variable>
<!-- Problem is here -->
<xsl:value-of select="substring($uncommadef, 2)"/>
</xsl:when>
<xsl:otherwise>
<strong>"<xsl:apply-templates
select="term"/>"</strong> <xsl:apply-templates select="def"/>
</xsl:otherwise>
</xsl:choose>
</p>
</xsl:template>
<xsl:template match="term">
<xsl:apply-templates
select="text()|strong|em|sup|sub|u|insert|br|eacute"/>
</xsl:template>
<xsl:template match="def">
<xsl:apply-templates
select="text()|strong|em|sup|sub|u|insert|br|eacute"/>
</xsl:template>
<!-- End of Definition -->
======================================================================
Wendell Piez
mailto:wapiez(_at_)mulberrytech(_dot_)com
Mulberry Technologies, Inc. http://www.mulberrytech.com
17 West Jefferson Street Direct Phone: 301/315-9635
Suite 207 Phone: 301/315-9631
Rockville, MD 20850 Fax: 301/315-8285
----------------------------------------------------------------------
Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================
--~------------------------------------------------------------------
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>
--~--