XSLT 3.0 Вложенная группировка и подсчет строковых значений - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть задания и несколько тестов на работу, для которых мне нужно подсчитать «проход» и «провал» по полу. Мой текущий код работает, если для каждой работы есть один тест на работу. Если на любой работе есть несколько тестов на работу, подсчитывается неверны. Вот моя скрипка с счетами xml и xslt code.job 1 правильные, так как он имеет только один тест. Счет 2 заданий неверен, так как имеет несколько тестов.

https://xsltfiddle.liberty-development.net/a9GPfH/1

Ожидаемые итоги
Job, job_Test, Ma_Pass, Ma_Fail, Fem_Pass, Fem_Fail
Job 1, оценка приложения, 5, 3, 9, 2
Job 2, оценка приложения, 304, 2, 131, 0
Задание 2, Тест на пригодность, 127, 118, 53, 54

Любая помощь высоко ценится.

1 Ответ

0 голосов
/ 21 апреля 2020

Вам необходимо сгруппировать вложенные Job_Test во внутреннюю группу:

<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

...