Reputation: 1
I have jobs and multiple job tests for which I have to get 'pass' and 'fail' count by gender.My current code is working if there is one jobtest for each job.If any job has multiple job tests the counts are incorrect. Here is my fiddle with with xml and xslt code.job 1 counts are correct as it has only one test.Job 2 counts are incorrect as it has multiple jobtests.
https://xsltfiddle.liberty-development.net/a9GPfH/1
Expected Totals
Job, job_Test, Ma_Pass, Ma_Fail, Fem_Pass, Fem_Fail
Job 1, Application Evaluation, 5, 3, 9, 2
Job 2, Application Evaluation, 304, 2, 131, 0
Job 2, Suitability Test, 127, 118, 53, 54
Anyhelp is hightly appreciated.
Upvotes: 0
Views: 311
Reputation: 167716
You need to group the nested Job_Test
in the inner grouping:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:r="urn:com.workday.report/Test_by_Gender"
xmlns:this="urn:this"
xmlns:is="java:com.workday.esb.intsys.xpath.ParsedIntegrationSystemFunctions"
exclude-result-prefixes="#all"
version="3.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="r:Report_Data">
<Root>
<xsl:variable name="linefeed" select="'
'"/>
<xsl:for-each-group select="r:Report_Entry" group-by="r:Job/@r:Descriptor">
<xsl:variable name="entry" select="."/>
<xsl:for-each-group select="current-group()/r:Test_Result_group/r:Job_Test" group-by="@r:Descriptor">
<Job><xsl:value-of select = "$entry/r:Job/@r:Descriptor"/></Job>
<Job_Test><xsl:value-of select="current-grouping-key()"/></Job_Test>
<xsl:variable name="Females" select="current-group()[ancestor::r:Report_Entry/r:Gender = 'Female']"/>
<xsl:variable name="FemalePass" select="this:CountResultByStatus($Females,'Pass')"/>
<xsl:variable name="FemaleFail" select="this:CountResultByStatus($Females, 'Fail')"/>
<xsl:variable name="Males" select="current-group()[ancestor::r:Report_Entry/r:Gender = 'Male']"/>
<xsl:variable name="MalePass" select="this:CountResultByStatus($Males,'Pass')"/>
<xsl:variable name="MaleFail" select="this:CountResultByStatus($Males,'Fail')"/>
<Total_Male><xsl:value-of select="count($Males)"/></Total_Male>
<Male_Pass><xsl:value-of select= "$MalePass"/></Male_Pass>
<Male_Fail><xsl:value-of select= "$MaleFail"/></Male_Fail>
<Total_Female><xsl:value-of select="count($Females)"/></Total_Female>
<Female_Pass><xsl:value-of select="$FemalePass"/> </Female_Pass>
<Female_Fail><xsl:value-of select="$FemaleFail"/></Female_Fail>
<xsl:value-of select="$linefeed"/>
</xsl:for-each-group>
</xsl:for-each-group>
</Root>
</xsl:template>
<xsl:function name="this:CountResultByStatus" as="xs:integer">
<xsl:param name="People" as="element()*"/>
<xsl:param name="Status" as="xs:string"/>
<xsl:sequence select="count($People[../r:Test_Status = $Status])"/>
</xsl:function>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/a9GPfH/2
Upvotes: 0