Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I don't prefer adding elements like that and this is what i will do. This works perfectly. It gives the output you need. Try it out.</p> <p><strong>XML</strong></p> <pre><code>&lt;?xml version="1.0"?&gt; &lt;Users&gt; &lt;User id="2" name="ABC" Division="HR"/&gt; &lt;User id="3" name="xyz" Division="Admin"/&gt; &lt;User id="4" name="LMN" Division="Payroll"/&gt; &lt;User id="5" name="PQR" Division="HR"/&gt; &lt;/Users&gt; </code></pre> <p><strong>XSLT 1.0</strong> </p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&gt; &lt;xsl:output method="xml" indent="yes" /&gt; &lt;xsl:key name="division" match="User" use="@Division" /&gt; &lt;xsl:template match="Users"&gt; &lt;xsl:element name="AllUsers"&gt; &lt;xsl:apply-templates select="User[generate-id(.)=generate-id(key('division',@Division)[1])]" /&gt; &lt;/xsl:element&gt; &lt;/xsl:template&gt; &lt;xsl:template match="User"&gt; &lt;xsl:element name="Division"&gt; &lt;xsl:attribute name="value"&gt; &lt;xsl:value-of select="@Division" /&gt; &lt;/xsl:attribute&gt; &lt;xsl:for-each select="key('division', @Division)"&gt; &lt;xsl:element name="User"&gt; &lt;xsl:element name="id"&gt; &lt;xsl:value-of select="@id" /&gt; &lt;/xsl:element&gt; &lt;xsl:element name="name"&gt; &lt;xsl:value-of select="@name" /&gt; &lt;/xsl:element&gt; &lt;/xsl:element&gt; &lt;/xsl:for-each&gt; &lt;/xsl:element&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt; </code></pre> <p><strong>XSLT 2.0</strong></p> <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"&gt; &lt;xsl:output method="xml" indent="yes" encoding="UTF-8" omit-xml-declaration="yes" /&gt; &lt;xsl:key name="division" match="User" use="@Division" /&gt; &lt;xsl:template match="Users"&gt; &lt;xsl:element name="AllUsers"&gt; &lt;xsl:for-each-group select="*" group-by="@Division"&gt; &lt;xsl:element name="Division"&gt; &lt;xsl:attribute name="value"&gt; &lt;xsl:value-of select="@Division" /&gt; &lt;/xsl:attribute&gt; &lt;xsl:for-each select="current-group()"&gt; &lt;xsl:element name="User"&gt; &lt;xsl:element name="id"&gt; &lt;xsl:value-of select="@id" /&gt; &lt;/xsl:element&gt; &lt;xsl:element name="name"&gt; &lt;xsl:value-of select="@name" /&gt; &lt;/xsl:element&gt; &lt;/xsl:element&gt; &lt;/xsl:for-each&gt; &lt;/xsl:element&gt; &lt;/xsl:for-each-group&gt; &lt;/xsl:element&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt; </code></pre> <p>Using either will give you this <strong>output</strong>,</p> <pre><code>&lt;AllUsers&gt; &lt;Division value="HR"&gt; &lt;User&gt; &lt;id&gt;2&lt;/id&gt; &lt;name&gt;ABC&lt;/name&gt; &lt;/User&gt; &lt;User&gt; &lt;id&gt;5&lt;/id&gt; &lt;name&gt;PQR&lt;/name&gt; &lt;/User&gt; &lt;/Division&gt; &lt;Division value="Admin"&gt; &lt;User&gt; &lt;id&gt;3&lt;/id&gt; &lt;name&gt;xyz&lt;/name&gt; &lt;/User&gt; &lt;/Division&gt; &lt;Division value="Payroll"&gt; &lt;User&gt; &lt;id&gt;4&lt;/id&gt; &lt;name&gt;LMN&lt;/name&gt; &lt;/User&gt; &lt;/Division&gt; &lt;/AllUsers&gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload