Link to home
Start Free TrialLog in
Avatar of Smanyx
Smanyx

asked on

xslt - problem displaying variable (node) values in a table

Hi Experts,

I have the following xml file:
<?xml version="1.0" encoding="UTF-8"?>
<?xsl:stylesheet type="text/xsl" href="Employees.xsl"?>

 <Employees>
     <Employee id="1">
         <age>42</age>
         <name>Martina</name>
         <gender>Female</gender>
         <role>Cashier</role>
       <distance unit="m">1300.0</distance>
     </Employee>
       <Employee id="2">
         <age>30</age>
         <name>Soletho</name>
         <gender>Male</gender>
         <role>Tester</role>
       <distance unit="m">7203.5</distance>
     </Employee>
       <Employee id="3">
         <age>19</age>
         <name>Tom</name>
         <gender>Male</gender>
         <role>Manager</role>
       <distance unit="m">9042.0</distance>
     </Employee>
     <Employee id="4">
         <age>25</age>
         <name>Meghna</name>
         <gender>Female</gender>
         <role>Clerk</role>
       <distance unit="m">4100.0</distance>
     </Employee>
       <Employee id="5">
         <age>42</age>
         <name>Martha</name>
         <gender>Female</gender>
         <role>Cashier</role>
       <distance unit="m">3000.0</distance>
     </Employee>
       <Employee id="6">
         <age>31</age>
         <name>Sindrathi</name>
         <gender>Male</gender>
         <role>Tester</role>
       <distance unit="m">2300.5</distance>
     </Employee>
       <Employee id="7">
         <age>19</age>
         <name>Timothy</name>
         <gender>Male</gender>
         <role>Manager</role>
       <distance unit="m">13950.0</distance>
     </Employee>
     <Employee id="8">
         <age>25</age>
         <name>Solange</name>
         <gender>Female</gender>
         <role>Clerk</role>
       <distance unit="m">9975.0</distance>
     </Employee>
 </Employees>

I want to display the information about the high performing employee at the corporate athletics/running event.

Here is what my xslt file looks like:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h1>Top Runner</h1>
        <table border="1">
          <tr bgcolor="#4000FF">
            <th>Age</th>
            <th>Name</th>
            <th>Gender</th>
            <th>Role</th>
            <th>Distance</th>
           </tr>
         
          <xsl:variable name="top_runner" select="/Employees/Employee[not(number(distance) &lt; ../Employee/distance)]/*" />
          <xsl:for-each select="$top_runner" >
          <tr>
                <td>
                  <xsl:value-of select="Age" />
                </td>
                <td>
                  <xsl:value-of select="Name" />
                </td>
               <td>
                  <xsl:value-of select="Gender" />
                </td>
                <td>
                  <xsl:value-of select="Role" />
                </td>
                <td>
                  <xsl:value-of select="Distance" />
                </td>
           </tr>
          </xsl:for-each>          
         </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Using the xpath expression, I do the sorting and attribute the high performing employee to the variable top_runner.
I want to be able to display the information in the variable in a table.
So far, I only get the header ...
I am surely missing something but I'm not sure what !
I'm quite new to xpath and xslt, altogether so would much appreciate your help.

Thanks.
Smanyx
Avatar of Gertone (Geert Bormans)
Gertone (Geert Bormans)
Flag of Belgium image

two comments

- element names in XML are case sensitive
- in the variable you had the level wrong

you are trying to find "Age" as a child of a child of Employee
but you should b elooking for "age" as a direct child of Employee

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <html>
            <body>
                <h1>Top Runner</h1>
                <table border="1">
                    <tr bgcolor="#4000FF">
                        <th>Age</th>
                        <th>Name</th>
                        <th>Gender</th>
                        <th>Role</th>
                        <th>Distance</th>
                    </tr>
                    
                    <xsl:variable name="top_runner" select="/Employees/Employee[not(number(distance) &lt; ../Employee/distance)]" />
                    <xsl:for-each select="$top_runner" >
                        <tr>
                            <td>
                                <xsl:value-of select="age" />
                            </td>
                            <td>
                                <xsl:value-of select="name" />
                            </td>
                            <td>
                                <xsl:value-of select="gender" />
                            </td>
                            <td>
                                <xsl:value-of select="role" />
                            </td>
                            <td>
                                <xsl:value-of select="distance" />
                            </td>
                        </tr>
                    </xsl:for-each>          
                </table>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of Gertone (Geert Bormans)
Gertone (Geert Bormans)
Flag of Belgium image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Smanyx
Smanyx

ASKER

Thank you. Much appreciated.