Sample XSLT File for Navigating XPath Axes
A subset of this file is used in each topic for XPath navigation axes.
XSLT File (orgchart.xsl)
<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- Common template rule (suppresses all text nodes not explicitly covered in succeeding template rules) --> <xsl:template match="text()"/> <!-- Parent axis --> <xsl:template match="director[name='Michelle Votava']"> <table border="1"> <tr> <th>Attribute name</th> <th>Attribute value</th> <th>Parent name</th> <th>Parent value</th> </tr> <xsl:for-each select="attribute::*"> <tr> <td><xsl:value-of select="name()"/></td> <td><xsl:value-of select="."/></td> <td><xsl:value-of select="name(parent::*)"/></td> <td><xsl:value-of select="parent::*"/></td> </tr> </xsl:for-each> </table> </xsl:template> <!-- Ancestor axis --> <xsl:template match="*[name='Peter Porzuczek']"> <h2>Peter Porzuczek's superiors:</h2> <xsl:for-each select="ancestor::*"> <h4><xsl:value-of select="name"/></h4> </xsl:for-each> </xsl:template> <!-- Following axis --> <xsl:template match="name[.='Katie McAskill-White']"> <h2>Katie McAskill-White's followers:</h2> <xsl:for-each select="following::*/name"> <h4><xsl:value-of select="."/></h4> </xsl:for-each> </xsl:template> <!-- Preceding axis --> <xsl:template match="name[.='John Tippett']"> <table border="1"> <tr> <th>Node name</th> <th>Node value</th> </tr> <xsl:for-each select="preceding::*"> <xsl:variable name="bgcolor"> <xsl:choose> <xsl:when test="name()='name'">yellow</xsl:when> <xsl:otherwise>white</xsl:otherwise> </xsl:choose> </xsl:variable> <tr> <xsl:attribute name="style">background-color: <xsl:value-of select="$bgcolor"/> </xsl:attribute> <td> <xsl:value-of select="name()"/> </td> <td> <xsl:value-of select="."/> </td> </tr> </xsl:for-each> </table> </xsl:template> <!-- Following-sibling axis --> <xsl:template match="name[.='Shelly Szymanski']"> <xsl:if test="following-sibling::*"> <h2>following-siblings of <name> '<xsl:value-of select="."/>'</h2> <table border="1"> <tr> <th>Node name</th> <th>Node value</th> </tr> <xsl:for-each select="following-sibling::*"> <tr> <td><xsl:value-of select="name()"/></td> <td><xsl:value-of select="."/></td> </tr> </xsl:for-each> </table> </xsl:if> </xsl:template> <!-- Preceding-sibling axis --> <xsl:template match="chairman"> <xsl:if test="preceding-sibling::node()"> <h2>preceding-siblings of '<xsl:value-of select="name"/>'</h2> <table border="1"> <tr> <th>Node name</th> <th>Node value</th> </tr> <xsl:for-each select="preceding-sibling::node()"> <tr> <td><xsl:value-of select="name()"/></td> <td><xsl:value-of select="."/></td> </tr> </xsl:for-each> </table> </xsl:if> <xsl:apply-templates/> </xsl:template> <!-- Attribute axis (note: two template rules) --> <xsl:template match="/"> <html> <head><title>Employee Info</title></head> <body> <table border="1"> <tr> <th>Name</th> <th>Emp ID</th> <th>Empl Date</th> </tr> <xsl:apply-templates /> </table> </body> </html> </xsl:template> <xsl:template match="name"> <tr> <td><xsl:value-of select="."/></td> <td><xsl:value-of select="parent::*/attribute::empID"/></td> <td><xsl:value-of select="parent::*/attribute::empdate"/></td> </tr> </xsl:template> <!-- Self axis --> <xsl:template match="president[division='International']"> <xsl:for-each select="descendant::name"> <h2><xsl:value-of select="self::*"/></h2> </xsl:for-each> </xsl:template> <!-- Descendant-or-self axis --> <xsl:template match="name[.='Steve Masters']"> <h2>Steve Masters and descendant elements:</h2> <table border="1"> <tr> <th>Name</th> <th>Emp ID</th> <th>Empl Date</th> </tr> <xsl:for-each select="parent::*/descendant-or-self::name"> <tr> <td><xsl:value-of select="."/></td> <td><xsl:value-of select="parent::*/@empID"/></td> <td><xsl:value-of select="parent::*/@empdate"/></td> </tr> </xsl:for-each> </table> </xsl:template> <!-- Ancestor-or-self axis --> <xsl:template match="name[.='Josh Barnhill']"> <h2>Josh Barnhill's reporting structure:</h2> <table border="1"> <tr> <th>Generation</th> <th>Name</th> <th>Emp ID</th> <th>Empl Date</th> </tr> <xsl:for-each select="ancestor-or-self::*[name()!='name']"> <tr> <td align="center"> <xsl:value-of select="position()-last()"/> </td> <td><xsl:value-of select="name"/></td> <td><xsl:value-of select="@empID"/></td> <td><xsl:value-of select="@empdate"/></td> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet>