Working with Both xsl:if and xsl:choose in XSLT - Nesting xsl:if within another
(Page 2 of 6 )
In the previous section, I already introduced "xsl:if." And now, I want to nest "xsl:if" within another and make things a bit complicated. To do that, we may have to modify our business need.
Let us modify our business need in such a way that I would like to have all the employee details listed with:
- salary in red, if earnings are more than 4000
- salary in blue, if earnings are more than 3000 and less than 4000
- salary must not be shown for the employees working in department 10
The entire XSLT code for the above business need is as follows:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<table border="1">
<xsl:apply-templates select="SQLData/Rows" />
</table>
</xsl:template>
<xsl:template match="SQLData/Rows">
<tr>
<td>
<xsl:value-of select="Empno"/>
</td>
<td>
<xsl:value-of select="Ename"/>
</td>
<xsl:apply-templates select="Sal" />
<td>
<xsl:value-of select="Deptno"/>
</td>
</tr>
</xsl:template>
<xsl:template match="Sal">
<xsl:if test="./following::Deptno[1]/text() != '10'">
<xsl:if test="text() > '4000'">
<td style="color: red">
<xsl:value-of select="."/>
</td>
</xsl:if>
<xsl:if test="text() > '3000' and text() < '4000'">
<td style="color: blue">
<xsl:value-of select="."/>
</td>
</xsl:if>
<xsl:if test="text() > '0' and text() < '3000'">
<td>
<xsl:value-of select="."/>
</td>
</xsl:if>
</xsl:if>
<xsl:if test="./following::Deptno[1]/text() = '10'">
<td>
NA
</td>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
When the above code gets executed, you are likely to get the following transformation:
<table border="1">
<tr>
<td>1001</td>
<td>Jag</td>
<td>
NA
</td>
<td>10</td>
</tr>
<tr>
<td>1002</td>
<td>Chat</td>
<td>2800</td>
<td>20</td>
</tr>
<tr>
<td>1003</td>
<td>Winner</td>
<td>
NA
</td>
<td>10</td>
</tr>
<tr>
<td>1004</td>
<td>Dhan</td>
<td style="color: red">5000</td>
<td>20</td>
</tr>
</table>
Within the above XSLT code, the most confusing issue will be the following:
xsl:if test="./following::Deptno[1]/text() != '10'">
That tests whether the next sibling node named "Deptno" does or does not equal 10. If you are new to this, I suggest you to refer my second article in this series.
Next: Nesting xsl:choose within xsl:if >>
More ASP.NET Articles
More By Jagadish Chaterjee