Re: [xsl] Adding a class to HTML's class attribute

Subject: Re: [xsl] Adding a class to HTML's class attribute
From: "Abel Braaksma (online)" <abel.online@xxxxxxxxx>
Date: Wed, 8 Aug 2007 20:05:53 +0200 (CEST)
> Hello,
>
> I have a HTML which transformed with XSL. It contains tags like these
>
> 1. <li class="foo"></li>
> 2. <li></li>
>
> I want to add a certain class to the attributes:
>
> 1. <li class="foo bar"></li>
> 2. <li class="bar"></li>
>
> Anybody with a smart solution? The only (dump but simple) solution I
> have in my mind is to use <xsl:choose> to handle the different cases.
>

No, xsl:choose is almost never a good solution. Here's one approach, which is
usually the best if input and output look alike: the copy idiom:

<xsl:template match="node() |@*">
   <xsl:copy>
      <xsl:apply-templates select="node() | @*">
   </xsl:copy>
</xsl:template>

<xsl:template match="li/@class">
   <xsl:attribute name="class">
      <xsl:value-of select=".">
      <xsl:text> bar</xsl:text>
   </xsl:attribute>
</xsl:template>


That will do what you want.

Cheers,
-- Abel Braaksma


PS: whenever you are trying a solution and you find yourself doing
'traditional' style programming from you Perl/C++/PHP/VB/Java days (i.e.:
imperative programming) with things like many xsl:if / xsl:choose /
xsl:for-each to instruct your processor, you should try to turn the logic
around, like in the example above (define matching templates and let the
processor do the math for you instead of the other way around)

Current Thread