Возможно, я неправильно понял ваше требование, но, похоже, вы здесь слишком усложняете вещи.
Во-первых, я думаю, что вы Фаза .Поэтому настройте ключ следующим образом:
<xsl:key name="Phase" match="Row" use="Phase" />
И сопоставьте самую верхнюю строку в каждой Фазе , например, так:получить 'дочерние элементы' текущей строки, вы можете рекурсивно вызвать шаблон для соответствия строка элементов
<xsl:apply-templates
select="//Row[Phase=current()/Phase][Master=current()/ID][Master != ID]" />
Итак, учитывая следующее XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="Phase" match="Row" use="Phase"/>
<xsl:template match="/">
<Rows>
<xsl:apply-templates select="//Row[generate-id() = generate-id(key('Phase', Phase)[1])]" mode="first"/>
</Rows>
</xsl:template>
<xsl:template match="Row" mode="first">
<Phase name="{Phase}">
<xsl:apply-templates select="key('Phase', Phase)[Master = ID]"/>
</Phase>
</xsl:template>
<xsl:template match="Row" name="Row">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:apply-templates select="//Row[Phase=current()/Phase][Master=current()/ID][Master != ID]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
При применении к вашему образцу XML выводится следующее:
<Rows>
<Phase name="Initiation">
<Row>
<ProjectID>1000</ProjectID>
<Phase>Initiation</Phase>
<ID>1</ID>
<Name>Work item 1</Name>
<Master>1</Master>
<Row>
<ProjectID>1000</ProjectID>
<Phase>Initiation</Phase>
<ID>2</ID>
<Name>Work item 2</Name>
<Master>1</Master>
</Row>
</Row>
</Phase>
<Phase name="Closing">
<Row>
<ProjectID>1000</ProjectID>
<Phase>Closing</Phase>
<ID>3</ID>
<Name>Work item 3</Name>
<Master>3</Master>
<Row>
<ProjectID>1000</ProjectID>
<Phase>Closing</Phase>
<ID>4</ID>
<Name>Work item 4</Name>
<Master>3</Master>
<Row>
<ProjectID>1000</ProjectID>
<Phase>Closing</Phase>
<ID>5</ID>
<Name>Work item 5</Name>
<Master>4</Master>
</Row>
</Row>
</Row>
</Phase>
</Rows>
Если вы хотите вывести HTML, попробуйте следующее XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:key name="Phase" match="Row" use="Phase"/>
<xsl:template match="/">
<body>
<xsl:apply-templates select="//Row[generate-id() = generate-id(key('Phase', Phase)[1])]" mode="first"/>
</body>
</xsl:template>
<xsl:template match="Row" mode="first">
<h1>
<xsl:value-of select="Phase"/>
</h1>
<ul>
<xsl:apply-templates select="key('Phase', Phase)[Master = ID]"/>
</ul>
</xsl:template>
<xsl:template match="Row" name="Row">
<li>
<xsl:value-of select="Name"/>
<xsl:if test="//Row[Phase=current()/Phase][Master=current()/ID][Master != ID]">
<ul>
<xsl:apply-templates select="//Row[Phase=current()/Phase][Master=current()/ID][Master != ID]"/>
</ul>
</xsl:if>
</li>
</xsl:template>
</xsl:stylesheet>
Это должно вывести следующий HTML
<body>
<h1>Initiation</h1>
<ul>
<li>Work item 1
<ul>
<li>Work item 2</li>
</ul>
</li>
</ul>
<h1>Closing</h1>
<ul>
<li>Work item 3
<ul>
<li>Work item 4
<ul>
<li>Work item 5</li>
</ul>
</li>
</ul>
</li>
</ul>
</body>