Честно говоря, я не понимаю, зачем вам генерировать id, если эти имена уникальны, тогда достаточно сделать, например,
<xsl:for-each select="testresults/test/step">
<tr>
<td bgcolor="#F2F5A9">
<a href="#{concat(parent::test/@testname, '_', @stepname)}">
<xsl:value-of select="@stepname" />
</a>
</td>
</tr>
</xsl:for-each>
</table>
<h2>Test Results</h2>
<xsl:for-each select="testresults/step/drilldown/taskresults/testResults/test">
<h3>
<a name="{@testname}">
<xsl:value-of select="@testname" />
</a>
</h3>
</xsl:for-each>
.
Если вы хотите использовать generate-id тогда имеет смысл, только если вы примените его к тому же узлу.
[править] Если вы хотите использовать generate-id, добавьте <xsl:key name="k1" match="testresults/step/drilldown/taskresults/testResults/test" use="@testname"/>
в качестве дочернего элемента элемента xsl: stylesheet, затем изменитеваш код например
<xsl:for-each select="testresults/test/step">
<tr>
<td bgcolor="#F2F5A9">
<a href="#{generate-id(key('k1', concat(parent::test/@testname, '_', @stepname)))}">
<xsl:value-of select="@stepname" />
</a>
</td>
</tr>
</xsl:for-each>
</table>
<h2>Test Results</h2>
<xsl:for-each select="testresults/step/drilldown/taskresults/testResults/test">
<h3>
<a name="{generate-id()}">
<xsl:value-of select="@testname" />
</a>
</h3>
</xsl:for-each>