|
Subject: Re: [xsl] Grouping based on key result From: Ganesh Babu N <nbabuganesh@xxxxxxxxx> Date: Thu, 5 Mar 2009 16:17:17 +0530 |
Here is my XML content:
<author-group>
<author>
<given-name>T.</given-name>
<surname>Miwa</surname>
<cross-ref refid="aff2"><sup>b</sup></cross-ref>
</author>
<author>
<given-name>T.</given-name>
<surname>Nomura</surname>
<cross-ref refid="aff2"><sup>b</sup></cross-ref>
</author>
<author>
<given-name>J.</given-name>
<surname>Sakakibara</surname>
<cross-ref refid="aff1"><sup>a</sup></cross-ref>
</author>
<author>
<given-name>H.</given-name>
<surname>Shintani</surname>
<cross-ref refid="aff1"><sup>a</sup></cross-ref>
</author>
<author>
<initials>B.E.</initials>
<given-name>B.E.</given-name>
<surname>Ungerechts</surname>
<cross-ref refid="aff3"><sup>c</sup></cross-ref>
</author>
<affiliation id="aff1"><label>a</label><textfn>Graduate School of
Systems and Information Engineering, University of Tsukuba, Tsukuba
305-8573, Japan</textfn></affiliation>
<affiliation id="aff2"><label>b</label><textfn>Graduate School of
Comprehensive Human Sciences, University of Tsukuba, Tsukuba 305-8573,
Japan</textfn></affiliation>
<affiliation id="aff3"><label>c</label><textfn>Institute of Sport
Sciences, University of Bielefeld, D-33615 Bielefeld,
Germany</textfn></affiliation>
My code1:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:f="data:,f"
exclude-result-prefixes="xs f">
<xsl:output indent="yes" encoding="US-ASCII"/>
<xsl:strip-space elements="*"/>
<xsl:key name="country" match="affiliation/textfn"
use="parent::affiliation/@id"/>
<xsl:template match="author-group">
<xsl:for-each-group select="author" group-adjacent="f:country(.)">
<xsl:apply-templates select="current-group()"/>
(<xsl:value-of select="current-grouping-key()"/>)
</xsl:for-each-group>
</xsl:template>
<xsl:template match="author">
<xsl:choose>
<xsl:when test="[position() = last() and position() != 1]">
<xsl:text> and </xsl:text>
<author><xsl:value-of select="given-name,surname"/></author>
</xsl:when>
<xsl:when test="position() != 1">
<xsl:text>, </xsl:text>
<author><xsl:value-of select="given-name,surname"/></author>
</xsl:when>
<xsl:otherwise>
<author><xsl:value-of select="given-name,surname"/></author>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:function name="f:country" as="xs:string">
<xsl:param name="a" as="element()"/>
<xsl:choose>
<xsl:when test="$a/cross-ref">
<xsl:sequence select="key('country',
$a/cross-ref/@refid,root($a))/tokenize(.,',\s+')[last()]"/>
</xsl:when>
<xsl:otherwise>
<xsl:sequence
select="$a/following-sibling::affiliation[1]/tokenize(.,',\s+')[last()]"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
</xsl:stylesheet>
With the code I am getting the out put as :
<author>T.Miwa</author>, <author>T.Nomura</author>,
<author>J.Sakakibara</author> and <author>H.Shintani</author> (Japan)
<author>B.E.Ungerechts</author> (Germany)
But the desired output is:
<author>T.Miwa</author>, <author>T.Nomura</author>,
<author>J.Sakakibara</author>, <author>H.Shintani</author> (Japan)
and <author>B.E.Ungerechts</author> (Germany)
Means irrespective of the grouping the "and" should be placed before
the last author.
My Code 2:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:f="data:,f"
exclude-result-prefixes="xs f">
<xsl:output indent="yes" encoding="US-ASCII"/>
<xsl:strip-space elements="*"/>
<xsl:key name="country" match="affiliation/textfn"
use="parent::affiliation/@id"/>
<xsl:template match="author-group">
<xsl:if test="author[position() = last() and position() != 1]">
<xsl:text> and </xsl:text>
<xsl:for-each-group select="author" group-adjacent="f:country(.)">
<xsl:apply-templates select="current-group()"/>
(<xsl:value-of select="current-grouping-key()"/>)
</xsl:for-each-group>
</xsl:if>
</xsl:template>
<xsl:template match="author">
<author><xsl:value-of select="given-name,surname"/></author>
</xsl:template>
<xsl:function name="f:country" as="xs:string">
<xsl:param name="a" as="element()"/>
<xsl:choose>
<xsl:when test="$a/cross-ref">
<xsl:sequence select="key('country',
$a/cross-ref/@refid,root($a))/tokenize(.,',\s+')[last()]"/>
</xsl:when>
<xsl:otherwise>
<xsl:sequence
select="$a/following-sibling::affiliation[1]/tokenize(.,',\s+')[last()]"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
</xsl:stylesheet>
With the code I am getting the out put as :
and <author>T.Miwa</author>, <author>T.Nomura</author>,
<author>J.Sakakibara</author> <author>H.Shintani</author> (Japan)
<author>B.E.Ungerechts</author> (Germany)
But the desired output is:
<author>T.Miwa</author>, <author>T.Nomura</author>,
<author>J.Sakakibara</author>, <author>H.Shintani</author> (Japan)
and <author>B.E.Ungerechts</author> (Germany)
Please help me in achieving the desired output.
Regards,
Ganesh
On Thu, Mar 5, 2009 at 3:01 PM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
> Please show your code. It's very hard to debug your code based on an
English
> description of your code, it's much easier to spot your mistakes if we can
> see the actual code.
>
> Michael Kay
> http://www.saxonica.com/
>
>> -----Original Message-----
>> From: Ganesh Babu N [mailto:nbabuganesh@xxxxxxxxx]
>> Sent: 05 March 2009 09:18
>> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
>> Subject: Re: [xsl] Grouping based on key result
>>
>> Thanks David,
>>
>> Another problem pertaining to the same solution.
>>
>> I have 5 authors. 4 belongs Japan and 1 belongs to Germany
>>
>> I need to place "and" before the last author. i.e. before the
>> 5th author
>>
>> I have implemented this in author template. position[last()]
>> and position() != 1
>>
>> As we are applying the author template inside grouping, the
>> "and" is coming before 4 th author and not before 5th author.
>>
>> Desired output:
>>
>> <author>T.Miwa</author><author>T.Nomura</author><author>J.Saka
> kibara</author><author>H.Shintani</author>
>> (Japan) and <author>B.E.Ungerechts</author> (Germany)
>>
>>
>> Output got:
>>
>> <author>T.Miwa</author><author>T.Nomura</author><author>J.Saka
> kibara</author>
>> and <author>H.Shintani</author>
>> (Japan)<author>B.E.Ungerechts</author> (Germany)
>>
>> I have also tried putting this condition outside
>> for-each-group but it is not working.
>>
>> The script should place the "and" irrespective of grouping.
>>
>> Please help me how to achieve desired output.
>>
>>
>> Regards,
>> Ganesh
>>
>> On Tue, Mar 3, 2009 at 6:57 PM, David Carlisle
>> <davidc@xxxxxxxxx> wrote:
>> >
>> >
>> >> For one there is cross-ref and for another there is no. In these
>> >> cases also it should do the grouping.
>> >
>> >
>> > <xsl:function name="f:country" as="xs:string">
>> > <xsl:param name="a" as="element()"/>
>> > <xsl:choose>
>> > <xsl:when test="$a/cross-ref">
>> > <xsl:sequence select="key('country',
>> > $a/cross-ref/@refid,root($a))/tokenize(.,',\s+')[last()]"/>
>> > </xsl:when>
>> > <xsl:otherwise>
>> > <xsl:sequence
>> >
>> select="$a/following-sibling::affiliation[1]/tokenize(.,',\s+')[last()
>> > ]"/>
>> > </xsl:otherwise>
>> > </xsl:choose>
>> > </xsl:function>
>> >
>> >
>> ______________________________________________________________________
>> > __ The Numerical Algorithms Group Ltd is a company registered in
>> > England and Wales with company number 1249803. The
>> registered office
>> > is:
>> > Wilkinson House, Jordan Hill Road, Oxford OX2 8DR, United Kingdom.
>> >
>> > This e-mail has been scanned for all viruses by Star. The
>> service is
>> > powered by MessageLabs.
>> >
>> ______________________________________________________________________
>> > __
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| RE: [xsl] Grouping based on key res, Michael Kay | Thread | Re: [xsl] Grouping based on key res, Ganesh Babu N |
| RE: [xsl] Grouping based on key res, Michael Kay | Date | Re: [xsl] getting combo value,not t, himanshu padmanabhi |
| Month |