Sandyz
Sandyz

Reputation: 1

XSLT 3.0 Nested grouping and counting string values

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

Answers (1)

Martin Honnen
Martin Honnen

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="'&#xD;&#xA;'"/>

            <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

Related Questions