title: Need to group nodes based on 2 elements and sum a third. Key? Variable?
body: <p>Thank you in advance for your help.<br>
  I have a large xml file and need to consolidate/sum the rows. I’ve spent much quality time with my XSLT For Dummies book and tried variations of many forum solutions, But I’m not even close. Any guidance you can offer will be most appreciated.  </p>
  
  <pre><code>    &lt;Report&gt;    
          &lt;Report_Entry&gt;
              &lt;POSTING-DATE&gt;02292016&lt;/POSTING-DATE&gt;
              &lt;pmtdt&gt;2016-02-29-08:00&lt;/pmtdt&gt;
              &lt;emp&gt;10025&lt;/emp&gt;
              &lt;cc&gt;020107450&lt;/cc&gt;
              &lt;union&gt;N10025&lt;/union&gt;
              &lt;fac&gt;000002010&lt;/fac&gt;
              &lt;job&gt;8062&lt;/job&gt;
              &lt;pay&gt;RGR&lt;/pay&gt;
              &lt;hours&gt;2&lt;/hours&gt;
          &lt;/Report_Entry&gt;
          &lt;Report_Entry&gt;
              &lt;POSTING-DATE&gt;02292016&lt;/POSTING-DATE&gt;
              &lt;pmtdt&gt;2016-02-29-08:00&lt;/pmtdt&gt;
              &lt;emp&gt;10025&lt;/emp&gt;
              &lt;cc&gt;020107450&lt;/cc&gt;
              &lt;union&gt;N10025&lt;/union&gt;
              &lt;fac&gt;000002010&lt;/fac&gt;
              &lt;job&gt;8062&lt;/job&gt;
              &lt;pay&gt;RGR&lt;/pay&gt;
              &lt;hours&gt;110.27&lt;/hours&gt;
          &lt;/Report_Entry&gt;
          &lt;Report_Entry&gt;
              &lt;POSTING-DATE&gt;02292016&lt;/POSTING-DATE&gt;
              &lt;pmtdt&gt;2016-02-29-08:00&lt;/pmtdt&gt;
              &lt;emp&gt;10025&lt;/emp&gt;
              &lt;cc&gt;020107450&lt;/cc&gt;
              &lt;union&gt;N10025&lt;/union&gt;
              &lt;fac&gt;000002010&lt;/fac&gt;
              &lt;job&gt;8062&lt;/job&gt;
              &lt;pay&gt;RGR&lt;/pay&gt;
              &lt;hours&gt;61.07&lt;/hours&gt;
          &lt;/Report_Entry&gt;
         &lt;Report_Entry&gt;
              &lt;POSTING-DATE&gt;02292016&lt;/POSTING-DATE&gt;
              &lt;pmtdt&gt;2016-02-29-08:00&lt;/pmtdt&gt;
              &lt;emp&gt;10025&lt;/emp&gt;
              &lt;cc&gt;020107450&lt;/cc&gt;
              &lt;union&gt;N10025&lt;/union&gt;
              &lt;fac&gt;000002010&lt;/fac&gt;
              &lt;job&gt;8062&lt;/job&gt;
              &lt;pay&gt;SAL&lt;/pay&gt;
              &lt;hours&gt;2.01&lt;/hours&gt;
          &lt;/Report_Entry&gt;
          &lt;Report_Entry&gt;
              &lt;POSTING-DATE&gt;02292016&lt;/POSTING-DATE&gt;
              &lt;pmtdt&gt;2016-02-29-08:00&lt;/pmtdt&gt;
              &lt;emp&gt;10058&lt;/emp&gt;
              &lt;cc&gt;020107375&lt;/cc&gt;
              &lt;union&gt;N10058&lt;/union&gt;
              &lt;fac&gt;000002010&lt;/fac&gt;
              &lt;job&gt;8085&lt;/job&gt;
              &lt;pay&gt;SAL&lt;/pay&gt;
              &lt;hours&gt;130&lt;/hours&gt;
          &lt;/Report_Entry&gt;
          &lt;Report_Entry&gt;
              &lt;POSTING-DATE&gt;02292016&lt;/POSTING-DATE&gt;
              &lt;pmtdt&gt;2016-02-29-08:00&lt;/pmtdt&gt;
              &lt;emp&gt;10102&lt;/emp&gt;
              &lt;cc&gt;020267515&lt;/cc&gt;
              &lt;union&gt;N10102&lt;/union&gt;
              &lt;fac&gt;000002026&lt;/fac&gt;
              &lt;job&gt;8066&lt;/job&gt;
              &lt;pay&gt;BLV&lt;/pay&gt;
              &lt;hours&gt;31&lt;/hours&gt;
          &lt;/Report_Entry&gt;
          &lt;Report_Entry&gt;
              &lt;POSTING-DATE&gt;02292016&lt;/POSTING-DATE&gt;
              &lt;pmtdt&gt;2016-02-29-08:00&lt;/pmtdt&gt;
              &lt;emp&gt;10102&lt;/emp&gt;
              &lt;cc&gt;020267515&lt;/cc&gt;
              &lt;union&gt;N10102&lt;/union&gt;
              &lt;fac&gt;000002026&lt;/fac&gt;
              &lt;job&gt;8066&lt;/job&gt;
              &lt;pay&gt;SAL&lt;/pay&gt;
              &lt;hours&gt;125&lt;/hours&gt;
          &lt;/Report_Entry&gt;
          &lt;Report_Entry&gt;
              &lt;POSTING-DATE&gt;02292016&lt;/POSTING-DATE&gt;
              &lt;pmtdt&gt;2016-02-29-08:00&lt;/pmtdt&gt;
              &lt;emp&gt;10102&lt;/emp&gt;
              &lt;cc&gt;020267515&lt;/cc&gt;
              &lt;union&gt;N10102&lt;/union&gt;
              &lt;fac&gt;000002026&lt;/fac&gt;
              &lt;job&gt;8066&lt;/job&gt;
              &lt;pay&gt;SAL&lt;/pay&gt;
              &lt;hours&gt;125&lt;/hours&gt;
          &lt;/Report_Entry&gt;
          &lt;Report_Entry&gt;
              &lt;POSTING-DATE&gt;02292016&lt;/POSTING-DATE&gt;
              &lt;pmtdt&gt;2016-02-29-08:00&lt;/pmtdt&gt;
              &lt;emp&gt;10102&lt;/emp&gt;
              &lt;cc&gt;020267515&lt;/cc&gt;
              &lt;union&gt;N10102&lt;/union&gt;
              &lt;fac&gt;000002026&lt;/fac&gt;
              &lt;job&gt;8066&lt;/job&gt;
              &lt;pay&gt;VOL&lt;/pay&gt;
              &lt;hours&gt;15&lt;/hours&gt;
          &lt;/Report_Entry&gt;
      &lt;/Report_Data&gt;  
  </code></pre>
  
  <p>My desired output is a single row for each emp/pay combination, with the associated hours totaled:  </p>
  
  <pre><code>      N10025        000002010   8062    RGR 173.34
        N10025        000002010   8062    SAL 2.01
        N10058        000002010   8085    SAL 130
        N10102        000002026   8066    BLV 31
        N10102        000002026   8066    SAL 250
        N10102        000002026   8066    VOL 15
  </code></pre>
  
  <p>I considered not posting my xsl, but that’s bad manners. Don’t laugh too hard…  </p>
  
  <pre><code>    &lt;?xml version="1.0" encoding="UTF-8"?&gt;
      &lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:xs="http://www.w3.org/2001/XMLSchema"
       xmlns:rd="urn:com.abcd.report/Report" 
       version="3.0"&gt;
  
      &lt;xsl:output method="xml" indent="yes"/&gt;
      &lt;xsl:key name="emp" match="/Report_Data/Report_Entry/emp" use="text()"/&gt;
      &lt;xsl:key name="pay" match="/Report_Data/Report_Entry/pay" use="text()"/&gt; 
      &lt;xsl:variable name="newline" select="'&amp;#xD;'"/&gt;
      &lt;xsl:variable name="sep" select="'&amp;#124;'"/&gt;    
  
      &lt;xsl:template match="Report_Data/Report_Entry"&gt;
          &lt;file&gt;
               &lt;line&gt;
                   &lt;xsl:for-each select = "emp[generate-id(.)=generate-id(key('emp',text())]"&gt;
                   &lt;xsl:for-each select="key('emp',"'wd:pay')"&gt;
                        &lt;xsl:if test="./text()=*/text()"&gt;
                             &lt;!-- This is embarrassing --&gt;
                       &lt;/xsl:if&gt;
                   &lt;/xsl:for-each&gt;                
               &lt;/xsl:for-each&gt;    
             &lt;/line&gt;
         &lt;/file&gt;
      &lt;/xsl:template&gt;
      &lt;/xsl:stylesheet&gt;
  </code></pre>