Если вы не сделали двухфазное преобразование, я думаю, что вам, вероятно, следует сначала выполнить группировку, а затем фильтрацию.
Группировка будет выполняться с помощью обычного метода группирования по Meunchain.Сначала вы определяете ключ для поиска DataRow элементов на основе их Group
<xsl:key name="RowLookup" match="DataRow" use="Group"/>
А затем, чтобы получить уникальные имена групп, вы сопоставляете элементы DataRowкоторые являются первыми встречающимися элементами в вашем ключе для их конкретной группы
<xsl:apply-templates select="DataRow[generate-id() = generate-id(key('RowLookup', Group)[1])]"/>
Итак, теперь вы сгруппированы по элементам Group , так что вам нужно проверить их как минимумодин элемент DataRow для текущей группы, который соответствует фильтру
<xsl:if test="../DataRow[Group=current()/Group]/Country[Conty=$Conty]">
А затем, чтобы получить все элементы DataRow для текущей группы, вы можете использовать ключ
<xsl:apply-templates select="key('RowLookup', Group)" mode="ingroup"/>
Вот полныйXSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:param name="Conty">United Kingdom</xsl:param>
<xsl:key name="RowLookup" match="DataRow" use="Group"/>
<xsl:template match="/DataRows">
<xsl:copy>
<!-- Select unique groups -->
<xsl:apply-templates
select="DataRow[generate-id() = generate-id(key('RowLookup', Group)[1])]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="DataRow">
<!-- Check any DataRow elements for the current group match the filter -->
<xsl:if test="../DataRow[Group=current()/Group]/Country[Conty=$Conty]">
<Group>
<xsl:attribute name="name">
<xsl:value-of select="Group"/>
</xsl:attribute>
<!-- Get all the DataRow elements for the current group -->
<xsl:apply-templates select="key('RowLookup', Group)" mode="ingroup"/>
</Group>
</xsl:if>
</xsl:template>
<xsl:template match="DataRow" mode="ingroup">
<!-- Check this DataRow matches the filter -->
<xsl:if test="Country[Conty=$Conty]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<!-- Ignore Group and Country elements -->
<xsl:template match="Group|Country"/>
<!-- Standard Identity Transform for all other nodes -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Когда вы применяете этот XSLT к вашему образцу XML, вы получаете следующие результаты
<DataRows>
<Group name="Group 1">
<DataRow>
<Order>1</Order>
<Name>Name 1_1</Name>
<Title>Title 1</Title>
<PhoneNo>732-989-9898</PhoneNo>
<ImageUrl/>
<EmailId/>
</DataRow>
<DataRow>
<Order>2</Order>
<Name>Name 2_2</Name>
<Title>Title 2</Title>
<PhoneNo>732-989-9898</PhoneNo>
<ImageUrl/>
<EmailId/>
</DataRow>
</Group>
<Group name="Group 2">
<DataRow>
<Order>1</Order>
<Name>Name 9_1</Name>
<Title>Title 9</Title>
<PhoneNo>732-989-9898</PhoneNo>
<ImageUrl/>
<EmailId/>
</DataRow>
</Group>
</DataRows>
Я не уверен, что это именно та структура, которую вы хотите, но я надеюсь,это дает вам общее представление.