|
Subject: RE: [xsl] for-each-loop case From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 8 Apr 2005 08:24:47 +0100 |
> I am pretty new to XSLT2.0. My question is how to get desired output
> xml from following input by just using for-each-group. I can do it now
> with temporary tree but that means two phases transform:
A two phase transform is often a good thing - it keeps your code modular and
reusable!
>
> input:
It's really helpful to readers to add some indentation:
>
> <scores>
> <devision id="1">
> <student name="Tiger">
> <subject name="English">
> <score>98</score>
> </subject>
> <subject name="Math">
> <score>102</score>
> </subject>
> <subject name="History">
> <score>100</score>
> </subject>
> </student>
> <student name="Jack">
...
> </student>
> </devision>
> <devision id="2">
...
> </devision>
> </scores>
>
> Desired output :
>
> <?xml version="1.0" encoding="UTF-8"?>
> <scores>
> <subject name="English">
> <devision id="1">
> <student name="Tiger">
> <score>98</score>
> </student>
> <student name="Jack">
> <score>88</score>
> </student>
> </devision>
...
> </subject>
> </scores>
>
An unusual one!
I think this is:
<xsl:for-each-group select="//subject" group-by="@name">
<subject name="{current-grouping-key()}">
<xsl:variable name="students-of-subject"
select="current-group()/parent::student"/>
<xsl:for-each-group select="current-group()/ancestor::devision"
group-by="@id">
<devision id="{current-grouping-key()}">
<xsl:copy-of select="$students-of-subject intersect
current-group()/student"/>
</
</
</
</
Not tested.
Michael Kay
http://www.saxonica.com/
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] for-each-loop case, Kai Xu | Thread | [xsl] adding namespaces to result n, omprakash . v |
| Re: [xsl] Test For Numeric Values?, James Fuller | Date | [xsl] adding namespaces to result n, omprakash . v |
| Month |