2012-08-14 5 views
0

J'ai un projet dans lequel j'ai besoin d'obtenir et de compter des valeurs distinctes dans des balises dans un document XML. Si vous regardez le XML, j'essaie spécifiquement de compter le nombre distinct de WorkOrderNumbers pour mardi. Plus tard, je ferai lundi et ainsi de suite. J'ai essayé le code suivant.XSLT Count Distinct Values ​​

<xsl:variable name="tmp" select="count(//Tuesday/TimeDetail/WorkOrderNumber[generate-id() = generate-id(key('distinctWorkOrder', .)[1])])"></xsl:variable> 

Cela renvoie 2. Je l'ai aussi essayé

<xsl:variable name="tmp2" select="count(//Tuesday/TimeDetail/WorkOrderNumber[not(.=/preceding-sibling::WorkOrderNumber)])"></xsl:variable> 

Il retourne 4. La réponse correcte est 3.

J'ai ajouté le XML ci-dessous. Quelqu'un peut-il signaler ce que je fais mal? Merci beaucoup.

<Timesheet> 
<WeekEnding>Sep 18, 2011</WeekEnding> 
<JobNumber>00010-5523</JobNumber> 
<Customer>Test Company INC</Customer> 
<TeamMember> 
    <EmployeeNumber>10566</EmployeeNumber> 
    <EmployeeName>Employee, One</EmployeeName> 
    <EmployeeClass>Class</EmployeeClass> 
    <Monday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>14963</WorkOrderNumber> 
      <RegularHours>8</RegularHours> 
      <OverTimeHours>3</OverTimeHours> 
      <OtherHours>4 - Holiday</OtherHours> 
      <Notes>I took the afternoon off.</Notes> 
     </TimeDetail> 
    </Monday> 
    <Tuesday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>14963</WorkOrderNumber> 
      <RegularHours>5</RegularHours> 
      <OverTimeHours>Over Time</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>15101</WorkOrderNumber> 
      <RegularHours>2</RegularHours> 
      <OverTimeHours>Over Time</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
    </Tuesday> 
    <Wednesday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>14963</WorkOrderNumber> 
      <RegularHours>5</RegularHours> 
      <OverTimeHours>Over Time</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
    </Wednesday> 
    <Thursday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>14963</WorkOrderNumber> 
      <RegularHours>5</RegularHours> 
      <OverTimeHours>Over Time</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
    </Thursday> 
    <Friday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>14963</WorkOrderNumber> 
      <RegularHours>5</RegularHours> 
      <OverTimeHours>2</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
    </Friday> 
    <Saturday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>14963</WorkOrderNumber> 
      <RegularHours>5</RegularHours> 
      <OverTimeHours>Over Time</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
    </Saturday> 
    <Sunday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>14963</WorkOrderNumber> 
      <RegularHours>5</RegularHours> 
      <OverTimeHours>1</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
    </Sunday> 
</TeamMember> 
<TeamMember> 
    <EmployeeNumber>81135</EmployeeNumber> 
    <EmployeeName>Employee, Two</EmployeeName> 
    <EmployeeClass>Class</EmployeeClass> 
    <Monday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>15100</WorkOrderNumber> 
      <RegularHours>5</RegularHours> 
      <OverTimeHours>Over Time</OverTimeHours> 
      <OtherHours>1 - Company Meetings</OtherHours> 
      <Notes>These are my notes.</Notes> 
     </TimeDetail> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>22965</WorkOrderNumber> 
      <RegularHours>7</RegularHours> 
      <OverTimeHours>Over Time</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>23570</WorkOrderNumber> 
      <RegularHours>Regular</RegularHours> 
      <OverTimeHours>1</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
    </Monday> 
    <Tuesday></Tuesday> 
    <Wednesday></Wednesday> 
    <Thursday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>23591</WorkOrderNumber> 
      <RegularHours>7</RegularHours> 
      <OverTimeHours>Over Time</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>15100</WorkOrderNumber> 
      <RegularHours>1</RegularHours> 
      <OverTimeHours>1</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Test</Notes> 
     </TimeDetail> 
    </Thursday> 
    <Friday></Friday> 
    <Saturday></Saturday> 
    <Sunday></Sunday> 
</TeamMember> 
<TeamMember> 
    <EmployeeNumber>105779</EmployeeNumber> 
    <EmployeeName>Employee, Three</EmployeeName> 
    <EmployeeClass>W</EmployeeClass> 
    <Monday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>19583</WorkOrderNumber> 
      <RegularHours>8</RegularHours> 
      <OverTimeHours>Over Time</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
    </Monday> 
    <Tuesday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>15099</WorkOrderNumber> 
      <RegularHours>1</RegularHours> 
      <OverTimeHours>7</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
    </Tuesday> 
    <Wednesday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>15099</WorkOrderNumber> 
      <RegularHours>1</RegularHours> 
      <OverTimeHours>7</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
    </Wednesday> 
    <Thursday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>15099</WorkOrderNumber> 
      <RegularHours>1</RegularHours> 
      <OverTimeHours>7</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
    </Thursday> 
    <Friday> 
     <TimeDetail> 
      <StartTime>Start</StartTime> 
      <StopTime>Stop</StopTime> 
      <WorkOrderNumber>15099</WorkOrderNumber> 
      <RegularHours>1</RegularHours> 
      <OverTimeHours>7</OverTimeHours> 
      <OtherHours>Other</OtherHours> 
      <Notes>Notes</Notes> 
     </TimeDetail> 
    </Friday> 
    <Saturday></Saturday> 
    <Sunday></Sunday> 
</TeamMember> 

Répondre

1

Si vous êtes à la recherche d'éléments distincts pour un jour donné, vous devrez vous assurer le nom de l'élément de jour fait partie de la

clé
<xsl:key name="distinctWorkOrder" 
    match="TimeDetail" 
    use="concat(local-name(..), '|', WorkOrderNumber)" /> 

Ainsi, cette utilisera à la fois le jour et le numéro de commande. Ensuite, vous pouvez compter les éléments distincts pour un jour donné comme si

<xsl:variable name="tmp" 
select="count(//Tuesday/TimeDetail 
    [generate-id() 
    = generate-id(key('distinctWorkOrder', concat(local-name(..), '|', WorkOrderNumber))[1])])"/> 

Cela devrait donner la réponse 3.

+0

Merci beaucoup, qui était exactement ça. Vous avez résolu mon problème. – inosu812

3

Cette XSLT 2.0 expression XPath comptera les ordres de travail distincts ...

count(fn:distinct-values(/*/*/Tuesday/*/WorkOrderNumber)) 

est ici le XSLT 1.0 équivalent ...

count(/*/*/Tuesday/*/WorkOrderNumber[not(. = following::WorkOrderNumber)])