Davi Lima
Davi Lima

Reputation: 769

How can I insert a Diazo theme parameter into some theme's class attribute?

I want to replace a class tag attribute in my static theme on-the-fly, based on a theme parameter.

I tried this:

<replace attributes="class" css:theme=".conteudo">conteudo-$section</replace>

And this:

<replace css:theme=".conteudo">
    <xsl:attribute name="class">conteudo-$section</xsl:attribute>
    <xsl:value-of select="."/> 
</replace>

And even this:

<xsl:template match="//div[contains(concat(' ', normalize-space(@class), ' '), ' conteudo ')]">
    <xsl:attribute name="class">
        <xsl:value-of select="substring((body/@class), 'section-', 0)" />
    </xsl:attribute>
</xsl:template>

Since I also have other rules referencing .conteudo element, it'd be also nice to get to know best practices on how to deal with those (after the desired transformation occurs), ie:

<replace
    css:content-children="#portal-column-content"
    css:theme-children=".conteudo" />

Upvotes: 2

Views: 575

Answers (2)

ebrehault
ebrehault

Reputation: 2601

As David said, is the right way to do it. And to set the attributes before the child elements, you have to do that:

<xsl:template match="//*[contains(@class, 'conteudo')]">
    <xsl:copy>
        <xsl:attribute name="class"><xsl:value-of select="$section" /></xsl:attribute>
        <xsl:apply-templates select="@*[not(name()='class')]|node()" />
    </xsl:copy>
</xsl:template>

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

Upvotes: 1

David Glick
David Glick

Reputation: 5432

You can't reference a variable just anywhere, but need to do so from an XPath expression.

You can avoid interfering with your replacement of the children nodes by inserting the attribute "before" the children.

Here's what I would try:

<before css:theme-children=".conteudo">
    <xsl:attribute name="class">conteudo-<xsl:value-of select="$section" /></xsl:attribute>
</before>

Upvotes: 1

Related Questions