Re: [xsl] variables and inline tags

Subject: Re: [xsl] variables and inline tags
From: Spencer Tickner <spencertickner@xxxxxxxxx>
Date: Wed, 4 May 2005 15:09:14 -0700
Hi Guys,

Thanks for the great feed-back. It took a bit to figure out how to
modify your template to work in my context (I was matching text-nodes
to remove excess whitespace around inline tags), but I got her working
so thanks for comming through once again.

Cheers,

Spencer

On 5/4/05, Wendell Piez <wapiez@xxxxxxxxxxxxxxxx> wrote:
> 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@xxxxxxxxxxxxxxxx
> 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
> ======================================================================

Current Thread