Итак, вы хотите сгруппировать элементы job
сначала по атрибуту fromTieId
? Для этого используйте мюнхенскую группировку с <xsl:key name="job-group" match="job" use="@fromTieId"/>
, а затем
<xsl:for-each select="xml/group[@key='job']/job[generate-id() = generate-id(key('job-group', @fromTieId)[1])]">
<xsl:apply-templates select="key('k_job', key('job-group', @fromTieId)/@toAttributeId)/@name" />
. Для полного рефакторинга с использованием шаблонов (но с теми же ключами для группировки / ссылки), я думаю, поможет следующий подход:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output method="html" indent="yes" version="5.0" doctype-system="about:legacy-doctype" />
<xsl:key name="k_job" match="attribute" use="@id" />
<xsl:key name="job-group" match="job" use="@fromTieId"/>
<xsl:template match="/">
<html>
<head>
<title>Example</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="xml/group[@key='job']/job[generate-id() = generate-id(key('job-group', @fromTieId)[1])]">
<xsl:apply-templates select="key('job-group', @fromTieId)" mode="value"/>
<xsl:text> @fromTieId=</xsl:text>
<xsl:value-of select="@fromTieId"/>
<br />
</xsl:template>
<xsl:template match="xml/group[@key='job']/job[generate-id() != generate-id(key('job-group', @fromTieId)[1])]"/>
<xsl:template match="job" mode="value">
<xsl:apply-templates select="key('k_job', @toAttributeId)/@name" />
<xsl:text>_</xsl:text>
<xsl:value-of select="@job"/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/3NSTbeJ