我有工作,并且有多个工作测试,必须按性别进行“通过”和“失败”计数。如果当前每个工作有一个工作测试,则我当前的代码正在运行。如果任何工作有多个工作测试,则计数为不正确这是我用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
非常感谢任何帮助。
您需要在内部分组中对嵌套的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="'
'"/>
<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>