2017-05-25 5 views
0

Chères professionnels,XSLT 2.0 - haut niveau de regroupement avec Sums (WordML)

J'ai un code XML de facturation conjointe qui a des résumés temps Carte/Timekeeper à l'intérieur. Je peux facilement regrouper par une matière spécifique, puis par Timekeeper et obtenir des totaux par matière. Mais je dois obtenir une somme de toutes les heures et des montants facturés par chronométreur pour l'ensemble de la facture commune, pas seulement par matière.

J'ai tout le code référencé ci-dessous, mais mis à jour à partir du commentaire @ Tim-C. Le lien est de transformation XSL HERE

ENTRÉE:

<?xml version="1.0" encoding="utf-8"?> 
<superbill> 
    <invoice type="P" id="562845" number="562845"> 
     <matters> 
      <matter number="014592-000007"> 
       <timecard-summary-by-timekeeper> 
        <timekeeper-summary timekeeper-id="NC1"> 
         <timekeeper> 
          <initials>NC1</initials> 
          <billingname>Nicholas J. Collins</billingname> 
         </timekeeper> 
         <timekeeper-summary-totals> 
          <timekeeper-summary-total type="billed"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="worked"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="standard"> 
           <total type="rate">525.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate1"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate2"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
         </timekeeper-summary-totals> 
        </timekeeper-summary> 
        <timekeeper-summary timekeeper-id="BJB"> 
         <timekeeper> 
          <initials>BJB</initials> 
          <billingname>Billie J. Bob</billingname> 
         </timekeeper> 
         <timekeeper-summary-totals> 
          <timekeeper-summary-total type="billed"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="worked"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="standard"> 
           <total type="rate">575.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate1"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate2"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
         </timekeeper-summary-totals> 
        </timekeeper-summary> 
       </timecard-summary-by-timekeeper> 
      </matter> 
      <matter number="014592-000091"> 
       <timecard-summary-by-timekeeper> 
        <timekeeper-summary timekeeper-id="NC1"> 
         <timekeeper> 
          <initials>NC1</initials> 
          <billingname>Nicholas J. Collins</billingname> 
         </timekeeper> 
         <timekeeper-summary-totals> 
          <timekeeper-summary-total type="billed"> 
           <total type="rate">525.00</total> 
           <total type="hours">1.00</total> 
           <total type="amount">525.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="worked"> 
           <total type="rate">525.00</total> 
           <total type="hours">1.00</total> 
           <total type="amount">525.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="standard"> 
           <total type="rate">525.00</total> 
           <total type="hours">1.00</total> 
           <total type="amount">525.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate1"> 
           <total type="rate">525.00</total> 
           <total type="hours">1.00</total> 
           <total type="amount">525.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate2"> 
           <total type="rate">0.00</total> 
           <total type="hours">1.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
         </timekeeper-summary-totals> 
        </timekeeper-summary> 
        <timekeeper-summary timekeeper-id="BJB"> 
         <timekeeper> 
          <initials>BJB</initials> 
          <billingname>Billie J. Bob</billingname> 
         </timekeeper> 
         <timekeeper-summary-totals> 
          <timekeeper-summary-total type="billed"> 
           <total type="rate">575.00</total> 
           <total type="hours">11.00</total> 
           <total type="amount">6325.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="worked"> 
           <total type="rate">575.00</total> 
           <total type="hours">11.00</total> 
           <total type="amount">6325.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="standard"> 
           <total type="rate">575.00</total> 
           <total type="hours">11.00</total> 
           <total type="amount">6325.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate1"> 
           <total type="rate">575.00</total> 
           <total type="hours">11.00</total> 
           <total type="amount">6325.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate2"> 
           <total type="rate">0.00</total> 
           <total type="hours">11.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
         </timekeeper-summary-totals> 
        </timekeeper-summary> 
       </timecard-summary-by-timekeeper> 
      </matter> 
      <matter number="014592-000092"> 
       <timecard-summary-by-timekeeper> 
        <timekeeper-summary timekeeper-id="NC1"> 
         <timekeeper> 
          <initials>NC1</initials> 
          <billingname>Nicholas J. Collins</billingname> 
         </timekeeper> 
         <timekeeper-summary-totals> 
          <timekeeper-summary-total type="billed"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="worked"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="standard"> 
           <total type="rate">525.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate1"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate2"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
         </timekeeper-summary-totals> 
        </timekeeper-summary> 
        <timekeeper-summary timekeeper-id="BJB"> 
         <timekeeper> 
          <initials>BJB</initials> 
          <billingname>Billie J. Bob</billingname> 
         </timekeeper> 
         <timekeeper-summary-totals> 
          <timekeeper-summary-total type="billed"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="worked"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="standard"> 
           <total type="rate">575.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate1"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate2"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
         </timekeeper-summary-totals> 
        </timekeeper-summary> 
       </timecard-summary-by-timekeeper> 
      </matter> 
      <matter number="014592-000095"> 
       <timecard-summary-by-timekeeper> 
        <timekeeper-summary timekeeper-id="NC1"> 
         <timekeeper> 
          <initials>NC1</initials> 
          <billingname>Nicholas J. Collins</billingname> 
         </timekeeper> 
         <timekeeper-summary-totals> 
          <timekeeper-summary-total type="billed"> 
           <total type="rate">525.00</total> 
           <total type="hours">4.00</total> 
           <total type="amount">2100.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="worked"> 
           <total type="rate">525.00</total> 
           <total type="hours">4.00</total> 
           <total type="amount">2100.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="standard"> 
           <total type="rate">525.00</total> 
           <total type="hours">4.00</total> 
           <total type="amount">2100.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate1"> 
           <total type="rate">525.00</total> 
           <total type="hours">4.00</total> 
           <total type="amount">2100.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate2"> 
           <total type="rate">0.00</total> 
           <total type="hours">4.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
         </timekeeper-summary-totals> 
        </timekeeper-summary> 
        <timekeeper-summary timekeeper-id="BJB"> 
         <timekeeper> 
          <initials>BJB</initials> 
          <billingname>Billie J. Bob</billingname> 
         </timekeeper> 
         <timekeeper-summary-totals> 
          <timekeeper-summary-total type="billed"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="worked"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="standard"> 
           <total type="rate">575.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate1"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate2"> 
           <total type="rate">0.00</total> 
           <total type="hours">0.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
         </timekeeper-summary-totals> 
        </timekeeper-summary> 
       </timecard-summary-by-timekeeper> 
      </matter> 
      <matter number="014592-000096"> 
       <timecard-summary-by-timekeeper> 
        <timekeeper-summary timekeeper-id="NC1"> 
         <timekeeper> 
          <initials>NC1</initials> 
          <billingname>Nicholas J. Collins</billingname> 
         </timekeeper> 
         <timekeeper-summary-totals> 
          <timekeeper-summary-total type="billed"> 
           <total type="rate">525.00</total> 
           <total type="hours">20.00</total> 
           <total type="amount">10500.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="worked"> 
           <total type="rate">525.00</total> 
           <total type="hours">20.00</total> 
           <total type="amount">10500.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="standard"> 
           <total type="rate">525.00</total> 
           <total type="hours">20.00</total> 
           <total type="amount">10500.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate1"> 
           <total type="rate">525.00</total> 
           <total type="hours">20.00</total> 
           <total type="amount">10500.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate2"> 
           <total type="rate">0.00</total> 
           <total type="hours">20.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
         </timekeeper-summary-totals> 
        </timekeeper-summary> 
        <timekeeper-summary timekeeper-id="BJB"> 
         <timekeeper> 
          <initials>BJB</initials> 
          <billingname>Billie J. Bob</billingname> 
         </timekeeper> 
         <timekeeper-summary-totals> 
          <timekeeper-summary-total type="billed"> 
           <total type="rate">575.00</total> 
           <total type="hours">4.00</total> 
           <total type="amount">2300.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="worked"> 
           <total type="rate">575.00</total> 
           <total type="hours">4.00</total> 
           <total type="amount">2300.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="standard"> 
           <total type="rate">575.00</total> 
           <total type="hours">4.00</total> 
           <total type="amount">2300.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate1"> 
           <total type="rate">575.00</total> 
           <total type="hours">4.00</total> 
           <total type="amount">2300.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
          <timekeeper-summary-total type="timerate2"> 
           <total type="rate">0.00</total> 
           <total type="hours">4.00</total> 
           <total type="amount">0.00</total> 
           <total type="adjustment">0.00</total> 
          </timekeeper-summary-total> 
         </timekeeper-summary-totals> 
        </timekeeper-summary> 
       </timecard-summary-by-timekeeper> 
      </matter> 
     </matters> 
    </invoice> 
