XSLT 3.0嵌套分组和计数字符串值

问题描述 投票:0回答:1

我有工作,并且有多个工作测试,必须按性别进行“通过”和“失败”计数。如果当前每个工作有一个工作测试,则我当前的代码正在运行。如果任何工作有多个工作测试,则计数为不正确这是我用xml和xslt代码编写的小提琴。job1计数正确,因为它只有一个测试。Job2计数不正确,因为它有多个jobtests。

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

预期总数Job,job_Test,Ma_Pass,Ma_Fail,Fem_Pass,Fem_Fail职位1,应用评估,5,3,9,2职位2,应用评估,304,2,131,0作业2,适用性测试,127,118,53,54

非常感谢任何帮助。

xslt-2.0 nested-loops counting xslt-grouping xslt-3.0
1个回答
0
投票

您需要在内部分组中对嵌套的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

© www.soinside.com 2019 - 2024. All rights reserved.