469,267 Members | 1,029 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,267 developers. It's quick & easy.

XSLT: Grouping and Count

Hello All,

I'm new to XSLT and XML, so please excuse the basic question. I'm trying to apply a number of conditional xsl:if statements to xsl:for-each-group, but it does not filter out the results. I'm assuming this is because the xsl:for-each-group is defining my group and not allowing the ifs to break it apart?

Here's a sample of my XML, there are about 1200 entries of Student's, so here's one:
Expand|Select|Wrap|Line Numbers
  1. <Census>
  2. <Student Id="100000" ProgramType="Freshman FX" AdmitTerm="N/A">
  3. <Gender>Female</Gender>
  4. <Ethnicity>Unknown</Ethnicity>
  5. <BirthDate>31900</BirthDate>
  6. <Citizenship>N/A</Citizenship>
  7. <Degree>Bachelor of Arts</Degree>
  8. <Major>Business, Marketing</Major>
  9. <DegreeTWO>N/A</DegreeTWO>
  10. <MajorTWO>N/A</MajorTWO>
  11. <Advisor>Tom</Advisor>
  12. <FinHSGPA>N/A</FinHSGPA>
  13. <TotCredits UG="2" Grad="3" Load="18" TransferCredits="N/A"/>
  14. <PermAddress State="CA">
  15. <City>Fremont</City>
  16. </PermAddress>
  17. <SAT1 type="N/A">
  18. <Score>N/A</Score>
  19. </SAT1>
  20. <SAT2 type="N/A">
  21. <Score>N/A</Score>
  22. </SAT2>
  23. <Classification>trad undergrad</Classification>
  24. </Student>
  25. </Census>

Here's my XSL that I'm trying to apply:

Expand|Select|Wrap|Line Numbers
  1. <h3>Students by Gender</h3>
  2. <xsl:for-each-group select="Census/Student" group-by="Gender">
  3. <xsl:sort select="current-grouping-key()"/>
  4. <xsl:if test="(Gender='Female') and
  5. (Advisor='Tom')">
  6. <p>Number of Students Who Are:
  7. <b>
  8. <xsl:value-of select="current-grouping-key()"/>
  9. </b> is
  10. <xsl:value-of select="count(current-group())"/>
  11. </p>
  12. </xsl:if>
  14. </xsl:for-each-group>

My Desired Output will give me the count of all females, who have Tom as an advisor, as grouped by their Gender. Currently, it's not applying any of the "if" statements so it's giving me a result of 852 females, rather than the expected value of 8.
Jul 6 '09 #1
3 10696
8,651 Expert Mod 8TB
need to read through the XSLT 2.0 specs, this will take some time so I can't immediately answer.
Jul 7 '09 #2
2,057 Expert 2GB
The if is applied to the group. The first one of them has an advisor element Tom. If you want to filter the grouped nodes, you'd want something like this instead: Remove the if clause, and put in a conditional.

<xsl:value-of select="count(current-group()[Advisor='Tom'])"/>

With your current code, if you change the advisor of the first female (to not Tom), you would get nothing.
Or, another possibility is prefiltering in the for-each-group clause:
<xsl:for-each-group select="Census/Student[Advisor='Tom']" group-by="Gender">
Jul 7 '09 #3
Thanks jkmyoung that works perfectly - both options.
Jul 7 '09 #4

Post your reply

Sign in to post your reply or Sign up for a free account.

Similar topics

2 posts views Thread by Tristan Miller | last post: by
6 posts views Thread by Per Jørgen Vigdal | last post: by
1 post views Thread by Mark | last post: by
2 posts views Thread by John Wilkinson | last post: by
reply views Thread by Terious | last post: by
reply views Thread by Leira | last post: by
reply views Thread by suresh191 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.