【问题标题】:Group and Count data分组和计数数据
【发布时间】:2020-07-10 11:23:50
【问题描述】:

我正在尝试根据测试复习的不同步骤计算每个学生评估的计数。学生考试评价有申请评价、笔试、小组面试、面试等多个层次。我在每个级别都找到了基于性别的计数。

xml:

<xd:StudentData xmlns:xd="urn:com.student.report/student_test">
<xd:StudentRecord>
<xd:StudentRequisition xd:Descriptor="1858 Economics"></xd:StudentRequisition>
<xd:StudentStatus xd:Descriptor="Pass"></xd:StudentStatus>
<xd:StudentApplication xd:Descriptor="1858 Economics"></xd:StudentApplication>
<xd:StudentID>S-1</xd:StudentID>
<xd:Gender xd:Descriptor="Male"></xd:Gender>
<xd:StudentDate>2020-01-01-12:00</xd:StudentDate>
<xd:Total_Score>75</xd:Total_Score>
<xd:ProfileStudentTestGroup>
<xd:StudentTest xd:Descriptor="Student Evaluation"></xd:StudentTest>
<xd:StudentTest_Status xd:Descriptor="Pass"></xd:StudentTest_Status>
<xd:StudentTest_Date>2020-01-31-12:00</xd:StudentTest_Date>
<xd:StudentTest_Result_Score>75</xd:StudentTest_Result_Score>
</xd:ProfileStudentTestGroup>
</xd:StudentRecord>
<xd:StudentRecord>
<xd:StudentRequisition xd:Descriptor="1500 Social Service"></xd:StudentRequisition>
<xd:StudentStatus xd:Descriptor="Fail"></xd:StudentStatus>
<xd:StudentApplication xd:Descriptor="1500 Social Service"></xd:StudentApplication>
<xd:StudentID>S-3</xd:StudentID>
<xd:Gender xd:Descriptor="Female"></xd:Gender>
<xd:StudentDate>2020-01-01-12:00</xd:StudentDate>
<xd:Total_Score>65</xd:Total_Score>
<xd:ProfileStudentTestGroup>
<xd:StudentTest xd:Descriptor="Student Evaluation"></xd:StudentTest>
<xd:StudentTest_Status xd:Descriptor="Pass"></xd:StudentTest_Status>
<xd:StudentTest_Date>2020-01-31-12:00</xd:StudentTest_Date>
<xd:StudentTest_Result_Score>65</xd:StudentTest_Result_Score>
</xd:ProfileStudentTestGroup>
</xd:StudentRecord>
<xd:StudentRecord>
<xd:StudentRequisition xd:Descriptor="1500 Social Service"></xd:StudentRequisition>
<xd:StudentStatus xd:Descriptor="Fail"></xd:StudentStatus>
<xd:StudentApplication xd:Descriptor="1500 Social Service"></xd:StudentApplication>
<xd:StudentID>S-4</xd:StudentID>
<xd:Gender xd:Descriptor="Female"></xd:Gender>
<xd:StudentDate>2020-01-01-12:00</xd:StudentDate>
<xd:Total_Score>67</xd:Total_Score>
<xd:ProfileStudentTestGroup>
<xd:StudentTest xd:Descriptor="Student Evaluation"></xd:StudentTest>
<xd:StudentTest_Status xd:Descriptor="Pass"></xd:StudentTest_Status>
<xd:StudentTest_Date>2020-01-31-12:00</xd:StudentTest_Date>
<xd:StudentTest_Result_Score>67</xd:StudentTest_Result_Score>
</xd:ProfileStudentTestGroup>
</xd:StudentRecord>
<xd:StudentRecord>
<xd:StudentRequisition xd:Descriptor="1858 Economics"></xd:StudentRequisition>
<xd:StudentStatus xd:Descriptor="Pass"></xd:StudentStatus>
<xd:StudentApplication xd:Descriptor="1858 Economics"></xd:StudentApplication>
<xd:StudentID>S-7</xd:StudentID>
<xd:Gender xd:Descriptor="Male"></xd:Gender>
<xd:StudentDate>2020-01-01-12:00</xd:StudentDate>
<xd:Total_Score>85</xd:Total_Score>
<xd:ProfileStudentTestGroup>
<xd:StudentTest xd:Descriptor="Student Evaluation"></xd:StudentTest>
<xd:StudentTest_Status xd:Descriptor="Pass"></xd:StudentTest_Status>
<xd:StudentTest_Date>2020-01-31-12:00</xd:StudentTest_Date>
<xd:StudentTest_Result_Score>85</xd:StudentTest_Result_Score>
</xd:ProfileStudentTestGroup>
</xd:StudentRecord>
</xd:StudentData>

xslt:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet exclude-result-prefixes="xsl" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xd="urn:com.student.report/student_test">

