Search code examples
xsltxslt-grouping

How to group by value from different tags?


I have a XML like the following:

<DataSet>
 <FirstNode>
  <UniqueKey>111</UniqueKey>
 </FirstNode>
 <FirstNode>
  <UniqueKey>123</UniqueKey>
 </FirstNode>
 <FirstNode>
  <UniqueKey>144</UniqueKey>
 </FirstNode>
 <SecondNode>
  <FirstNodeKey>111</FirstNodeKey>
 </SecondNode>
 <SecondNode>
  <FirstNodeKey>123</FirstNodeKey>
 </SecondNode>
 <SecondNode>
  <FirstNodeKey>144</FirstNodeKey>
 </SecondNode>
</DataSet>

I want to use XSLT to get:

<DataSet>
     <FirstNode>
      <UniqueKey>111</UniqueKey>
     </FirstNode>
     <SecondNode>
      <FirstNodeKey>111</FirstNodeKey>
     </SecondNode>
</DataSet>
<DataSet>
     <FirstNode>
      <UniqueKey>123</UniqueKey>
     </FirstNode>
     <SecondNode>
      <FirstNodeKey>123</FirstNodeKey>
     </SecondNode>
</DataSet>
<DataSet>
     <FirstNode>
      <UniqueKey>144</UniqueKey>
     </FirstNode>
     <SecondNode>
      <FirstNodeKey>144</FirstNodeKey>
     </SecondNode>
</DataSet>

If the tag is the same, I can use:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="DataSet">
      <xsl:for-each-group select="*" group-by="UniqueKey">
          <Updates>
              <xsl:copy-of select="current-group()"/>
          </Updates>
      </xsl:for-each-group>
  </xsl:template>
</xsl:stylesheet>

How can I do this when the tags are different? How can I group on these two different tags? (UniqueKey and FirstNodeKey for my case).

Thanks in advance


Solution

  • As long as there is no element having both of these key elements you can simply use group-by="UniqueKey, FirstNodeKey" as that forms the sequence of the two elements which, in your case, will simply be a sequence with either UniqueKey or FirstNodeKey, as the other selection is empty.