Это преобразование XSLT 1.0 :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kSiteByName" match="@Site" use="."/>
<xsl:key name="kWorksiteBySite"
match="WorkSite" use="@Site"/>
<xsl:key name="kSiteChildrenBySiteid"
match="Site/node()" use="../@id"/>
<xsl:variable name="vSites" select=
"/*/*/@Site[generate-id()
=
generate-id(key('kSiteByName',.)[1])
]"
/>
<xsl:template match="/">
<root>
<xsl:for-each select="$vSites">
<xsl:for-each select="key('kWorksiteBySite', .)">
<xsl:sort select="Hours" data-type="number"
order="descending"/>
<xsl:if test="position()=1">
<site id="{@Site}">
<xsl:copy-of select="key('kSiteChildrenBySiteid', @Site)"/>
<person><xsl:value-of select="@Person"/></person>
</site>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному документу XML :
<root>
<Site id="S1">
<othernodes></othernodes>
</Site>
<Site id="S2">
<othernodes></othernodes>
</Site>
<Site id="S3">
<othernodes></othernodes>
</Site>
<WorkSite Person="P1" Site="S1">
<Hours>8</Hours>
</WorkSite>
<WorkSite Person="P1" Site="S2">
<Hours>2</Hours>
</WorkSite>
<WorkSite Person="P1" Site="S3">
<Hours>20</Hours>
</WorkSite>
<WorkSite Person="P2" Site="S1">
<Hours>6</Hours>
</WorkSite>
<WorkSite Person="P2" Site="S2">
<Hours>10</Hours>
</WorkSite>
<WorkSite Person="P2" Site="S3">
<Hours>21</Hours>
</WorkSite>
</root>
производиттребуемый, правильный результат :
<root>
<site id="S1">
<othernodes/>
<person>P1</person>
</site>
<site id="S2">
<othernodes/>
<person>P2</person>
</site>
<site id="S3">
<othernodes/>
<person>P2</person>
</site>
</root>
Примечание :
Использование метода Мюнхена для группировки для поиска всех различных значений Site.
Максимум пути определяется путем сортировки по убыванию и получения первого результата из отсортированного списка узлов. Это намного эффективнее (O (N * log (N)), чем сканирование последовательности узлов несколько раз (сравнение каждого значения с каждым значением в списке значений), которое имеет O (N ^ 2) сложность времени.