<xsl:iterate select="StudentData/StudentRecord">

    <xsl:param name="male_pass_count" select="0.00" as="xs:integer"/>
    <xsl:param name="male_fail_count" select="0.00" as="xs:integer"/>
    <xsl:param name="female_pass_count" select="0.00" as="xs:integer"/>
    <xsl:param name="female_fail_count" select="0.00" as="xs:integer"/>
    <xsl:param name="StudentTest" select="{/xd:StudentTest/@xd:Descriptor}" as="xs:string"/>

    <xsl:choose>

    <xsl:when test="{/xd:Gender/@xd:Descriptor} = 'Male'">

        <xsl:if test="{/xd:StudentTest_status/@xd:Descriptor} = 'Pass'">
        <xsl:with-param name="male_pass_count" select="$male_pass_count + 1"/>
        </xsl:if>

        <xsl:if test="{/xd:StudentTest_status/@xd:Descriptor} = 'Fail'">
        <xsl:with-param name="male_fail_count" select="$male_fail_count + 1"/>
        </xsl:if>

    </xsl:when> 

    <xsl:when test="{/xd:Gender/@xd:Descriptor} = 'Female'">

        <xsl:if test="{/xd:StudentTest_status/@xd:Descriptor} = 'Pass'">
        <xsl:with-param name="female_pass_count" select="$female_pass_count + 1"/>
        </xsl:if>

        <xsl:if test="{/xd:StudentTest_status/@xd:Descriptor} = 'Fail'">
        <xsl:with-param name="female_fail_count" select="$female_fail_count + 1"/>
        </xsl:if>

    </xsl:when> 

    </xsl:choose>

<xsl:on-completion>

    <student id="{$StudentTest}">
        <male_pass_count>{$male_pass_count}</male_pass_count>
        <male_fail_count>{$male_fail_count}</male_fail_count>
        <female_pass_count>{$female_pass_count}</female_pass_count>
        <female_fail_count>{$female_fail_count}</female_fail_count>

    </student>

</xsl:on-completion>

</xsl:iterate>

输出:

StudentRequisition  StudentTest             MalePass    MaleFail    FemalePass  FemaleFail
1858 Economics      Application evaluation  22          0           10          0
1858 Economics      Interview               6           11          0           5
1858 Economics      Written Test            2           0           2           0
1500 Social Service Application evaluation  10          12          10          12
1500 Social Service Interview               0           0           0           0
1500 Social Service Written Test            0           0           0           0

【问题讨论】:

  • 您使用了 XSLT 2.0 版的标签,但是您使用了 xsl:iterate,它仅在 XSLT 3.0 中可用。此外,您说您想要分组,但您不使用现有的for-each-group。所以请澄清一下。
  • @MartinHonnen 我在 XSLT 3.0 中使用 xsl:iterate 进行了尝试,但无法完成。我想将它们分组到 XSLT 2.0 中。谢谢。

标签: xslt-2.0 xslt-grouping


【解决方案1】:

如果您使用 XSLT 3 处理器(正如您使用它 xsl:iterate 所指示的那样),您可以在我认为的申请和测试上使用带有复合分组键的 for-each-group

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="urn:com.student.report/student_test"
    xmlns:xd="urn:com.student.report/student_test"
    expand-text="yes"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:output indent="yes" method="html" html-version="5"/>

  <xsl:template match="/">
      <html>
          <head>
              <title>Grouping example</title>
          </head>
          <body>
              <xsl:apply-templates/>
          </body>
      </html>
  </xsl:template>

  <xsl:template match="StudentData">
      <table>
          <thead>
              <tr>
                  <th>Student Requisition</th>
                  <th>Student Test</th>
                  <th>Male Pass</th>
                  <th>Male Fail</th>
                  <th>Female Pass</th>
                  <th>Female Fail</th>
              </tr>
          </thead>
          <tbody>
              <xsl:for-each-group select="StudentRecord" composite="yes" group-by="StudentRequisition/@xd:Descriptor, ProfileStudentTestGroup/StudentTest/@xd:Descriptor">
                  <tr>
                      <td>{current-grouping-key()[1]}</td>
                      <td>{current-grouping-key()[2]}</td>
                      <td>{count(current-group()[Gender/@xd:Descriptor = 'Male'][ProfileStudentTestGroup/StudentTest_Status[@xd:Descriptor = 'Pass']])}</td>
                      <td>{count(current-group()[Gender/@xd:Descriptor = 'Male'][ProfileStudentTestGroup/StudentTest_Status[@xd:Descriptor = 'Fail']])}</td>
                      <td>{count(current-group()[Gender/@xd:Descriptor = 'Female'][ProfileStudentTestGroup/StudentTest_Status[@xd:Descriptor = 'Pass']])}</td>
                      <td>{count(current-group()[Gender/@xd:Descriptor = 'Female'][ProfileStudentTestGroup/StudentTest_Status[@xd:Descriptor = 'Fail']])}</td>
                  </tr>
              </xsl:for-each-group>
          </tbody>
      </table>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/93dFepD

如果您使用 XSLT 2 处理器(不支持复合分组键),则连接两个值或嵌套两个 for-each-group 指令。

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多