I've begun work on handling the CLASS attributes a *slightly* better way
than I described in my previous note:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:css="http://www.csl.com/css"
exclude-result-prefixes="css">
<css:stylesheet>
<rule selector="span.note">font-weight: bold;</rule>
<rule selector="span.normal">font-weight: normal;</rule>
</css:stylesheet>
.
.
.
<xsl:template name="process-class">
<xsl:param name="element"/>
<xsl:param name="class"/>
<xsl:variable name="selector">
<xsl:choose>
<xsl:when test="$class">
<xsl:value-of select="concat($element, '.',
$class)" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$element" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="rule"
select="document('')/xsl:stylesheet/css:stylesheet/rule[(_at_)selector =
$selector]" />
<xsl:if test="$rule">
<xsl:attribute name="style"><xsl:value-of select="$rule"
/></xsl:attribute>
</xsl:if>
</xsl:template>
(The code above is in the XSL stylesheet that I use prior to Xhtml2fo.xsl.)
The process-class template replaces:
<p><span class="note">Programmers:</span> Do this.</p>
with
<p><span class="note" style="font-weight: bold;">Programmers:</span> Do
this.</p>
Some limitations:
- Only one selector per rule: I'd like to be able to specify something like
selector="span.note, span.object, span.name", so the same attributes can
apply to many classes, as they do in a CSS file.
- The rules don't cascade (I'm less upset about this).
- This syntax doesn't yet handle "behaviors" (although I'm thinking that I
could add a "template" attribute to the <rule> tag, that I could use in the
process-class template to call a named template that would do the necessary
processing).
I'd welcome advice on any of this.
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list