Re: [xsl] super basic xsl question

Subject: Re: [xsl] super basic xsl question
From: JBryant@xxxxxxxxx
Date: Thu, 13 Jan 2005 13:28:25 -0600
Hi, Jeb,

The way to block the default rule is <xsl:template 
match="elementToBlock"/>.

So, in your example, you'd want:

<xsl:template match="node">
   <h1><xsl:value-of select="description"/></h1>
   <ul><xsl:apply-templates/><ul>
</xsl:template>

<xsl:template match="datum">  <!-- note the change here, too - JB -->
  <li><xsl:value-of select="."/></li>
</xsl:template>

<xsl:template match="description"/>

Then you can stop using <xsl:template match="text()"/>.

HTH

Jay Bryant
Bryant Communication Services
(on contract at Synergistic Solution Technologies)





Jeb Boniakowski <jeb@xxxxxxxxxxx> 
01/13/2005 12:10 PM
Please respond to
xsl-list@xxxxxxxxxxxxxxxxxxxxxx


To
xsl-list@xxxxxxxxxxxxxxxxxxxxxx
cc

Subject
Re: [xsl] super basic xsl question






Wendell--

Thanks for the reply.  This is the kind of info I'm having a hard time 
getting from like w3schools.com, etc.

In this particular case, though, I want the template that matches the 
value of <child> to be agnostic to the markup that is in there, with no 
more template processing, I just want whatever was already done (by 
this point, that chunk of xml has been processed by other sheets, and 
will be processed by later sheets) so I didn't want to do an explicit 
match for the link tag.

In general though, on the topic of apply-templates, there is a larger 
issue that trips me up.  Oftentimes, it seems that I mess up my set of 
templates in such a way that things get matched and copied to the 
output tree automatically, even though they are matched.  To deal with 
this, I've been sticking a template at the top of my sheets that is:

<xsl:template match="text()"/>

Is this bad style?  Is it a crappy hack to deal with messed up 
templates?  Or is it the correct way to suppress default rules?

I have situations where I have things along the lines of:

<node>
   <description>Foo</description>
   <datum>1</datum>
   <datum>2</datum>
</node>

When I do something like:

<xsl:template match="node">
   <h1><xsl:value-of select="description"/></h1>
   <ul><xsl:apply-templates/><ul>
</xsl:template>

<xsl:template match="node/datum">
  <li><xsl:value-of select="."/></li>
</xsl:template>

I end up with:

<h1>Foo</h1>
Foo  <!-- Extraneous foo that I don't want -->
<ul>
  <li>1</>
  <li>2</2>
</ul>

Tacking a <xsl:template match="text()"/> seems to catch the 'Foo' and 
kill it, but why do I have to do this?  Does the <apply-templates/> in 
node automatically copy the text values of any child nodes that are not 
explicitly matched?  If so, why?  Is it better to have an additional 
template that specifically matches 'description' and does nothing?  Or 
to take the <h1><xsl:value-of select="description"/></h1> out and move 
it into this explicit template? Or should I be doing something more 
like <xsl:apply-templates select="datum"/>?

Again, thanks.

jeb.

Current Thread