2015-11-23 3 views
1

J'ai une liste de cartes de pointage à lister comme sortie dans MS Word à travers WordML (en utilisant XSLT 2.0) et je pense que je dois faire une sorte de groupement que je ne suis pas sûr de savoir compléter (si possible).XSLT 2.0 Grouping (pour WordML) à partir de XML

Ce que les plus hauts recherchent, c'est à chaque date (triée par date), toutes les informations sont regroupées dans une section pour chaque chronométreur. (Date, initiales du chronométreur, somme des heures pour cette date, liste de toutes les données narratives pour ce chronométreur pour cette date).

Voici ce que j'ai actuellement, qui est juste à côté de chaque timekeeper/timecard par date, aucun regroupement en place.

INPUT:

<xml-sample> 
<timecard index="10"> 
    <timekeeper> 
     <initials>NC1</initials> 
    </timekeeper> 
    <date type="timecard">2015-09-01</date> 
    <card-values> 
     <card-value type="billed"> 
      <rate>325.00</rate> 
      <hours>0.20</hours> 
      <amount>65.0000</amount> 
     </card-value> 
    </card-values> 
    <narrative> 
     <line id="1">Narrative for 9/1/2015. With some more detail</line> 
     <line id="2">on the 2nd line ID.</line> 
    </narrative> 
</timecard> 
<timecard index="11"> 
    <timekeeper> 
     <initials>NC1</initials> 
    </timekeeper> 
    <date type="timecard">2015-09-01</date> 
    <card-values> 
     <card-value type="billed"> 
      <rate>325.00</rate> 
      <hours>0.40</hours> 
      <amount>130.0000</amount> 
     </card-value> 
    </card-values> 
    <narrative> 
     <line id="1">Another narrative for 9/1/2015. With some more</line> 
     <line id="2">detail on the 2nd line ID.</line> 
    </narrative> 
</timecard> 
<timecard index="12"> 
    <timekeeper> 
     <initials>NC1</initials> 
    </timekeeper> 
    <date type="timecard">2015-09-12</date> 
    <card-values> 
     <card-value type="billed"> 
      <rate>325.00</rate> 
      <hours>0.30</hours> 
      <amount>97.5000</amount> 
     </card-value> 
    </card-values> 
    <narrative> 
     <line id="1">Narrative for 9/12/2015. With some more detail</line> 
     <line id="2">detail on the 2nd line ID.</line> 
    </narrative> 
</timecard> 

CODE EN COURS:

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet xmlns:aml="http://schemas.microsoft.com/aml/2001/core" 
    xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" 
    xmlns:fo="http://www.w3.org/1999/XSL/Format" 
    xmlns:kmf="http://www.kleinmundo.com/functions" 
    xmlns:o="urn:schemas-microsoft-com:office:office" 
    xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" 
    xmlns:tlr="http://www.elite.com/functions" 
    xmlns:st1="urn:schemas-microsoft-com:office:smarttags" 
    xmlns:v="urn:schemas-microsoft-com:vml" 
    xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" 
    xmlns:w10="urn:schemas-microsoft-com:office:word" 
    xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" 
    xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:template name="Time_Detail_Sample"> 
     <xsl:for-each select="xsm-sample/timecard"> 
      <w:p> 
       <w:r> 
        <w:t>Date: <xsl:value-of select="format-date(date, '[M01]/[D01]/[Y01]')" /> 
        </w:t> 
       </w:r> 
      </w:p> 
      <w:p> 
       <w:r> 
        <w:t>Timekeeper: <xsl:value-of select="timekeeper/initials" /> 
        </w:t> 
       </w:r> 
      </w:p> 
      <w:p> 
       <w:r> 
        <w:t>Hours: <xsl:value-of select="format-number(card-values/card-value[@type='billed']/hours, '###,##0.00')" /> 
        </w:t> 
       </w:r> 
      </w:p> 
      <w:p> 
       <w:r> 
        <xsl:for-each select="narrative/line"> 
         <w:t> 
          <xsl:value-of select="(.)" /> 
          <xsl:value-of select="' '" /> 
         </w:t> 
        </xsl:for-each> 
       </w:r> 
      </w:p> 
      <w:p /> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

COURANT DE SORTIE:

enter image description here

SORTIE DESIRE: (comme vous pouvez le voir, les données pour 01.09.2015 sont roulées en une somme d'heures et tous les détails narratifs énumérés tous ensemble).

enter image description here

Répondre

1

Je certainement utiliser xsl:for-each-group ...

<xsl:for-each-group select="timecard" 
    group-by="string-join((timekeeper/initials,date[@type='timecard']),'|')"> 
    <xsl:sort select="date[@type='timecard']"/> 
    <w:p> 
    <w:r> 
     <w:t> 
     <xsl:text>Date: </xsl:text> 
     <xsl:value-of select="format-date(date, '[M01]/[D01]/[Y01]')"/> 
     </w:t> 
    </w:r> 
    </w:p> 
    <w:p> 
    <w:r> 
     <w:t> 
     <xsl:text>Timekeeper: </xsl:text> 
     <xsl:value-of select="timekeeper/initials"/> 
     </w:t> 
    </w:r> 
    </w:p> 
    <w:p> 
    <w:r> 
     <w:t> 
     <xsl:text>Hours: </xsl:text> 
     <xsl:value-of select="format-number(sum(current-group()/card-values/card-value[@type='billed']/hours), '###,##0.00')"/> 
     </w:t> 
    </w:r> 
    </w:p> 
    <w:p> 
    <w:r> 
     <w:t> 
     <xsl:value-of select="current-group()/narrative/line" separator=" "/> 
     </w:t> 
    </w:r> 
    </w:p> 
    <w:p/> 
</xsl:for-each-group> 
0

Je vous suggère d'abord obtenir toutes les valeurs distinctes de la date, puis mettre tous les éléments timecard avec la date actuelle dans une variable et puis extraire tout ce que vous voulez de cette variable. Donc, quelque chose comme:

<xsl:variable name="root" select="/"/> 
<xsl:for-each select="distinct-values(//date[@type='timecard'])"> 
      <xsl:variable name="current_value" select="."/> 
      <xsl:variable name="all_timecards_with_current_date" select="$root//timecard[descendant::date=$current_value]"/> 
      <w:p> 
       <w:r> 
        <w:t>Date: <xsl:value-of select="format-date($current_value, '[M01]/[D01]/[Y01]')" /> 
        </w:t> 
       </w:r> 
      </w:p> 

      <w:p> 
       <w:r> 
        <w:t>Hours: <xsl:value-of select="sum($all_timecards_with_current_date//card-values/card-value[@type='billed']/hours)" /> 
        </w:t> 
       </w:r> 
      </w:p> 
      <w:p> 
       <w:r> 
        <xsl:for-each select="$all_timecards_with_current_date//narrative/line"> 
         <w:t> 
          <xsl:value-of select="." /> 
         </w:t> 
        </xsl:for-each> 
       </w:r> 
      </w:p> 

     </xsl:for-each> 

Pas vraiment jolie et certainement pas le moyen le plus rapide. Cependant, à mon avis, c'est plus facile à gérer que le regroupement.