dzmr83
dzmr83

Reputation: 63

How to Add Color To a Div in XSL when Color is in the XML document

I have an XSL 1.0 document with the following:

<div class="workgroup_title">
  <xsl:value-of select="./@name"/>
</div>

I need to set the color for this element. The color is in the XML file

<abc.xyz.color>FF5733</abc.xyz.color>

To get it, I use this:

<xsl:value-of select="./abc.xyz.color"/>

What I would have liked to do is

<div class="workgroup_title" style="color:"#<xsl:value-of select="./abc.xyz.color"/>>
  <xsl:value-of select="./@name"/>
</div>

That's not allowed, though.

Or:

<xsl:attribute style="color:">#<xsl:value-of select="./abc.xyz.color"/></xsl:attribute>

But color is not one of the attributes that can be set like that.

Upvotes: 0

Views: 557

Answers (2)

zx485
zx485

Reputation: 29022

The following templates should suffice your needs:

<xsl:template match="text()" />                      <!-- Removes the text from the <abc.xyz.color>FF5733</abc.xyz.color> element -->

<xsl:template match="/*">                            <!-- Copies the root element and its namespace -->
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template>  

<xsl:template match="div[@class='workgroup_title']"> <!-- Applies the template to the <div> element -->
    <xsl:copy>
        <xsl:attribute name="style"><xsl:value-of select="concat('color: #',../abc.xyz.color,';')"/></xsl:attribute>
        <xsl:copy-of select="node()|@*" />
    </xsl:copy>
</xsl:template>

Its output is:

<root xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <div style="color: #FF5733;" class="workgroup_title">
        <xsl:value-of select="./@name"/>
    </div>
</root>

Upvotes: 1

Martin Honnen
Martin Honnen

Reputation: 167571

You can use attribute value templates to compute (parts of) the value of a literal result element: <div style="color: #{abc.xyz.color}">...</div>

Upvotes: 1

Related Questions