Long ago I had a requirement to work with XML, where eventually I got a need to apply stylesheet for them. I am sharing my experience on how I implemented XSL if else condition by using choose and otherwise elements.
Requirement: Check whether a node has attributes or it has a string.
Example showing : One of the nodes has 0 File(s) found
and the other has attributes such as
<autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='64' filename='AFP_p.tgp' />
Below is a sample of two nodes
<product> <autoIncludeUser>0 File(s) found</autoIncludeUser> <autoIncludeSystem> <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='64' filename='AFP_p.tgp' /> <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='3,879' filename='AnalystsExpressionMacros.tgp' /> <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='475' filename='base64Converter.tgp' /> <autoincludesystem_info mdate='08/23/2011' mtime='09:51' ampm='PM' filesize='<DIR>' filename='codePages' /> </autoIncludeSystem> <autoIncludeStudio>0 File(s) found</autoIncludeStudio> <externalLibrarySystem> <externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='196,608' filename='AFPtoXML_DP.dll' /> <externalLibrarySystem_info mdate='08/23/2011' mtime='09:52' ampm='PM' filesize='13,259' filename='ASN1toXSDRunner.jar' /> </externalLibrarySystem> </product>
How would I identify if a node has just strings or attributes and based on that how can I get the values either String
or attribute
respectively.
Solution: This is how we can achieve XSL if else condition.
<xsl:choose> <xsl:when test="something to test"> </xsl:when> <xsl:otherwise> </xsl:otherwise> </xsl:choose>
So here is what I ended up doing
<h3>System</h3> <xsl:choose> <xsl:when test="autoIncludeSystem/autoincludesystem_info/@mdate"> <!-- if attribute exists--> <dd> <table border="1"> <tbody> <tr> <th>File Name</th> <th>File Size</th> <th>Date</th> <th>Time</th> <th>AM/PM</th> </tr> <xsl:for-each select="autoIncludeSystem/autoincludesystem_info"> <tr> <td valign="top" ><xsl:value-of select="@filename"/></td> <td valign="top" ><xsl:value-of select="@filesize"/></td> <td valign="top" ><xsl:value-of select="@mdate"/></td> <td valign="top" ><xsl:value-of select="@mtime"/></td> <td valign="top" ><xsl:value-of select="@ampm"/></td> </tr> </xsl:for-each></tbody> </table> </dd> </xsl:when> <xsl:otherwise> <!-- if attribute does not exists --> <dd> <pre> <xsl:value-of select="autoIncludeSystem"/> </pre> </dd> </xsl:otherwise> </xsl:choose>
Output:
I am not saying that this is the best way to solve, but this is how I implemented XSL If Else condition.
0 Comments