|
Subject: Re: [xsl] dynamically generating css From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Tue, 31 Aug 2004 14:05:31 +0100 |
Hi Bruce,
> I'm making progress on this, but I'm stuck in only get one element
> output.
The problem here is that the second element that you want to output
is nested two levels within the <cs:reftype> element, but you're only
selecting the *children* of the <cs:reftype> element with:
<xsl:for-each select="$style/*[@font-style | @font-weight]">
...
</xsl:for-each>
What I suggest is that you turn your stylesheet inside-out. Instead of
working from the top down to the elements that you want to create
styles for, work from those elements up to their ancestor <cs:reftype>
element in order to create the CSS class names.
Something like:
<xsl:template match="cs:citationstyle" name="css">
<xsl:apply-templates select="cs:*" mode="css" />
</xsl:template>
<xsl:template match="cs:reftype//cs:*" mode="css">
<xsl:variable name="styles" as="attribute()*"
select="@* except (@before, @after)" />
<xsl:if test="$styles">
<xsl:text>..</xsl:text>
<!-- apply templates in css-name mode to get the class name -->
<xsl:apply-templates select="." mode="css-name" />
<xsl:text> {
</xsl:text>
<xsl:apply-templates select="$styles" mode="css" />
<xsl:text>}

</xsl:text>
</xsl:if>
<xsl:apply-templates select="cs:*" mode="css" />
</xsl:template>
<!-- To get the class name for an element, get the class name for its
parent, add a "-" as a separator, and then add the name of the
element itself. -->
<xsl:template match="cs:*" mode="css-name">
<xsl:apply-templates select=".." mode="css-name" />
<xsl:text>-</xsl:text>
<xsl:value-of select="name()" />
</xsl:template>
<!-- The base class name is the value of the name attribute on the
<cs:reftype> element. When we get to the <cs:reftype> element, we
stop recursing up the tree. -->
<xsl:template match="cs:reftype" mode="css-name">
<xsl:value-of select="@name" />
</xsl:template>
<xsl:template match="@*" mode="css">
<xsl:value-of select="name()" />
<xsl:text>: </xsl:text>
<xsl:value-of select="." />
<xsl:text>;
</xsl:text>
</xsl:template>
Note that using <xsl:text> and 
 (the newline character) allows
you to control what whitespace makes it to the output, which means you
can make the code more readable: you don't have to actually insert a
newline to create a newline, or avoid indenting your code because you
don't want whitespace to appear in the output.
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] dynamically generating css, Bruce D'Arcus | Thread | [xsl] Replacing values, David Sinclair |
| Re: [xsl] variable question, Bruce D'Arcus | Date | RE: [xsl] how to sort by different , Shen, Ching |
| Month |