</superbill> 

CODE DE COURANT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" 
       version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="/"> 
     <xsl:call-template name="XJ_TKSummary_02" /> 
    </xsl:template> 

    <xsl:template name="XJ_TKSummary_02"> 
     <xsl:variable name="TW" select="1440" /> 
     <xsl:for-each-group select="//superbill/invoice/matters/matter/timecard-summary-by-timekeeper/timekeeper-summary/timekeeper" group-by="../@timekeeper-id"> 
      <w:p> 
       <w:r> 
        <w:t><xsl:value-of select="initials" /> - <xsl:value-of select="billingname" /></w:t> 
       </w:r> 
      </w:p> 
      <w:p> 
       <w:r> 
        <xsl:variable name="groupTotals" select="current-group()/timekeeper-summary-totals/timekeeper-summary-total[@type='billed']/total" /> 
        <w:t> 
         Hours: <xsl:value-of select="format-number(sum($groupTotals[@type='hours']), '###,##0.00')" /> 
         for $ <xsl:value-of select="format-number(sum($groupTotals[@type='amount']), '###,##0.00')" /> 
        </w:t> 
       </w:r> 
      </w:p> 
     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 

SORTIE:

Les totaux souhaités doivent lire ...

NC1 - Nicholas J. Collins 
Hours: 25.00 for $13,125.00 

