xsl-list
[Top] [All Lists]

Re: variables and inline tags

2005-05-04 14:19:35
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>,&#160;<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>&#160;<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>
--~--



<Prev in Thread] Current Thread [Next in Thread>