Я должен сгруппировать значение на основе некоторого атрибута и заполнить его.
ниже упомянутого i/p xml и если Вы видите, что существует 4 строки для Пользователей и для идентификатора 2,4, Подразделение - то же т.е. HR
при генерации фактического o/p я должен сгруппироваться Подразделением... Какая-либо справка???
I/P XML
<Users>
<User id="2" name="ABC" Division="HR"/>
<User id="3" name="xyz" Division="Admin"/>
<User id="4" name="LMN" Division="Payroll"/>
<User id="5" name="PQR" Division="HR"/>
</Users>
ожидаемый Результат: Я должен сгруппировать значения на основе Подразделения и заполнить т.е.
<AllUsers>
<Division value="HR">
<User>
<id>2</id>
<name>ABC</name>
</User>
<User>
<id>5</id>
<name>PQR</name>
</User>
</Division>
<Division value="ADMIN">
<User>
<id>3</id>
<name>XYZ</name>
</User>
</Division>
<Division value="Payroll">
<User>
<id>4</id>
<name>LMN</name>
</User>
</Division>
</AllUsers>
Использование
<xsl:for-each-group select="*"
group-by="@Division">
....
</xsl:for-each-group>
Проверьте этот пример: http://www.zvon.org/xxl/xssl-Ref/tutorials/forach-group/feg1.html
В XSLT 1.0 с использованием мюнхианской группировки.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="division" match="User" use="@Division" />
<xsl:template match="Users">
<AllUsers>
<xsl:apply-templates select="User[generate-id(.)=generate-id(key('division',@Division)[1])]"/>
</AllUsers>
</xsl:template>
<xsl:template match="User">
<Division value="{@Division}">
<xsl:for-each select="key('division', @Division)">
<User>
<id><xsl:value-of select="@id" /></id>
<name><xsl:value-of select="@name" /></name>
</User>
</xsl:for-each>
</Division>
</xsl:template>
</xsl:stylesheet>
В XSLT 2.0 используйте xsl: foreach-group
<xsl:output method="xml" indent="yes" />
<xsl:template match="Users">
<AllUsers>
<xsl:for-each-group select="User" group-by="@Division">
<Division value="{@Division}">
<xsl:for-each select="current-group()">
<User>
<id><xsl:value-of select="@id" /></id>
<name><xsl:value-of select="@name" /></name>
</User>
</xsl:for-each>
</Division>
</xsl:for-each-group>
</AllUsers>
</xsl:template>