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
Web Languages and StandardsXMLWeb Development

Avatar of undefined
Last Comment
Smanyx

8/22/2022 - Mon
Gertone (Geert Bormans)

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
Gertone (Geert Bormans)

THIS SOLUTION ONLY AVAILABLE TO MEMBERS.
View this solution by signing up for a free trial.
Members can start a 7-Day free trial and enjoy unlimited access to the platform.
See Pricing Options
Start Free Trial
GET A PERSONALIZED SOLUTION
Ask your own question & get feedback from real experts
Find out why thousands trust the EE community with their toughest problems.
Smanyx

ASKER
Thank you. Much appreciated.
I started with Experts Exchange in 2004 and it's been a mainstay of my professional computing life since. It helped me launch a career as a programmer / Oracle data analyst
William Peck