BJB - Billie J. Bob 
Hours: 15.00 for $8,625.00 

Toute aide serait appréciée.

Regard,

-Nick

Répondre

1

La principale chose que vous devez faire est de changer le xsl:for-each-group à cette ...

<xsl:for-each-group select="//invoice/matter/timecard-summary-by-timekeeper/timekeeper-summary/timekeeper" group-by="../@timekeeper-id"> 

Donc, vous regroupez timekeeper dossiers par leurs parents timekeeper-id attribut.

Vous devez également inclure le timekeeper-summary-totals dans le chemin xpath pour obtenir le nombre total d'heures et le montant.

<w:t> 
    Hours: 
<xsl:value-of select="format-number(sum(current-group()/timekeeper-summary-totals/timekeeper-summary-total[@type='billed']/total[@type='hours']), '###,##0.00')" /> 
for $ 
<xsl:value-of select="format-number(sum(current-group()/timekeeper-summary-totals/timekeeper-summary-total[@type='billed']/total[@type='amount']), '###,##0.00')" /> 
</w:t> 

Ou, mieux encore, utiliser une variable pour réduire le code repitition du XPath

Essayez cette XSLT abrégée

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" 
       version="2.0"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="/"> 
     <xsl:call-template name="XJ_TKSummary_02" /> 
    </xsl:template> 

    <xsl:template name="XJ_TKSummary_02"> 
     <xsl:variable name="TW" select="1440" /> 
     <xsl:for-each-group select="//invoice/matter/timecard-summary-by-timekeeper/timekeeper-summary/timekeeper" group-by="../@timekeeper-id"> 
      <w:p> 
       <w:r> 
        <w:t><xsl:value-of select="initials" /> - <xsl:value-of select="billingname" /></w:t> 
       </w:r> 
      </w:p> 
      <w:p> 
       <w:r> 
        <xsl:variable name="groupTotals" select="current-group()/timekeeper-summary-totals/timekeeper-summary-total[@type='billed']/total" /> 
        <w:t> 
         Hours: <xsl:value-of select="format-number(sum($groupTotals[@type='hours']), '###,##0.00')" /> 
         for $ <xsl:value-of select="format-number(sum($groupTotals[@type='amount']), '###,##0.00')" /> 
        </w:t> 
       </w:r> 
      </w:p> 
     </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Merci! Je reçois chaque chronométreur individuel, mais obtenir 0.00 pour les heures et le montant. – NCollinsTE

+0

Juste remarqué que c'est seulement en prenant en considération le premier point. Juste testé en ajoutant un 4ème et 5ème chronométreur dans le 2ème sujet dans le XML, et il énumère seulement les 3 chronométreurs originaux et ne pas additionner les #. Quelque chose les garde à 0.00. – NCollinsTE

+0

@NCollinsTE, pensez à modifier votre question et fournissez un exemple d'entrée complète minimale pour démontrer le problème. Lorsque j'essaie d'utiliser votre extrait actuel et que le code de Tim sur http://xsltransform.net/a9GiwC semble sortir les valeurs que vous avez décrites jusqu'à présent. –