<xsl:template match="catalog">
<head>
<title><xsl:value-of select="category"/></title>
</head>
<body>
<h1><xsl:value-of select="category"/></h1>
<xsl:apply-templates select="composer"/>
<hr/>
Copyright <xsl:value-of select="copyright"/><br/>
Last Modified: <xsl:value-of select="last_updated"/><br/>
<xsl:apply-templates select="maintainer"/>
</body>
</xsl:template>
<xsl:template match="composer">
<h2><xsl:value-of select="name"/></h2>
<xsl:apply-templates select="../composition[@composer=current()/@id]"/>
</xsl:template>
.. selects the parent element
/ selects a child of the context node
Square braces [] include a predicate to winnow down the
selected nodes
The current() function refers to the matched composer element
@composer() and @id
take the value of the composer attribute and the id
attribute
The = operator compares the to attributes